要約

  • 初期IPv4では、次のリンクに収まらないデータグラムをゲートウェイが分割し、宛先が再構成した。異なるリンクを隠せる一方、一片の消失がデータグラム全体を失わせた。
  • RFC 1191はDFを付けたパケットとICMPの「分割が必要」という応答で送信元に縮小させた。しかし応答が遮断されると、小さな通信だけ成功して大きなデータが止まるブラックホールが生じた。
  • PLPMTUDは確認可能なプローブを端点から送り、ICMPだけに依存せず利用可能な範囲を探る。経路は証拠を出せても、状態を持ち、検証し、次の大きさを選ぶのは送信側である。

狭い網に入れないデータグラム

インターネットは、同じ物理網をつないだものではない。あるリンクが許す最大パケットは、別のリンクでは大きすぎることがある。1981年9月の RFC 791 は、アドレス指定とフラグメンテーションをIPの二つの基本機能とした。ゲートウェイは長いデータグラムを分け、より小さなパケットしか通せない網を越えさせられる。

Identification、Fragment Offset、More Fragmentsは、そのための帳簿である。宛先は送信元、宛先、プロトコル、識別子を照合し、断片を元の位置へ戻す。途中の違いは上位層から見えにくくなるが、費用は消えない。狭い場所でパケット数が増え、受信側には再構成状態が残り、一片でも失えば完成しない。

IPv4にはDF(Don't Fragment)もあった。DF付きのパケットが次のリンクに収まらなければ、ルーターは分割せず捨てる。これにより送信側は分割を拒めるが、捨てた理由が戻らなければ、単なる損失との違いを知ることができない。

Path MTUは宛先の固定属性ではなく、現在の経路を構成するリンクMTUの最小値である。経路変更、トンネルの追加ヘッダー、等コスト経路の分岐で値は動く。昨日の正解は、今日の別経路には命令できない。

全ゲートウェイに最小値を書かせる

1988年7月の RFC 1063 は、経路そのものに最小値を記入させようとした。Probe MTUオプションに最初のリンクの値を入れ、各ゲートウェイが入出力リンクと比べて小さければ書き換える。Reply MTUオプションが結果を送信元へ返す。

提案が解こうとした問題は明快だった。小さすぎる固定値はヘッダーを増やし容量を無駄にする。大きすぎる推測は分割を招く。別の探査パケットは負荷となり、経路が変われば古くなる。またTCP MSSは相手が受け取るTCPペイロードの上限であり、途中のIP経路が運べる上限とは別物だと整理した。

ただし、答えの完成には通過する全ゲートウェイの協力が要る。RFC 1063自身、IPオプション処理時に入出力インターフェースが確定していない装置があり、大きなソフトウェア変更になり得ると認めている。情報は各地点に存在しても、同時更新は容易ではなかった。

失敗したリンクだけが応答する

1990年11月の RFC 1191 は、常時書き換える方式をやめた。送信元は最初のホップのMTUから始め、DFを設定する。完全な形で転送できないルーターだけがパケットを捨て、ICMP Destination Unreachableの「分割が必要でDFあり」というコードを返す。送信元は推定値を下げる。

RFC 1191はICMPの未使用フィールドに、問題となった次ホップMTUを載せた。これなら送信元は適切な値へ直接近づける。DFを続ければ、経路が狭くなった時にも新しい失敗が通知される。

旧式ルーターは新フィールドをゼロで返す。その場合、ホストは当時よく使われたリンク値をまとめたMTUの「台地」を順に下る。数パーセントの過小評価は、一バイトの過大評価より安全だという判断だった。ただし表は実装上の助言であり、将来まで固定されたネットワーク台帳ではない。

広くなった経路を再発見するには、キャッシュを時間で見直し、慎重に大きなパケットを試す。エラー内容を理由に値を上げてはならない。下限を下げる報告と、上限を上げる到達証明は、同じ強さの証拠ではないからだ。

通じるのに、データだけ進まない

この方式はICMPが送信元に戻ることを前提にする。2000年の RFC 2923 は、その前提が崩れたPMTUDブラックホールを記録した。ルーターが不具合や設定で通知を出さず、ファイアウォールがICMPを一括遮断すると、送信側は同じ大きなDFパケットを送り続ける。

障害の見え方が厄介である。TCPのハンドシェイクは小さいため成立する。短い対話やpingも動く。大量転送の最初の大きなセグメントだけが境界を越えられず、同じサイズで再送される。到達性の試験は成功しているのに、実用通信は止まる。

小さな値へのフォールバックは応急処置になるが、壊れたフィードバックを隠し、性能低下を恒常化させる。原因もICMPフィルターだけではない。トンネルはヘッダーを増やし、エラーを入口へ向ける。非対称経路、ICMPレート制限、二層のMTU不整合も有効な通知を失わせる。

IPv6の現行仕様 RFC 8201 も、ハンドシェイク後にデータが止まるブラックホールを明記する。IPv6の転送ルーターは分割しない。必要なら送信元が分割するため、サイズ判断の所在はいっそう明白になった。

失敗の説明より、到達の実験

2007年の RFC 4821 は、ネットワークから失敗理由を受け取るだけでなく、Packetization Layerが成功を試す方法を定めた。まず通るサイズを保ち、それより大きなプローブを送る。確認されれば利用可能範囲の下限を上げ、孤立したプローブが確定的に失敗すれば上限を下げる。

Packetization Layerは、アプリケーションデータをパケットへ区切る層である。TCPなら特定のプローブが確認されたかを知り、通常データは安全なサイズのまま送れる。実験的損失と通常の輻輳を分ける材料も持つ。

しかし一個の損失をMTUの断定に使ってはいけない。タイムアウトや他の損失が伴えば結果は不確定で、通常の輻輳制御を続ける。一回の成功も、その時その経路を一個通った証拠にすぎず、将来や別のECMP分岐を保証しない。

PLPMTUDはICMPを補助に使えるが、なくても進める。ネットワークの知識を捨てたのではなく、単一の通知経路に拒否権を与えなくなった。その分、端点には確認、探索範囲、タイマー、ヘッダー量、経路キャッシュと輻輳状態を整合させる仕事が増える。

データグラムにも確認手段をつくる

TCP以外では、到達確認を誰が用意するかがさらに重要になる。2020年の RFC 8899 は、UDP上のプロトコル、SCTP、QUICなどにDatagram PLPMTUDを定義した。確認機能を持つプロトコルもあれば、素のUDPのようにアプリケーション側の仕組みが必要なものもある。

通常データは現在のPLPMTU以下に置き、識別できるプローブだけを大きくする。ブラックホールを検出すれば下げ、成功を重ねて上を探す。PTBは探索を速められるが任意の入力であり、実際に送ったパケットへの応答か検証してから使う。

IPv4分割、経路内オプション、ICMPベースPMTUD、PLPMTUDという流れは、中心から端へ一度に権限が移った物語ではない。分割は異種性を隠したが損失を拡大した。オプションは正確な局所知を集めたが全装置に変更を求めた。ICMPは失敗時だけ話したが返路に依存した。端点プローブは実配送を加え、その依存を限定した。

サイズは期限つきの判断である

運用現場ではMTUを1500や1280という数字として覚えがちだ。歴史が示す本質は、誰が観測し、誰が決め、誰が誤りの費用を払うかである。リンク管理者は局所上限を設定し、ルーターは実施して通知できる。セキュリティ装置は通知を消せる。端点は経路状態を持ち、トランスポートやアプリケーションが次のパケットを作る。

共通ルールは狭い方がよい。ネットワークは限界を証拠として返し、端点は到達、損失、輻輳と合わせて判断し、経路が変われば改める。パケットが自分の大きさを知ったのではない。決定を、証拠と結果の両方を扱える場所へ戻したのである。

情報源と限界

RFC 791はIPv4分割とDF、RFC 1063はゲートウェイ更新型オプション、RFC 1191は古典PMTUDと次ホップMTU、台地探索、再評価を記す。RFC 2923はTCPブラックホールを整理し、RFC 4821はPacketization Layerの探索と輻輳境界を定める。RFC 8201はIPv6、RFC 8899はデータグラム転送の現行方向を示す。

これらは仕様と既知の失敗を示す一次資料だが、全ネットワークの導入日、普及率、現在の障害割合を測定した資料ではない。