게임 렉 백서 › L8 소켓과 프로토콜
UDP 패킷의 IP 단편화 IP fragmentation of large UDP
원인 ID sk-fragment · 주 담당 게임개발팀·서버 개발
그림과 실험이 있는 원본 카드로 열기 →
MTU(한 번에 보낼 수 있는 크기)를 넘는 UDP 패킷은 IP 계층에서 단편화되고, 프래그먼트 하나만 잃어도 전체가 버려집니다.
왜 사람 많은 곳의 스냅샷이 1,500바이트를 넘음 → 그러면 여러 프래그먼트로 나뉘어 전송, 하나라도 잃으면 전체 폐기 → 화면에서는 큰 패킷일수록 손실률이 몇 배. 붐비는 곳에서만 순간이동
- 증상
- 순간이동
- 요인
- 손실
- 누가 겪나
- 특정 장소·채널, 특정 지역·통신사
- 언제
- 사람이 몰릴 때
- 담당
- 주 담당 게임개발팀·서버 개발
- 게임개발팀 할 일
- 패킷을 1,200바이트 이하로 직접 나누기, 변경분만 보내기.
- 수치 감각
- 손실 2%인 회선에서 프래그먼트 4개로 나뉜 패킷은 약 8%가 사라집니다. 단편화된 패킷을 아예 버리는 방화벽·통신사도 있어, 그 사용자는 큰 패킷을 하나도 받지 못합니다.
- 그래프에서는
- 인원·부하를 따라 오름 · IP 단편화 수(IpFragCreates), 스냅샷 크기
- 확인할 곳
- 서버에서 nstat -az의 IpFragCreates(보내면서 만든 프래그먼트 수) 증가량을 보고, 받는 쪽은 IpReasmFails(재조립 실패 수)를 봄. 게임 서버 로그나 패킷 캡처로 UDP 패킷 크기 분포를 확인
- 이러면 맞음
- 사람이 몰리는 곳에서 IpFragCreates가 늘고 1,500바이트를 넘는 UDP 패킷이 있으며 그때 순간이동 제보가 늘어남
- 이러면 아님
- IpFragCreates가 늘지 않으면 서버가 보내는 쪽에서는 단편화가 일어나지 않음
- 확인 수단
- 인프라 도구로 확인(게임 코드 불필요)
출처
- RFC 8085: UDP Usage Guidelines IETF
프래그먼트 하나를 잃으면 재조립이 안 돼 패킷 전체를 잃음, UDP 앱은 IP 단편화를 피해야 함 - RFC 8900: IP Fragmentation Considered Fragile IETF
방화벽·일부 네트워크가 IP 프래그먼트를 버리는 사례 - net/ipv4/proc.c (Linux v6.12) Linux kernel
nstat이 보여 주는 카운터 이름: Ip 그룹의 FragCreates(만든 프래그먼트 수)·ReasmFails(재조립 실패 수)
함께 보면 좋은 원인
같은 층: L8 소켓과 프로토콜
같은 증상(순간이동)의 다른 층 원인
그림과 실험이 있는 원본 카드 보기