「パケットが届かない!」を解決する:MTUとMSSの知られざる関係を紐解く
ネットワークエンジニアの皆さん、こんにちは。現場でトラブルシューティングをしていると、時折こんな怪奇現象に遭遇しませんか?
「Webサイトには繋がるのに、特定の大きなファイルをアップロードしようとすると、プログレスバーが永遠に動かなくなる……」
ログを見てもエラーは出ない。pingは通る。でも、通信が確立した瞬間にピタリと止まる。この「サイレント・キラー」のような問題、その犯人の正体は、多くの初心者がつまずく「MTU」と「MSS」のミスマッチである可能性が非常に高いんです。
今日は、郵便配達の仕組みを例に、このパケットの「サイズ制限」について深く掘り下げてみましょう。
—
1. 荷物は一度に運べる量に限界がある:MTUとは
まずは MTU (Maximum Transmission Unit) です。これは、ネットワーク機器が一度に送信できる「最大の荷物のサイズ」のことです。
想像してみてください。あなたは今、郵便局員です。手元にはたくさんの郵便物がありますが、郵便トラックには「最大積載量」が決まっていますよね。もし、その積載量を超える荷物を無理やり詰め込もうとしたらどうなるでしょう?
そう、荷物を一旦バラして、複数のトラックに積み直さなければなりません。これが、ネットワークの世界で言うところの「パケットの断片化(フラグメンテーション)」です。
- MTUの標準値: 一般的なイーサネットでは
1500バイトが標準です。
しかし、ネットワークの道中には、トンネル(VPNなど)を通るために少しだけ荷物を小さくしなければならない区間があるかもしれません。この「道幅」が狭いことを知らずに、最大サイズの荷物を送り出し続けると、どこかのルーターで「この道は狭すぎて通れないよ!」とパケットが捨てられてしまうのです。
2. 荷物の中身を守るルール:MSSとは
次に MSS (Maximum Segment Size) です。こちらは、TCP という通信の「中身」に関するルールです。
MTU がトラックの大きさなら、MSS は「トラックの中に積むダンボール箱の大きさ」だと考えてください。TCP 通信を始める際、両端のコンピュータは握手(コネクション確立)を交わしながら、こう確認し合います。
「俺はこれくらいのサイズの箱なら扱えるよ(MSS)」
- 計算式はシンプル:
MSS = MTU - (IPヘッダー) - (TCPヘッダー) - 通常、
1500 - 20 - 20 = 1460バイトが標準になります。
この MSS の値を適切にネゴシエーションすることで、パケットは断片化されることなく、目的地までスマートに届けられます。
—
3. なぜ「パケットがドロップ」するのか?
ここで厄介なのが Path MTU Discovery (PMTUD) という機能です。これは、「道中のどこが一番狭いか(Path MTU)」を自動で探してくれる便利な機能なのですが……。
昨今のセキュリティ意識の高いネットワークでは、ルーターが「パケットが大きすぎて通れませんでした」というエラーメッセージ(ICMP)を無視したり、ファイアウォールがそれを遮断してしまったりすることがあります。
すると、送信側は「問題ないはずだ!」と思い込み、巨大なパケットを送り続け、受信側はいつまでも届かないデータを待ち続ける。これが、冒頭でお話しした「繋がるけど動かない」現象の正体です。
—
4. 現場での泥臭い解決策:MSSクランプ
もし、あなたがルーターやファイアウォールの管理権限を持っているなら、手っ取り早く解決できる魔法の呪文があります。それが 「MSSクランプ (MSS Clamping)」 です。
これは、ルーターを通過する際に「おい、お前ら荷物が大きすぎるぞ!もう少し小さくまとめろ!」と、パケットの中身を書き換えて強制的に MSS を小さくする技術です。
Linuxルーターでの設定例 (iptables)
もしあなたがLinuxベースのゲートウェイを構築しているなら、以下のコマンドが現場を救う特効薬になります。
# ネットワークインターフェース(ここではeth0)を通るTCPパケットのMSSを1360に強制固定する設定
iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -o eth0 -j TCPMSS --set-mss 1360
# コメント:
# --set-mss 1360 とすることで、VPNなどのオーバーヘッド分を考慮して
# 余裕を持たせたサイズに調整し、ドロップを防ぎます。
Ciscoルーターでの設定例
Cisco機器を使っている場合は、インターフェースの設定モードで以下のように叩きます。
interface GigabitEthernet0/1
ip tcp adjust-mss 1360
!
! コメント:
! この一行を入れるだけで、通過するTCPセッションのMSS値を自動的に調整してくれます。
! 現場で「特定のWebが見られない」という苦情が来たら、まずこれを試すのが定石です。
—
最後に:一歩ずつ理解していきましょう
ネットワークの世界は、目に見えないパケットのやり取りで成り立っています。今回解説した MTU や MSS も、最初はパズルのように感じるかもしれません。
ですが、「荷物を運ぶトラック」と「中身のダンボール」というイメージさえ持っておけば、トラブルが起きたとき「どこで詰まっているのか?」「誰がルールを破っているのか?」を冷静に切り分けることができます。
まずは、身近なネットワークで ping コマンドに -f (断片化禁止) と -l (サイズ指定) オプションを付けて、どこまで大きな荷物が通れるか実験してみてください。その小さな探究心が、いつかあなたを救う大きな力になるはずです。
それでは、また次回の深掘り記事でお会いしましょう!
コメント