【入門編】 TCP MSS(Maximum Segment Size)のネゴシエーションとMTUとの関係 – ネットワーク基礎とWebセキュリティ実践ガイド

ネットワークの「荷造り」に失敗しないために。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 オプションを活用して、自分のパケットがどこで弾かれているかを見極める。

「動かない!」と慌てたときこそ、このパケットの荷造りルールを思い出してください。現場で積み重ねた経験は、必ずあなたのエンジニアとしての武器になります。

これからも、パケットの気持ちになって、快適なネットワークライフを築いていきましょう!

コメント

タイトルとURLをコピーしました