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

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

keepalive 기본값 2시간 TCP keepalive defaults

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

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

상대가 종료 신호 없이 사라지면 TCP는 한참 뒤에야 감지합니다. keepalive(유휴 연결이 살아 있는지 확인하는 TCP 기능)는 기본으로 꺼져 있고, 켜도 2시간 동안 유휴 상태여야 확인을 시작합니다.

왜 클라이언트가 전원 꺼짐·회선 끊김으로 종료 신호 없이 사라짐 → 그러면 서버는 연결이 살아 있다고 간주(keepalive 기본 7,200초. 보내던 데이터가 있으면 재전송 포기까지 약 15분) → 화면에서는 유령 캐릭터가 남고 재접속하면 “이미 접속 중” 오류

증상
접속 불가·무한 로딩, 안 보임·유령 개체
요인
손실
누가 겪나
나만
언제
가만히 있다가, 접속·점검 직후
담당
주 담당 게임개발팀·서버 개발 · 함께 게임개발팀·클라이언트 개발, 인프라팀·서버 인프라
게임개발팀 할 일
서버: 하트비트에 응답하고 일정 시간 못 받으면 연결을 먼저 정리(TCP_KEEPIDLE·TCP_USER_TIMEOUT 조정), 재접속하면 세션 토큰으로 기존 세션을 교체해 이어 받기. 클라이언트: 게임 수준 하트비트를 수 초~수십 초 간격(가장 짧은 유휴 타임아웃의 절반 이하)으로 보내기, 끊기면 자동 재접속.
인프라팀 할 일
코드가 따로 정하지 않는 소켓이 따르는 커널 기본값(tcp_keepalive_time 등) 낮추기(SO_KEEPALIVE를 켠 소켓에만 적용).
수치 감각
리눅스 기본값은 7,200초 유휴 상태면 확인을 시작해 75초 간격으로 프로브를 9번 보내고, 끝까지 응답이 없으면 연결을 끊습니다. 합치면 약 2시간 11분입니다. 윈도우도 기본으로 2시간 유휴 상태여야 확인을 시작합니다.
그래프에서는
일부만 높음 · 연결별 마지막 수신 뒤 경과 시간
확인할 곳
ss -tnoi로 연결별 lastrcv(마지막 수신 뒤 경과 ms)와 keepalive 타이머(timer:(keepalive,…))를 보고, 게임 서버의 “이미 접속 중” 거절 기록과 맞춰 봄
이러면 맞음
lastrcv가 수 분~수 시간인 ESTABLISHED 연결이 남아 있고 그 계정의 재접속이 “이미 접속 중”으로 거절됨
이러면 아님
오래 조용한 연결이 없는데 “이미 접속 중”이 나오면 게임 서버의 세션 정리 코드 쪽
확인 수단
인프라 도구로 확인(게임 코드 불필요)

출처

  1. tcp(7) — Linux manual page Linux man-pages
    7,200초 유휴 뒤 75초 간격 프로브 9번(약 11분 추가), SO_KEEPALIVE를 켠 소켓에만 적용, TCP_KEEPIDLE·TCP_USER_TIMEOUT
  2. RFC 9293: Transmission Control Protocol (TCP) IETF
    keepalive는 기본으로 꺼져 있어야 하고 유휴 간격 기본값은 2시간 이상
  3. SO_KEEPALIVE socket option Microsoft
    윈도우 TCP keepalive 기본 타임아웃 2시간
  4. ss(8) — Linux manual page iproute2
    -i의 lastrcv(마지막 수신 뒤 경과 ms), -o의 timer:(keepalive,…)

함께 보면 좋은 원인

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

같은 증상(접속 불가·무한 로딩)의 다른 층 원인

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