図 MTUサイズは大きすぎても小さすぎても効率が悪い
図 MTUサイズは大きすぎても小さすぎても効率が悪い
[画像のクリックで拡大表示]

 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サイズだとわかるわけだ。