Path MTU Discovery と PMTUD ブラックホール

SERVER


MTU とは

現在のインターネットで利用されている IP ネットワークでは、機器ごとに MTU (Maximum Transmission Unit) という 1 回のデータ通信で送信可能な IP データグラムの最大値が設定されています。

機器ごとに設定されている都合上、通信経路上の機器の中でいちばん小さい MTU 値が、その経路での 1 回のデータ通信における最大の IP データグラムサイズということになります。

 

Path MTU Discovery

では、その MTU 値を超えるサイズのパケットをその経路に送信したらどうなるのでしょう。

そのパケットに DF (分割禁止) ビットが 0 のパケットであれば、手前の機器は 1 つのパケットを MTU 値が示すサイズ毎に分割して送信を行います。このとき、通信は正しく継続できるのですが、パケットの伝送効率が大きく低下するそうです。

 

逆に、DF (分割禁止) ビットが 1 にセットされているパケットの場合は、勝手に分割することはできないので、送信元へもっと小さいサイズで再送するように具体的な MTU 値を添えて返却することになるそうです。

送信元がその返答を受け取ると、受け取った MTU 値から適切なサイズのパケットを生成して再度送信することで、通信を正しく行うことができるようになります。

この、具体的な MTU 値を返却して通信を成立させる方式のことを PMTUD (Path MTU Discovery) と呼ぶそうです。

 

PMTUD ブラックホール

通常はこのように、適切な MTU 値を自動検出して通信を正常に保つ仕組みがネットワークには備わっているのですが、この経路上で分割せずに送信可能な MTU 値を伝えるための返答が、何らかの理由で欠落してしまい、送信元にうまく伝わらない状況があります。

具体的には、返答には ICMP プロトコルの Type3, code4 というパケットが利用されるらしいのですが、これが経路途中のルーターでフィルタリングされることなどにより、欠落してしまう場合があるようです。

 

適切な MTU 値が伝わらなければ、送信元は単にパケットの送信に失敗しただけだと思って、再度同じサイズのパケットを再送信してしまいます。

当然ながらそれは経路上で再び PMTUD により遮断され、MTU 値を伴った再送信要求がされるのですが、それがまた経路上で欠落するため、いつまでたっても送信できるサイズのパケットを送れないという状況が発生してしまいます。

このことを "PMTUD ブラックホール" と呼ぶのだそうです。

 

PMTUD ブラックホールの検出方法

Windows のコマンドプロンプトでの確認方法になりますが、例えばホスト "HOSTNAME" までの通信において、PMTUD ブラックホールが存在しているかを確認するには、次のコマンドを使用します。

ping -f -l 1472 HOSTNAME

このようにすることで、送信サイズ 1472 (MTU=1500) の ECHO パケットを分割禁止で送信することができます。

MTU の最小値は一般に 576 バイトらしいので、そこからヘッダー分の 28バイトを引いた 548 バイトを使用して、そこから 1472 バイトくらいを目標にして徐々に数値を上げて行くのが良いそうです。

なお、このコマンドは Windows 版の ping でのみ有効です。Windows 番では分割禁止を示す -f フラグは、Linux 版では ping の大量送信になるようなので十分注意が必要です。

 

このように ping を送信したときに、正常に相手からの応答があれば、MTU 値が 1,500 のパケットが、そのネットワーク経路では正常に届けられる、すなわち経路上の全ての MTU 値が 1,500 以上であることが分かります。

ここでもし、"Packet needs to be fragmented but DF set." や "パケットの断片化が必要ですが、DF が設定されています。" といった返答が戻ってきた場合には、経路上に MTU 値が 1,500 に満たない機器が存在していることが分かります。

このとき、PMTUD による MTU の自動検出機能は正常に動作しています。

 

問題になるのが、"Request timed out." などで、ping への応答が得られなかった場合です。

もっとも、もともと -f をつけない ping が応答を返さない場合は、パケットフィルターなどによって ECHO パケットが破棄されている可能性もありますが、ping に対して正常に応答できるはずのホストが Request timed out を返した場合、経路上で PMTUD のための返答パケットが焼失した、すなわち "PMTUD ブラックホール" が検出されたことになります。

 

MTU 値の目安

MTU 値は、LAN では一般に 1,500 となるそうです。これは、イーサーネットにおける MTU の最大値のようで、Windows や Linux でも既定値として 1,500 が設定されています。

これが PPPoE の場合には、カプセル化のための 8 バイトを差し引いた 1492 が、NTT 東日本や西日本のフレッツ網では L2TP が関係するらしく 1454 が、その経路での MTU 値となるそうです。他にも、SoftBank ケータイの通信網では MTU は 1,300 になるとも言われています。

それ以外にも、経路上の都合によって MTU 値がさらに小さくなる場合もあるとのことでした。

なお、IP 上の MTU の最大は 65,535 になるそうです。

 

他にも、MTU の最小値というものもあるようで、現在のインターネットで一般的な IPv4 では、548 となるそうでした。