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

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

RST 강제 종료로 마지막 데이터 유실 SO_LINGER, abrupt RST

원인 ID sk-linger · 주 담당 게임개발팀·서버 개발

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

서버가 연결을 급히 끊으면 마지막으로 보낸 안내나 저장 완료 신호가 사라집니다.

왜 서버가 연결을 강제 종료(RST)로 닫음. SO_LINGER를 0초로 두거나, 받은 데이터를 다 읽지 않고 닫으면 생김 → 그러면 아직 전송 중이던 킥 사유·마지막 데이터가 버려짐 → 화면에서는 이유 없는 “알 수 없는 오류로 연결 종료”

증상
접속 끊김
요인
손실
누가 겪나
나만
언제
가끔 무작위로
담당
주 담당 게임개발팀·서버 개발
게임개발팀 할 일
사유를 보낸 뒤 송신 방향만 먼저 닫고(shutdown), 상대가 닫을 때까지 받은 데이터를 끝까지 읽은 다음 닫기, SO_LINGER 0초 피하기.
그래프에서는
가끔 무작위로 튐 · RST로 끝난 연결 수
확인할 곳
nstat -az의 TcpExtTCPAbortOnData(보낼 데이터가 남은 채 RST로 닫음, SO_LINGER 0초)·TcpExtTCPAbortOnClose(안 읽은 데이터가 남은 채 닫음) 증가량을 보고, 끊김 순간 서버 쪽 패킷 캡처에서 FIN 대신 RST가 나가는지 봄
이러면 맞음
“알 수 없는 오류로 연결 종료” 제보 시각에 서버가 RST를 보내고 AbortOnData·AbortOnClose가 늘어남
이러면 아님
서버가 FIN으로 정상 종료했는데 사유가 안 보이면 클라이언트의 종료 처리 쪽
확인 수단
인프라 도구로 확인(게임 코드 불필요)

출처

  1. closesocket function (winsock.h) Microsoft
    SO_LINGER를 켜고 시간을 0으로 두면 연결을 즉시 리셋하는 강제 종료가 되고 보내지 못한 데이터는 사라짐
  2. RFC 9293: Transmission Control Protocol (TCP) IETF
    받은 데이터가 남은 채 닫으면 데이터 유실을 알리려 RST를 보냄
  3. Graceful Shutdown, Linger Options, and Socket Closure Microsoft
    shutdown으로 송신만 먼저 닫고 상대의 종료 알림을 받은 뒤 소켓을 닫는 순서
  4. SNMP counter Linux kernel
    TcpExtTCPAbortOnData: SO_LINGER 0초 등으로 보낼 데이터가 남은 채 RST로 닫음, TcpExtTCPAbortOnClose: 안 읽은 데이터가 남은 채 닫아 RST를 보냄

함께 보면 좋은 원인

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

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

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