IPの規格では,IPパケットの最大サイズは6万5535バイトと定義されている。しかし,実際にIPパケットをやりとりするときは,送り出す回線の種類によって,IPパケットの最大サイズは決まってしまう。例えば,イーサネットとPPP(point to point protocol)は1500バイト,PPPoE(PPP over Ethernet)は1492バイト——といった具合だ。このIPパケットの最大値をMTU(maximum transmission unit)と呼ぶ。そして,通信で最適なMTUのサイズを調査するしくみが「経路MTU探索」という機能である。
通常TCP/IPでは,通信を始めるときにMTUサイズを決める。まず,通信相手に自分のMTUサイズを伝える。すると,相手からも相手側のMTUサイズが返ってくる。この二つの値を比べて小さいほうのMTUサイズを採用するしくみになっている。
このときMTUサイズが極端に小さいと,データ・サイズの小さなパケットを大量にやりとりすることになる。こうなると,データ・サイズに対してヘッダー部分の比率が高くなってしまい,効率が悪くなる(図)。さらに,パケットとパケットの間の隙間の数も増える。このように,データを送るためにそれ以外の余分な部分が多くなり,結果的にスループットが低下してしまう。
では,送信側と受信側のMTUサイズが同じなら,その値が通信に最適な値かというと,そういうわけにはいかないケースがある。それは,経路の途中で,MTUサイズの小さい回線を通る可能性もあるからだ。
IPパケットはIPネットワークを構成するルーターが中継することで相手まで届く。ルーターが受け取ったパケットを転送するとき,送り出す回線のMTUサイズよりパケットのサイズが大きいと,その回線で送れるサイズにパケットを分割してから送信する。こうすると,パケットの数が増えるだけでなく,ルーターに負荷をかける。場合によってはこの分割処理がスループットに影響を与える。
それでは,小さすぎず大きすぎず,スループットが最大になるMTUサイズとは,どのような大きさなのか。それは,「パケットを経路途中で分割せずに送れる最大サイズ」である。その値を探るのが経路MTU探索だ。Windowsでは常に経路MTU探索が動いている。
経路MTU探索の具体的なしくみはこうだ。送信側はまず,分割禁止に設定したサイズの大きなICMP(internet control message protocol)パケットを通信相手に送る。サイズが大きいと,途中のルーターから「分割しないと送れない」というエラーが返ってくる。そこで送信側は,パケット・サイズを少しずつ小さくしながら,分割禁止のICMPパケットを送る。送信側は,ルーターからのエラー・メッセージではなく,通信相手から応答が返ってくるまでこれを繰り返す。通信相手から応答が返ってきたら,そのICMPパケットのサイズが最適なMTUサイズだとわかるわけだ。