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

게임 렉 백서 › 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 블로킹”
확인 수단
인프라 도구로 확인(게임 코드 불필요)

출처

  1. RFC 6298: Computing TCP's Retransmission Timer IETF
    첫 RTO 1초, 타이머가 만료될 때마다 RTO를 두 배로(지수 백오프)
  2. net/ipv4/tcp_input.c (Linux v6.12) Linux kernel
    리눅스 RTO = 평활 RTT + RTT 변동값이고 변동값의 하한이 tcp_rto_min(200ms)이라 RTO는 RTT+200ms 이상
  3. IP Sysctl Linux kernel
    tcp_rto_min_us 기본 200ms, 접속 요청의 첫 RTO 1초, tcp_retries2=15면 포기까지 최소 924.6초(약 15분)
  4. ss(8) — Linux manual page iproute2
    -i의 rto(재전송 타이머, ms)와 backoff(지수 백오프 횟수)
  5. net/ipv4/proc.c (Linux v6.12) Linux kernel
    nstat이 보여 주는 카운터 이름: TcpExt 그룹의 TCPTimeouts
  6. net/ipv4/tcp_timer.c (Linux v6.12) Linux kernel
    재전송 타이머가 만료될 때마다 TCPTimeouts를 올리고 backoff를 하나 늘리며 RTO를 두 배로(최대값까지) 늘림

함께 보면 좋은 원인

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

같은 증상(멈춤)의 다른 층 원인

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