SSH 게임, 키 입력 1번에 100개 패킷? 성능 저하의 원인과 해결책

by DD
4개월 전
조회수 38

SSH를 통해 게임을 개발하던 중, 키 입력(Keystroke) 1회당 100개 패킷 전송 문제 발생

원인은 SSH의 키스트로크 타이밍 난독화(Keystroke Timing Obfuscation) 기능으로 밝혀짐

성능 개선을 위해 go-crypto 라이브러리 패치(Patch)를 통해 해당 기능 비활성화 시도

커뮤니티에서는 보안(Security)과 성능(Performance) 사이의 트레이드오프(Trade-off)에 대한 논의가 진행됨

SSH 키스트로크 난독화(Keystroke Obfuscation)의 문제점

게임을 SSH를 통해 전송하는 과정에서 키스트로크 타이밍 난독화(Keystroke Obfuscation) 기능이 성능 저하의 주범으로 지목되었다. 이 기능은 키 입력 간격을 무작위로 조정하여 키 입력 패턴을 숨기지만, 게임과 같이 낮은 지연 시간(Low Latency)이 중요한 환경에서는 불필요한 오버헤드를 발생시킨다. 특히, 20ms 간격으로 다량의 'chaff' 패킷을 전송하여 대역폭(Bandwidth) 소비를 증가시키는 것으로 나타났다.

성능 개선을 위한 go-crypto 라이브러리 패치

저자는 SSH 성능 개선을 위해 go-crypto 라이브러리에서 [email protected] 확장(Extension)을 비활성화하는 패치를 적용했다. 이 패치는 키스트로크 난독화 기능을 담당하는 SSH2_MSG_PING 메시지 전송을 막아 CPU 사용량(CPU Usage)을 50% 이상 감소시키는 효과를 보였다. 하지만, 라이브러리 포킹(Forking)에 따른 유지보수(Maintenance)보안(Security) 문제에 대한 우려도 제기되었다.

커뮤니티의 다양한 해결책 제시

커뮤니티에서는 SSH 성능 문제를 해결하기 위한 다양한 대안이 제시되었다. TCP_CORK를 사용하여 패킷 수를 줄이거나, TCP_NODELAY를 비활성화하여 지연 시간을 줄이는 방법 등이 제안되었다. 또한, 보안이 중요하지 않은 환경에서는 텔넷(Telnet)과 같은 프로토콜을 사용하는 것도 고려해 볼 수 있다는 의견도 나왔다. 하지만, 이러한 방법들은 보안(Security)과 성능(Performance) 사이의 트레이드오프(Trade-off)를 고려해야 한다.

LLM을 활용한 디버깅 과정

저자는 문제 해결 과정에서 Claude Code와 같은 LLM을 활용하여 tcpdump 분석을 수행했다. LLM은 pcap 파일 분석을 통해 문제의 원인을 파악하는 데 도움을 주었지만, SSH의 일반적인 동작에 대한 오해로 인해 정확한 정보를 제공하지 못하는 경우도 있었다. LLM을 활용한 디버깅은 유용하지만, 결과에 대한 비판적 사고(Critical Thinking)전문 지식(Expert Knowledge)을 병행해야 함을 시사한다.

Why does SSH send 100 packets per keystroke?