한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

게임 렉 백서 › L8 소켓과 프로토콜

Nagle 알고리즘 + 지연 ACK Nagle + delayed ACK (TCP_NODELAY off)

원인 ID sk-nagle · 주 담당 게임개발팀·서버 개발 · 함께 게임개발팀·클라이언트 개발

그림과 실험이 있는 원본 카드로 열기 →

작은 패킷을 모아 보내는 Nagle 알고리즘과 ACK를 늦게 보내는 지연 ACK가 맞물려, 메시지를 나눠 쓸 때마다 40~200ms씩 지연됩니다.

왜 TCP_NODELAY를 켜지 않은 채 작은 메시지를 나눠 씀 → 그러면 보내는 쪽은 ACK를 기다리고 받는 쪽은 ACK를 늦게 보냄 → 화면에서는 회선 핑은 낮은데 모든 행동이 일정하게 굼뜬 입력 지연

증상
입력 지연
요인
지연
누가 겪나
서버 전체, 나만
언제
항상, 특정 행동을 할 때
담당
주 담당 게임개발팀·서버 개발 · 함께 게임개발팀·클라이언트 개발
게임개발팀 할 일
서버: TCP_NODELAY 켜기, 한 틱 동안의 메시지를 모아 한 번에 쓰기, 받는 쪽 지연 ACK를 끄는 방법(리눅스 TCP_QUICKACK은 잠깐만 유지, 윈도우는 PC마다 레지스트리 수정)은 게임이 확실히 통제할 수 없으니 기대지 않기. 클라이언트: TCP_NODELAY 켜기, 한 프레임 동안의 메시지를 모아 한 번에 쓰기.
수치 감각
지연 ACK는 리눅스가 보통 40ms(상황에 따라 최대 200ms)입니다. 윈도우는 예전 버전이 200ms였고 요즘 버전은 40ms입니다(윈도우 서버 2019 기본 템플릿 40ms). 지연 ACK는 받는 쪽 OS가 정하므로, 서버가 Nagle을 켠 채 메시지를 나눠 보내면 받는 PC에 따라 40~200ms씩 지연될 수 있습니다.
그래프에서는
처음부터 늘 높음 · 행동 응답 시간(게임 안 RTT)
확인할 곳
서버 쪽 패킷 캡처(tcpdump·Wireshark)에서 요청·응답 사이의 간격을 보고, 서버·클라이언트 코드가 TCP_NODELAY를 켜는지 확인
이러면 맞음
회선 핑은 낮은데 작은 패킷 사이에 40ms(윈도우 예전 버전은 200ms) 안팎의 공백이 반복되고, 그 공백은 상대의 ACK가 온 직후 끝남. TCP_NODELAY를 켜면 사라짐
이러면 아님
응답 간격이 회선 핑과 비슷하면 이 원인이 아님. 게임 서버가 응답을 늦게 만들면 서버 처리 쪽(“메시지 큐 적체”)
확인 수단
인프라 도구로 확인(게임 코드 불필요)

출처

  1. RFC 9293: Transmission Control Protocol (TCP) IETF
    Nagle은 ACK를 못 받은 데이터가 있으면 작은 데이터를 모아 둠, 연결마다 끌 수 있어야 함, 지연 ACK는 0.5초 미만, 둘이 맞물리는 문제
  2. include/net/tcp.h (Linux v6.12) Linux kernel
    리눅스 지연 ACK 최소 TCP_DELACK_MIN(HZ/25 = 40ms), 최대 TCP_DELACK_MAX(HZ/5 = 200ms)
  3. TCP improvements in the Windows network stack (IETF 98 TCPM) Microsoft
    윈도우 기본 지연 ACK 타임아웃을 40ms로 바꿈(2017년 발표)
  4. TCP Templates for Windows Server 2019 – How to tune your Windows Server Transports (Advanced users only 😉) Microsoft
    서버 2019 템플릿 DelayedAckTimeout 40ms, MaxSynRetransmissions 2, InitialRto 3000ms
  5. Design issues - Sending small data segments over TCP with Winsock Microsoft
    예전 윈도우 TCP는 데이터를 받으면 200ms 지연 ACK 타이머를 걸고, Nagle은 기본으로 켜져 있어 작은 패킷이 ACK를 기다림, TCP_NODELAY로 해결

함께 보면 좋은 원인

같은 층: L8 소켓과 프로토콜

같은 증상(입력 지연)의 다른 층 원인

그림과 실험이 있는 원본 카드 보기