今回は小ネタです。
日本のブロードバンド回線のMTU値は一般的なEthernetにおける1500Byteではなく、
・PPPoE : 1454 Byte
・IPoE:1460Byte
となっています。
上記MTU値を超えた通信はもちろん不可なのですが、クライアント(PC)はどのようにしてこのMTU値を知り通信を行っているのでしょうか。
PMTUD(Path MTU Discovery)
これはICMPのHost Unreachableの仕組みを使って通信を行う通信経路上の最小のMTU値を端末に対して知らせる機能となります。
PMTUDが有効な端末(クライアント)はInternetへ通信を行う際、IPのDFフラグをONにします。
例えば、クライアントが1500ByteのパケットをInternet上のサーバーに送信するとします。
DFビットをONにしておくことにより、PPPoEルータでその先のPPPoE回線のMTUが1454Byteであった場合に、DFビットによりフラグメントは許可されていないのでこれ以上上信することができないため、その旨をICMPを使って送り返します。
そのICMPパケットの中にMTU値を入れて送り返すためクライアントは適切なMTU値を知ることが可能になるわけです。
各種OSの実装
PMTUDを機能させるためには、そもそもクライアントがDFビットを立ててくれないと始まりません。
各OSでパケットキャプチャを行ってみました。
残念ながら私はAndroid端末を持っていないので確認することはできましたが、現在一般的に使われているOSではIPパケットにはDFビットがセットされていることが確認出来ました。
PMTUDは完全では無い
このPMTUDによりMTU値が小さい回線を利用する場合においても適切にパケットサイズを調整して通信が行えることが分かったかと思います。
ですが、このPMTUDは完全ではありません。
Routerの設定によりICMP Host Unreachableを応答しない場合があるためです。
これはICMP Black holeと呼ばれる事象です。
RouterからICMPの応答が返ってこないためクライアントは適切なMTU値を知ることができず大きなPacketサイズで送り続けてしまうことになります。
また、Firewall等でICMPが遮断されている場合にも同様にICMP Black Holeが発生してしまいます。