今のインターネットは分割しない
このIPの役割については,話にまだ続きがある。今のインターネットでは,パケットを分割するというIPの機能を使わないのが一般的なのである。送信元パソコンのIPが,途中で分割されないで済む大きさのIPパケットを最初から作るようにしているのだ。なぜ,IPのもともとの役割を無視して分割しないようにするのかというと,IPパケットの分割には弊害があるからだ。一つは,IPパケットを分割するルーターに負荷がかかること。MTUの値が極端に違う回線同士を相互につないでいるルーターは,IPパケットを転送するたびにパケットの分割処理もすることになる。こうなると,本来の転送処理に専念できなくなってしまう。
図7 分割するとデメリットが生じる パケットを送信してからあて先に届く間にはさまざまな回線があり,回線が細くなるたびにルーターはパケットを分割するはめになる。分割はルーターにとって負荷がかかる。また,必ずしも分割した結果が最大に送れるデータ量になるとは限らない。つまり端切れのパケットにもヘッダーを付けることになり,転送効率も落ちる。 |
一番小さいMTUに合わせて送信
分割しないメリットはわかったが,送信元パソコンのIPは,途中で分割されないIPパケットの大きさ(経路MTUという)をどうやって知るのだろうか。送信元パソコンのIPが知っているのは,自分が直接つながっている回線のMTUだけである。
そこで送信元パソコンのIPは,経路MTU探索と呼ぶ手法を使う。簡単にいうと,何度か試しのIPパケットをあて先に送って,途中で分割されない最大サイズを見つける手法だ。
もう少し詳しく確認しておこう。経路MTU検索は,先ほど紹介したIPヘッダー中のフラグ・フィールドと役割2で紹介したICMPというプロトコルを活用する。
まず送信元パソコンのIPは,自身がつながっている回線のMTUに合わせたIPパケットを送り出す。このとき,フラグ・フィールドに「パケットの分割禁止」の情報を書き込んでおく。つまり,フラグ・フィールドの2ビット目を1にしておく。
図8 経路MTU検索と呼ぶ方法で経路上で一番小さなMTUを見つけ出す 回線の都合で分割しなくてはならない場合,ルーターのIPはこれ以上転送できない旨をICMPと呼ぶプロトコルで送信元に知らせる。このとき送れなかった回線のMTUも知らせる。そこで今度はそのサイズに合わせて送信元のIPが送る。これを繰り返すことで最終的に途中で分割されないパケットの大きさがわかる。 |
このICMPメッセージが通知されたら,送信元パソコンのIPは転送できなかったパケットを分割し,通知されたMTUにまで小さくして(やはり分割禁止フラグは1),送信し直す。こうすれば,先ほど分割できなくて転送されなかった回線の先まで届くようになる。
でも,その先にもっと小さいパケットしか運べない回線があると,また転送できなかったこととMTUの値を知らせるICMPメッセージが返ってくる。そうしたら,送信元パソコンのIPはこのMTUに合わせたIPパケットに作り直し,分割禁止フラグを1にして送り出す。こうした作業を何度か繰り返せば,最終的にはあて先までパケットが届くようになり,MTUがわかる。
ここまで来れば,あとは基本的に分割されないので転送できなかったというICMPのエラー・メッセージは戻ってこない。したがって,送信元パソコンのIPは,このMTUでIPパケットを送り続けられる。
ただし,インターネットでは,あて先まで到達する経路が一つとは限らず,いつも同じ経路を通る保証もない。経路が変わって,もっと小さなMTUの回線を通るときには,また同じようにICMPメッセージが返ってくる。この場合,今度はそれに合わせたIPパケットを送信元パソコンのIPが作ることになる。