ネットワークの「荷造り」に失敗しないために。TCP MSSとMTUの切っても切れない関係を紐解く
エンジニアの皆さん、こんにちは。現場でネットワークトラブルに直面したとき、パケットがどこかで「死んでいる」理由が分からず、頭を抱えたことはありませんか?
「設定は合っているはずなのに、なぜかWebサイトが表示されない」「特定のファイル転送だけが途中で止まる」。そんな悪夢のようなトラブルの裏側には、実はネットワークの「荷造りルール」である MTU と MSS が深く関わっていることが多いのです。
今日は、小難しい仕様書を一旦脇に置いて、身近な「郵便配達」に例えながら、この切っても切れない関係を紐解いていきましょう。
—
1. ネットワークの「ダンボール箱」と「中身」のルール
ネットワークの世界では、データを運ぶために MTU (Maximum Transmission Unit) という「ダンボール箱の最大サイズ」が決まっています。インターネットの世界では、この箱の大きさは一般的に 1500バイト と決められています。
一方で、TCP通信において実際にデータを入れる袋のようなものが MSS (Maximum Segment Size) です。
郵便配達で例えるなら?
- MTU (1500バイト): 郵便局が定めた「一度に運べるダンボール箱の大きさ」。これより大きい箱は、配達トラック(ネットワーク機器)に乗せることができません。
- MSS: 「箱の中に詰める荷物の最大量」。箱そのものには、宛先や荷物の管理情報(TCPヘッダーやIPヘッダー)を記載する余白が必要です。
つまり、「MSS = MTU – (ヘッダーのサイズ)」 というのが鉄則なんです。もしMSSを大きくしすぎると、荷物が箱に入りきらず、物理的に運べなくなってしまいますよね。
—
2. SYNパケットで交わされる「秘密の約束」
TCP接続を確立する際、クライアントとサーバーは「3ウェイ・ハンドシェイク」という儀式を行います。この最初の SYN パケットの中で、実はこっそりと「私、これくらいのサイズの荷物なら受け取れるよ!」と申告し合っています。これが MSSのネゴシエーション です。
1. クライアント: 「私の受け取り可能なMSSは1460バイトです!」
2. サーバー: 「了解!じゃあ私も1460バイトで送るね!」
お互いに「これなら道中で箱が壊れないよね」という最大サイズを確認し合うことで、効率的かつ安全な通信がスタートするのです。
—
3. なぜ「Path MTU Discovery」が失敗すると悲劇が起きるのか?
インターネットの道のりは一本道ではありません。通信経路の途中に、MTUが1500よりも小さい(例えばVPNトンネルを使っている等)場所があるとどうなるでしょう?
本来であれば、Path MTU Discovery (PMTUD) という仕組みが働き、「あ、この先は1400バイトの箱しか通れないんだ!」と自動で調整してくれます。しかし、ファイアウォールの設定などでこの信号が無視されると、「大きすぎる荷物が検問所でストップし、破棄される」という悲劇が起きます。
これが、いわゆる「パケットの断片化」が引き起こす通信不良です。パケットが届いたり届かなかったりする「不安定な通信」の正体は、だいたいこれです。
—
4. 実務で役立つ確認と調整のヒント
もしあなたがサーバー管理者なら、pingコマンドを使って「この経路で通れる最大のサイズ」を調べるのが鉄則です。
Windowsで確認する
# -f: 断片化禁止フラグ
# -l: サイズ指定(1472バイト + IPヘッダー20バイト + ICMPヘッダー8バイト = 1500バイト)
ping -f -l 1472 8.8.8.8
もしこれで「パケットを断片化する必要がありますが、DFが設定されています」と返ってきたら、その経路は1500バイトの荷物を運べません。サイズを少しずつ減らして、どこが限界かを探ってみてください。
LinuxでMSSを強制的に調整する(iptablesの例)
VPN越しなどでMTU問題が解決できない場合、ルーターやサーバー側で強制的にMSSを書き換えてしまうという「泥臭い」テクニックもあります。
# ネットワークインターフェースを通過するTCP SYNパケットを捕まえて、
# MSSを1360バイトに書き換える設定(TCP MSS Clamping)
sudo iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1360
※上記の 1360 という数字は、VPNなどのオーバーヘッドを考慮した現場でよく使われる安全圏の数値です。
—
まとめ:ネットワークは「思いやり」でできている
MTUとMSSの関係は、いわば「相手の受け入れ能力を尊重する」というネットワーク上の思いやりです。
- 基本: MTUは1500バイトが世界標準。
- 調整: 通信経路に特殊な環境(VPNやクラウドの仮想ネットワーク)がある場合は、MSSを小さく調整する必要があるかもしれない。
- 診断: pingの
-fオプションを活用して、自分のパケットがどこで弾かれているかを見極める。
「動かない!」と慌てたときこそ、このパケットの荷造りルールを思い出してください。現場で積み重ねた経験は、必ずあなたのエンジニアとしての武器になります。
これからも、パケットの気持ちになって、快適なネットワークライフを築いていきましょう!
コメント