インターネットでデータをやり取りする場合,さまざまなリンク(Ethernet,FDDI,ATMなど)で構成されるLANやWANを通過している。それぞれのリンクは,データの最大転送単位(MTU:Maximum transmission Unit)のサイズが異なる。送信ノードからあて先ノードまで,経路上にいくつかのリンクが存在する場合,それぞれのリンクMTUの値は異なることがある。このようなとき,もっとも小さい値のリンクMTUを経路MTUと呼ぶ。この経路MTUを調べる手段が経路MTU探索である。

 例えばEthernetのリンクMTUは1500オクテットであり,FDDIのリンクMTUは4352オクテットである。このため,1500オクテットを超えるデータは,FDDIのネットワークからEthernetのネットワークへそのままでは転送できない。EthernetのリンクMTUに合わせてデータを分割して送信しなければならなくなる。

 こうした手間を省くには,あらかじめ経路MTUを調べておき,送信するデータのMTUを経路MTUにすればよい。こうすれば,中継の途中でパケットを分割しなくてすむ。経路がEthernetとFDDIで構成されている場合,経路MTUは1500オクテットとなるので,EthernetでもFDDIでもそのまま中継できるというわけである。

 IPv6では,パケットの分割は送信ノードで行われるので,経路MTU探索は送信ノードが実行する。しくみは次のようになる。まず送信ノードは最初の中継点のMTUを経路MTUと仮定し,あて先ノードが同一種類のリンク上にあると見なす。送信ノードはこの仮定に基づいてあて先ノードにパケットを送信する。そして,ICMPv6 Packet Too Bigメッセージが返信されなければ,仮定した経路MTUを正しいと判断してパケットを送信し続ける。

 もしICMPv6 Packet Too Bigメッセージが返信された場合は,それに含まれるMTUの値に経路MTUを設定し直してからパケットを再送する。そして,ICMPv6 Packet Too Bigメッセージが返信されないことを確認する。この一連の処理を繰り返し,最終的にICMPv6 Packet Too Bigメッセージの返信がなくなった段階で経路MTUが決まる。

 経路MTU探索はIPv6においてほぼ必須の機能である。ただしIPv6では,リンクMTUは1280オクテット以上でなければならないと定義されているので,すべてのデータを1280オクテット単位で分割化処理すれば,経路MTU探索を省略できる。

 通信経路を変更すれば経路MTUが変わることもある。この変更は,定期的にMTUを大きくして経路MTU探索を再試行すれば見つけられる。なおIPv6では,リンクMTUが1280オクテット以上でなければならないので,MTUが1280オクテットより小さいICMPv6 Packet Too Bigメッセージを受け取っても,経路MTUをその値にまで減少させるべきではない。

 TCPの場合,データの最大セグメント長(MSS:Max Segment Size)をあて先ノードに通知することによって,TCPのデータ・サイズを指定できる。これを利用し,IPパケット長が経路MTU以下になるようにMSS値を設定すれば,TCPパケットの分割を防ぐことも可能である。例えばMSSを1000で通知すれば,IPヘッダと拡張ヘッダを付加してもIPパケット長は1280オクテットを超えない。

 送信ノードからあて先ノードまでの経路上に,IPv6オーバーIPv4トンネルなどを含む場合は,IPv6パケットをIPv4パケットで包むので,データサイズがEthernetのリンクMTUを超えないように,トンネルエンドポイントのルータで適切な経路MTUを設定しなければならない。

(尾添靖通▼横河電機 IT事業部 ITプロダクト事業センター)