パスMTU探索
送信元から宛先までの経路上で、途中で分割されずに通れるパケットの最大の大きさ(パスMTU)を調べる仕組み。
イマシルちゃんの解説
通信に使う回線ごとに、一度に通せるパケットの大きさには上限があるよ。
パスMTU探索は、送信先までの経路で分割せずに通せる最大サイズを調べるIP通信の仕組みなんだ。
例えばIPv4では、途中での分割を禁止するDFビットを立ててパケットを送るよ。
大きすぎて次の回線へ渡せないルータは、そのパケットを捨てて、エラーを伝えるICMPの通知で通せるサイズを知らせるの。
送信元はその知らせに合わせて、送るパケットを小さくするんだ。
こうして経路に合う大きさに調整することで、サイズ超過による廃棄を避けてデータを運びやすくなるよ。
この解説はわかりやすかったですか?
より深い解説
定義
MTU(Maximum Transmission Unit)は、1つの回線で一度に送れるパケットの最大長である(イーサネットでは1,500バイト)。経路上の各回線のMTUのうち最も小さいものをパスMTUといい、それを調べる仕組みをパスMTU探索(PMTUD)という。
IPv4での仕組み(RFC 1191)
- 送信元は、IPヘッダーのDF(Don't Fragment)ビットを立てて、パケットを送る
- 次の回線のMTUより大きいパケットを受け取ったルータは、分割せずに捨て、ICMPの宛先到達不能(タイプ3、コード4:フラグメントが必要)を、次の回線のMTUの値を添えて送信元に返す
- 送信元は、その値に合わせてパケットを小さくして送り直す
IPv6での仕組み(RFC 8201)
IPv6では、経路上のルータはパケットを分割しない(分割できるのは送信元だけ)。大きすぎるパケットを受け取ったルータは、パケットを捨ててICMPv6のPacket Too Big(タイプ2)を返す。送信元はそこに書かれたMTUに合わせて送り直す。
パスMTUを決めるのはこのメッセージで、近隣探索プロトコルのメッセージではない。なお、IPv6ではすべての回線が少なくとも1,280バイトのMTUを持つことが求められている。
ブラックホール問題
途中のファイアウォールがICMPやICMPv6をすべて遮断していると、パスMTU探索のためのメッセージが送信元に届かない。送信元は大きなパケットを送り続け、それがすべて捨てられるため、「接続はできるのに、大きなデータだけ届かない」という障害になる。これをPMTUDブラックホールという。
対策には次のようなものがある。
- パスMTU探索に必要なICMPのメッセージを遮断しない
- ルータでTCPのMSS(最大セグメント長)を書き換え、最初から小さなセグメントで通信させる(MSSクランプ)
- ICMPに頼らず、TCPやアプリケーションで小さなパケットから試して探る方法(PLPMTUD)を使う
PPPoEやトンネル(IPsec、GREなど)を使う回線は、ヘッダーが増えるぶんMTUが1,500より小さくなるため、この問題が起きやすい。