パスMTU探索
送信元から宛先までの経路上で、途中で分割されずに通れるパケットの最大の大きさ(パスMTU)を調べる仕組み。
イマシルちゃんの解説
荷物を送るとき、途中にとっても狭いトンネルがあったら、大きな荷物は通れないよね。
パスMTU探索は、「この道のりで一番狭いところは何センチ?」を調べる方法なんだ。
一番狭いところに合わせた大きさで送れば、途中で荷物を分けたり、捨てられたりしなくて済むんだよ!
より深い解説
定義
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より小さくなるため、この問題が起きやすい。