← 문제로

23. 패킷 손실·지터·재정렬 대응: 지터 버퍼·FEC·중복 전송과 실시간 게임 트레이드오프

난이도 중
내 답안
모범답안

난이도: 중

1) 손실·지터·재정렬과 게임 체감

  • 손실(loss): 패킷이 도착하지 않음. 입력/상태가 비어 순간이동·미반응으로 보인다. 지표는 손실률(%).
  • 지터(jitter): 도착 간격의 변동(패킷 간 지연의 분산). 평균 지연이 낮아도 지터가 크면 프레임이 몰렸다 끊겼다 해 버벅임이 생긴다. 지표는 지연의 표준편차/변동폭.
  • 재정렬(reordering): 나중 패킷이 먼저 도착. 순서 의존 처리에서 상태가 뒤로 튀거나 오래된 값이 덮어쓴다.
  • RTT vs 지터 vs 손실: RTT 는 왕복 지연의 평균적 크기, 지터는 그 지연의 흔들림, 손실은 도달 여부로 서로 독립적인 축이다. RTT 가 좋아도 지터·손실이 나쁘면 체감은 나쁘다.

2) 지터 버퍼

  • 원리: 도착한 패킷을 바로 쓰지 않고 짧은 시간(수~수십 ms) 버퍼에 모아, 일정한 페이스로 꺼내 재생/적용한다. 이르게 온 패킷은 기다리고, 늦게 온 패킷은 버퍼가 흡수해 재정렬도 정렬해 준다.
  • 트레이드오프: 버퍼를 키우면 지터·재정렬 흡수력↑, 손실 은닉↑ 이지만 입력 지연↑(버퍼만큼 늦게 반영). 줄이면 지연↓ 이지만 늦은 패킷을 놓쳐(underrun) 끊김↑. 실시간 게임은 지연 예산이 빡빡해 버퍼를 작게 잡는다.
  • 적응형: 최근 지터·손실 통계를 보고 버퍼 길이를 동적으로 늘렸다 줄인다(안정 구간엔 짧게, 나빠지면 길게).

3) 재전송(ARQ) vs FEC vs 중복 전송

  • 재전송(ARQ): 손실을 감지하고 다시 보냄. 대역폭 효율은 좋지만 최소 1 RTT 의 복구 지연이 든다. RTT 가 크거나 손실이 잦으면 실시간엔 너무 느리다. 신뢰가 꼭 필요한(드문) 데이터에 적합.
  • FEC(순방향 오류정정): 여분의 패리티 패킷을 미리 함께 보내, 일부 손실을 재전송 없이 즉시 복구. 지연이 낮지만 대역폭 오버헤드(패리티) 가 상시 든다. 손실률을 알면 복구율을 맞춰 설계한다.
  • 중복 전송(redundancy): 같은(또는 최근 N개) 데이터를 여러 패킷에 실어 보냄(예: 입력을 이전 몇 틱과 함께 재전송). 구현이 단순하고 지연 낮지만 대역폭을 더 쓴다.
  • 왜 실시간 입력에 FEC/중복인가: 입력은 매 틱 새로 생기고 신선도가 생명이라, 1 RTT 걸리는 재전송본은 도착할 즈음 이미 낡았다. 대역폭을 조금 더 써서라도 즉시 복구/보강하는 편이 체감이 낫다.

4) 손실·지터에 견디는 상태 동기화 설계

  • 멱등한 스냅샷/델타: 매 틱 "현재 진실"을 보내면(전체 또는 기준 대비 델타), 한 패킷을 잃어도 다음 패킷이 곧 최신 상태로 덮어써 재전송 불필요. 늦게 온 오래된 패킷은 버린다(last-write-wins, 시퀀스로 판별).
  • 입력 중복 포함: 클라 입력은 작으니 최근 몇 틱치를 함께 실어 보내 손실을 자연 복구한다.
  • 신뢰 vs 비신뢰 분리:
    • 비신뢰(최신만 중요): 위치·회전·체력 같은 연속 상태 → 스냅샷/델타 + 최신 우선. 손실 은닉을 보간/외삽(dead reckoning)으로 메운다.
    • 신뢰(반드시 도달·순서): 아이템 획득, 채팅, 상태 전이 이벤트 → 시퀀스+ACK 재전송으로 보장.
  • 채널을 이렇게 나눠 각 데이터에 맞는 신뢰성만 지불한다.

5) TCP 의 한계와 UDP + 선택적 신뢰성

  • TCP 는 순서 보장 + 완전 신뢰라, 중간 패킷 하나가 손실되면 그 뒤에 도착한 데이터도 머리-줄 막힘 (head-of-line blocking) 으로 애플리케이션에 못 올라간다. 재전송·혼잡 제어로 지연이 누적돼 실시간 상태의 신선도가 깨진다.
  • 그래서 실시간 게임은 UDP 위에 필요한 만큼만 신뢰성/순서를 얹는다: 상태는 비신뢰 스냅샷으로, 중요한 이벤트만 신뢰 채널로. 이렇게 하면 손실이 있어도 최신 상태는 계속 흐르고, 지터 버퍼·FEC·보간으로 체감을 다듬을 수 있다(QUIC 이 UDP 위에서 스트림별 독립 전달로 HoL 을 줄이는 것도 같은 동기).

면접 포인트

  • 손실·지터·재정렬·RTT 가 서로 다른 지표이고 각기 다른 대응이 필요하다는 점.
  • 지터 버퍼의 지연↔안정성 트레이드오프와 적응형 조절.
  • ARQ vs FEC vs 중복의 대역폭·지연·복구 트레이드오프, 그리고 데이터 종류별 신뢰성 분리.
  • TCP HoL 막힘과 UDP+선택적 신뢰성을 선택하는 이유.