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

ゲームラグ白書 › L5 データセンターのネットワーク機器

MTUの不一致(大きなパケットだけ消える) MTU black hole

原因ID dc-mtu · 主担当 インフラチーム・ネットワークインフラ · 副担当 インフラチーム・サーバーインフラ, ゲーム開発チーム・サーバー開発

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

途中の区間のMTU(一度に送れるサイズ)が小さくなっているのにサイズ超過の通知がブロックされると、大きなパケットだけが消え続けます。

なぜ トンネル・VPNの区間でMTUが小さくなる → すると サイズ超過の通知(ICMP)がファイアウォールでブロックされ、送信側が気づかない → 画面では インベントリ・キャラクター一覧のような大きな画面を開いたときだけフリーズした後に切断

症状
フリーズ, 切断, 接続不可・無限ロード
要因
パケットロス
誰に起きるか
特定の地域・ISP, 自分だけ
いつ
特定の操作をしたとき, 接続直後・メンテ明け
担当
主担当 インフラチーム・ネットワークインフラ · 副担当 インフラチーム・サーバーインフラ, ゲーム開発チーム・サーバー開発
ゲーム開発チームの対応
サーバー側で直接下げるなら、ソケットの最大セグメントサイズ(TCP_MAXSEG)を設定(ゲームのコードでメッセージを細かく分けるだけでは防げない)、UDPパケットは1,200バイト以下に保つ。
インフラチームの対応
ネットワーク:トンネル区間でTCPのパケットサイズを小さくする(MSSの調整)、ファイアウォール・クラウドのネットワークACLでサイズ超過の通知(ICMP)を許可。サーバー機器・OS:サーバーのファイアウォール・クラウドのセキュリティグループでもサイズ超過の通知(ICMP)を許可、サーバーカーネルのMTU探索(tcp_mtu_probing=1)を有効化(数秒止まった後にようやく働く最後のセーフティネット)。
数値の目安
通常は1,500バイトで、トンネルを通ると1,400前後に小さくなります。
グラフでは
一部だけ高い · 地域・通信事業者別の切断、大きな応答の失敗
確認箇所
問題のユーザーのPCからサーバーへ、フラグメント禁止の印(DF)を付けたpingをサイズを変えながら送る。Windowsはping /f /l 1472 SERVER_IP、Linuxはping -M do -s 1472 SERVER_IP(1,472はMTU 1,500からIPヘッダー20バイトとICMPヘッダー8バイトを引いた値)。サイズを小さくしながら通る最大サイズを探し、サーバー側のセキュリティグループ・ファイアウォールがICMPのサイズ超過通知(Fragmentation Needed)を許可しているか確認
該当する場合
小さいpingは通るのに1,472バイトのDF付きpingは失敗し(応答なし、またはフラグメント化が必要というエラー)、通る最大サイズが1,400前後と小さい。同じ地域のユーザーが大きな画面を開いたときだけフリーズする
該当しない場合
1,472バイトのDF付きpingも問題なく通るなら経路MTUの問題ではない。小さいpingも通らないならICMP自体がブロックされているため、この方法では判断できない
確認手段
ユーザー側の環境で確認

出典

  1. RFC 2923: TCP Problems with Path MTU Discovery IETF
    ファイアウォールがICMP(Fragmentation Needed)をブロックすると経路MTU探索が失敗し、大きなパケットだけが消え続ける(ブラックホール)、pingや小さな通信は通るため診断が難しい
  2. Maximum transmission unit and maximum segment size Cloudflare
    インターネットの経路MTUは1,500、GREトンネルを通ると1,476、TCP MSSは1,436以下に制限することを推奨
  3. IP Sysctl Linux kernel
    tcp_mtu_probing=1は普段はオフで、ICMPブラックホールを検知したときにTCPの経路MTU探索をオンにする
  4. ping(8) — Linux manual page iputils
    -M doはDFを付けて経路MTUより大きいパケットを拒否、-sでデータサイズを指定(デフォルトは56バイトで、これにICMPヘッダー8バイトが加わる)
  5. ping Microsoft
    /fはDFを付けて経路MTUの問題を探すのに使い、/lでデータサイズを指定

あわせて読みたい原因

同じ層:L5 データセンターのネットワーク機器

同じ症状(フリーズ)を起こすほかの層の原因

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