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

게임 렉 백서 › TCP 재전송의 근본 원인

순서 뒤바뀜으로 인한 불필요한 빠른 재전송 Reordering triggers spurious fast retransmit

원인 ID rt-reorder · 주 담당 인프라팀·네트워크 인프라 · 함께 인프라팀·서버 인프라

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

여러 경로나 묶인 링크를 지나며 패킷 순서가 바뀌면, 받는 쪽이 중복 ACK로 “빠진 패킷 있음”을 알리고 보내는 쪽은 멀쩡한 패킷을 다시 보냅니다.

왜 패킷 단위로 경로를 나누는 장비, 패킷 단위로 나눠 싣는 LAG(링크 묶음), 경로가 바뀌는 순간이 순서를 뒤섞음 → 그러면 뒤 패킷이 먼저 도착해 중복 ACK 3개가 쌓임 → 빠른 재전송 → 화면에서는 드문드문 오가는 게임 패킷은 거의 영향 없음. 사람 많은 곳의 큰 업데이트와 패치 다운로드가 느려지고 가끔 뚝뚝 끊김

증상
뚝뚝 끊김, 입력 지연
요인
지터
누가 겪나
특정 지역·통신사, 서버 전체
언제
항상, 사람이 몰릴 때
담당
주 담당 인프라팀·네트워크 인프라 · 함께 인프라팀·서버 인프라
인프라팀 할 일
네트워크: 패킷 단위 분산 대신 연결 단위 분산(ECMP·LAG를 주소·포트 해시로). 서버 장비·OS: RACK(시간 기준 손실 판단, 순서 뒤바뀜에 강함. DSACK으로 불필요한 재전송을 감지하면 순서 뒤바뀜 허용 폭을 자동으로 늘림) 사용, 리눅스가 연결마다 자동으로 추정한 순서 뒤바뀜 정도 확인(ss -ti의 reordering 값, 시작값은 tcp_reordering=3).
그래프에서는
처음부터 늘 높음 · 순서 뒤바뀜 감지 수, DSACK 수신 수
확인할 곳
nstat의 TcpExtTCPSACKReorder·TcpExtTCPTSReorder(순서 뒤바뀜을 감지한 횟수)와 TcpExtTCPDSACKRecv를 보고, 연결별로는 ss -ti의 reordering(3이 아니면 표시)·reord_seen을 봄. 패킷 캡처에서는 Wireshark 필터 tcp.analysis.out_of_order를 씀
이러면 맞음
순서 뒤바뀜 카운터와 DSACK이 시간대와 상관없이 꾸준히 오르고 특정 경로·장비를 지나는 연결의 reordering 값이 3보다 커져 있음. 받는 쪽 캡처에서 뒤 패킷이 먼저 오고 앞 패킷도 곧 도착함
이러면 아님
순서 뒤바뀜 카운터는 그대로이고 TcpExtTCPLostRetransmit이 늘면 실제 손실. RTT가 튀는 순간에만 DSACK이 늘면 “지연 급등으로 인한 불필요한 재전송”
확인 수단
인프라 도구로 확인(게임 코드 불필요)

출처

  1. RFC 2991: Multipath Issues in Unicast and Multicast Next-Hop Selection IETF
    패킷 단위로 경로를 나누면 순서가 바뀌고 뒤 패킷 3개 이상이 먼저 오면 TCP가 불필요한 빠른 재전송을 함
  2. RFC 2992: Analysis of an Equal-Cost Multi-Path Algorithm IETF
    흐름을 구분하는 헤더 필드의 해시로 경로를 고르는 ECMP(흐름 단위 분산)
  3. RFC 5681: TCP Congestion Control IETF
    세 번째 중복 ACK에서 빠른 재전송
  4. RFC 8985: The RACK-TLP Loss Detection Algorithm for TCP IETF
    RACK은 시간 기준으로 손실을 판단해 순서 뒤바뀜에 강하고 DSACK을 받으면 순서 뒤바뀜 허용 시간(reo_wnd)을 늘림
  5. IP Sysctl Linux kernel
    tcp_reordering 시작값 3(연결마다 tcp_max_reordering까지 자동 조정), tcp_recovery의 RACK 설정
  6. misc/ss.c iproute2
    ss -ti는 연결의 reordering 값이 기본값 3과 다를 때 reordering:값을, 순서 뒤바뀜을 겪은 적이 있으면 reord_seen:횟수를 표시
  7. SNMP counter Linux kernel
    TcpExtTCPSACKReorder·TcpExtTCPTSReorder(순서 뒤바뀜 감지), TcpExtTCPDSACKRecv(받은 DSACK 수), TcpExtTCPLostRetransmit(다시 보낸 패킷을 또 잃음)
  8. include/uapi/linux/tcp.h Linux kernel
    tcp_info의 tcpi_reord_seen: 연결이 겪은 순서 뒤바뀜 횟수
  9. Display Filter Reference: Transmission Control Protocol Wireshark
    tcp.analysis.out_of_order 표시 필터

함께 보면 좋은 원인

같은 층: TCP 재전송의 근본 원인

같은 증상(뚝뚝 끊김)의 다른 층 원인

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