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

ゲームラグ白書 › L8 ソケットとプロトコル

UDPパケットのIPフラグメンテーション IP fragmentation of large UDP

原因ID sk-fragment · 主担当 ゲーム開発チーム・サーバー開発

図と実験のあるメインページでこのカードを開く →

MTU(一度に送れるサイズ)を超えるUDPパケットはIP層でフラグメント化され、フラグメントを1つ失うだけでパケット全体が破棄されます。

なぜ 人の多い場所のスナップショットが1,500バイトを超える → すると 複数のフラグメントに分割して送信、1つでも失うと全体を破棄 → 画面では 大きなパケットほどロス率が数倍になる。混雑した場所でだけワープ

症状
ワープ
要因
パケットロス
誰に起きるか
特定の場所・チャンネル, 特定の地域・ISP
いつ
人が集中したとき
担当
主担当 ゲーム開発チーム・サーバー開発
ゲーム開発チームの対応
パケットを1,200バイト以下に自前で分割、変更分だけを送る。
数値の目安
ロス率2%の回線では、4つのフラグメントに分かれたパケットの約8%が失われます。フラグメント化されたパケットを一律に破棄するファイアウォールや通信事業者もあり、その場合ユーザーは大きなパケットを1つも受け取れません。
グラフでは
人数・負荷に連動して上昇 · IPフラグメンテーションの数(IpFragCreates)、スナップショットのサイズ
確認箇所
サーバーでnstat -azのIpFragCreates(送信時に作ったフラグメント数)の増加量を確認し、受信側ではIpReasmFails(再構築の失敗数)を確認。ゲームサーバーのログやパケットキャプチャでUDPパケットのサイズ分布を確認
該当する場合
人が集中する場所でIpFragCreatesが増え、1,500バイトを超えるUDPパケットがあり、そのときワープの報告が増えている
該当しない場合
IpFragCreatesが増えなければ、サーバーの送信側ではフラグメンテーションは起きていない
確認手段
インフラのツールで確認(ゲームコード不要)

出典

  1. RFC 8085: UDP Usage Guidelines IETF
    フラグメントを1つ失うと再構築できずパケット全体を失う、UDPアプリはIPフラグメンテーションを避けるべき
  2. RFC 8900: IP Fragmentation Considered Fragile IETF
    ファイアウォールや一部のネットワークがIPフラグメントを破棄する事例
  3. net/ipv4/proc.c (Linux v6.12) Linux kernel
    nstatが表示するカウンター名:IpグループのFragCreates(作ったフラグメント数)・ReasmFails(再構築の失敗数)

あわせて読みたい原因

同じ層:L8 ソケットとプロトコル

同じ症状(ワープ)を起こすほかの層の原因

図と実験のあるメインページでこのカードを見る