게임 렉 백서 › L8 소켓과 프로토콜
TCP RTO와 지수 백오프 RTO and exponential backoff
원인 ID sk-rto · 주 담당 게임개발팀·서버 개발 · 함께 게임개발팀·클라이언트 개발
그림과 실험이 있는 원본 카드로 열기 →
재전송이 또 실패할 때마다 기다리는 시간이 두 배로 늘어, 짧은 회선 끊김이 긴 멈춤이 됩니다.
왜 회선이 잠깐 끊겨 재전송도 연달아 실패 → 그러면 다음 시도까지 0.3 → 0.6 → 1.2 → 2.4초처럼 두 배씩 늘어남(핑 100ms 기준) → 화면에서는 회선은 1초 끊겼는데 게임은 2초 넘게 멈춤. 더 길게 끊기면 결국 접속 끊김
- 증상
- 멈춤, 접속 끊김
- 요인
- 손실, 정체
- 누가 겪나
- 나만
- 언제
- 가끔 무작위로, 이동 중·지역 전환 때
- 담당
- 주 담당 게임개발팀·서버 개발 · 함께 게임개발팀·클라이언트 개발
- 게임개발팀 할 일
- 서버: 하트비트에 응답하고 일정 시간 못 받으면 연결을 먼저 정리(TCP_USER_TIMEOUT으로 포기 시점 줄이기), 세션 토큰으로 이어 받기, 신뢰성 UDP. 클라이언트: 짧은 간격으로 하트비트를 보내고 응답이 끊기면 TCP 재전송을 기다리지 말고 빨리 재접속.
- 수치 감각
- 리눅스 RTO(재전송 대기 시간)는 “핑 + 200ms”가 최소이고 연결을 맺을 때는 1초부터 시작합니다. 기본 설정(tcp_retries2=15)이면 재전송이 계속 실패해도 약 15분 뒤에야 연결을 포기합니다.
- 그래프에서는
- 끊겼다가 몰아서 · 연결별 RTO·backoff, RTO 만료 수
- 확인할 곳
- 멈춘 연결을 ss -ti로 보고 rto(재전송 대기 ms)와 backoff(연속 만료 횟수)를, 서버 전체는 nstat -az의 TcpExtTCPTimeouts(재전송 타이머 만료 횟수) 증가량을 봄
- 이러면 맞음
- 멈춘 연결의 backoff가 1 이상이고 rto가 초 단위로 커져 있으며 그 시각 TCPTimeouts가 늘어남
- 이러면 아님
- 재전송이 빠른 재전송으로 끝나고 RTO 만료가 없으면 멈춤이 짧음. 그때는 “TCP HOL 블로킹”
- 확인 수단
- 인프라 도구로 확인(게임 코드 불필요)
출처
- RFC 6298: Computing TCP's Retransmission Timer IETF
첫 RTO 1초, 타이머가 만료될 때마다 RTO를 두 배로(지수 백오프) - net/ipv4/tcp_input.c (Linux v6.12) Linux kernel
리눅스 RTO = 평활 RTT + RTT 변동값이고 변동값의 하한이 tcp_rto_min(200ms)이라 RTO는 RTT+200ms 이상 - IP Sysctl Linux kernel
tcp_rto_min_us 기본 200ms, 접속 요청의 첫 RTO 1초, tcp_retries2=15면 포기까지 최소 924.6초(약 15분) - ss(8) — Linux manual page iproute2
-i의 rto(재전송 타이머, ms)와 backoff(지수 백오프 횟수) - net/ipv4/proc.c (Linux v6.12) Linux kernel
nstat이 보여 주는 카운터 이름: TcpExt 그룹의 TCPTimeouts - net/ipv4/tcp_timer.c (Linux v6.12) Linux kernel
재전송 타이머가 만료될 때마다 TCPTimeouts를 올리고 backoff를 하나 늘리며 RTO를 두 배로(최대값까지) 늘림
함께 보면 좋은 원인
같은 층: L8 소켓과 프로토콜
같은 증상(멈춤)의 다른 층 원인
그림과 실험이 있는 원본 카드 보기