IPは大きなデータを送るとき,データを複数に分割してパケットのデータ部分に入れる。これが三つ目の役割である。IPがパケットの大きさをどのように決め,必要に応じて分割していく様子を見ていこう。

回線でパケットの最大値が決まる

 インターネットはさまざまな回線で構成されている。パソコンがつながっているLAN回線だけでも,イーサネット,無線LANなど何種類もある。WAN回線ならADSLのところもあれば,電話回線やISDN,専用線など数え切れない。こうした回線は,それぞれでしくみも違えば,出せるスピードも違う。

 しくみが違うから一度に運べるデータのかたまりの大きさ(フレーム・サイズ)も違う。例えば,イーサネットのフレーム・サイズは最大1518バイトである。ということは,このサイズ以下のIPパケットをIPが作らないと,回線にパケットを送り出せない。実際には,イーサネットのフレームにも,ヘッダーなどで18バイト分が付くので,フレームに入れられるIPパケットのサイズはこれを差し引いた最大1500バイトになる。この最大サイズのことはMTUと呼ばれ,回線に直接データ信号を送り出すLANボードやLANドライバ・ソフトが知っている。

 そこで,パソコンやルーターで動いているIPは自身がつながっている回線のMTUをLANボードやドライバ・ソフトに問い合わせて,あらかじめ調べておく。

 そして,IPはできるだけ大きなかたまりのままIPパケットを送ろうとする。1個のパケットごとにヘッダーが付くため,かたまりが小さいと1パケットに入れられるデータ部分の割合が減り,転送効率が落ちてしまうからだ。

 このため,送信元パソコンのIPは,自分とつながっている回線が許す限り大きなIPパケットを作って送る。つまり,イーサネットにつながった送信元パソコンのIPなら,1500バイトのIPパケットを作ってLANへ送り出す。

ルーターのIPが回線に合わせて分割

 ところが,インターネットはイーサネットだけで構成されているわけではない。あて先にたどり着くまでには,さまざまな回線を通る。中には,イーサネットほど大きなかたまり(MTU)のまま伝送できない回線もある。

 こうなると,その回線で運べる大きさまでIPパケットを小さく分割してやらなければならない。どこで分割するかというと,分割しないと先へ進めなくなる境界点,つまり異なる回線同士を相互につなぐ中継所であるルーターだ。つまり,ルーターで動いているIPが,自分につながっている回線に応じて転送先の回線に合うようにパケットを分割する。

図5 ここで登場するIPヘッダー
IPヘッダー中には,パケットを分割しこれを再び元に戻すためのパラメータである識別子,フラグ,オフセットが書かれている。長さはそれぞれ,16ビット,3ビット,13ビットである。
図6 パケットを分割するメカニズム
ヘッダーも含んだ大きさが,これから送ろうとするLANや回線のMTUを超えないようにする。最終的に届いたあて先でもう一度合体できるように,元のパケットがなんだったのか(「識別子」),分割した場所は元のパケットのどの位置なのか(「フラグ」,「オフセット」)をヘッダーに書き込んでおく。
 さらに,ルーターのIPは単にパケットを分割するだけでなく,分割時の状況を制御情報としてIPヘッダーに書き込む(図5[拡大表示])。最終目的地である受信側パソコンのIPが分割されたパケットを元の形に戻せるようにするためだ。

 IPの三つ目の役割は,ルーターのIPが転送先の回線に合わせてパケットを分割し,制御情報を書き加えることなのである。

受信側で元に戻せる情報も付ける

 では,IPがパケットを分割する仕事を実例に沿って確認していこう。

 IPヘッダーが20バイト,データが1480バイトである合計1500バイトのIPパケットをルーターが受け取ったとしよう。これを900バイト以下のIPパケットしか1度に運べない回線に転送するようなケースである(図6[拡大表示])。

 1500バイトのIPパケットは,MTUが900バイトの回線にそのまま転送できないので,ルーターのIPはパケットの分割作業に入る。

 まずIPは受信パケットのデータ部を切り出し,先頭から880バイト分で切り離す。900バイトに20バイト足りないと思うが,20バイト分空けておかないとIPヘッダーを加える余地がなくなってしまう。データ部に20バイトのヘッダーを付加すれば,1個のIPパケット(大きさは900バイト)ができあがるわけだ。

 残りのデータは600バイトになるので,こちらにはIPヘッダーを付ければいい。もし,送り出したい回線のMTUより残りのデータが大きければ,また分割する。

 さらにルーターのIPは,IPヘッダーの一部を書き換える。分割したIPパケットを受信側パソコンのIPが元に戻せるようにするためである。具体的には,識別子,フラグ,フラグメント・オフセットという三つのフィールドの情報を使う。

 識別子とは,IPパケットを特定するためのID番号だ。送信元パソコンのIPがほかのIPパケットと重複しないように1個1個違う番号を付ける。ルーターのIPがパケットを二つに分けても,分割したパケットのヘッダーに書く識別子の値は,二つとも分割前のパケットに書かれていた値と同じにする。こうすれば,受信側パソコンのIPが二つに分かれたパケットを受信しても,それらが元は同じパケットだったことがわかる。

 フラグメント・オフセットは元のIPパケットをどこで分割したかを表す情報だ。分割前のパケットのデータ部分の先頭から数えて,何バイト目から切り取ったIPパケットなのかを,分割したルーターのIPが書き込む

 先ほどの例だと,1個目のIPパケットには,元のIPパケットの先頭からのデータが入るのでフラグメント・オフセット値は0,2個目のIPパケットのヘッダーには880バイトから始まっていることを示す値(10進数表記では110)が入る。こうすれば,送る途中で2個に分割されたパケットの順番が入れ替わっても,受信側パソコンのIPは正しい順番に並べ替えることができ,抜けている部分もわかる。

 フラグは,途中でどのような分割処理をしたかを表す情報が書き込まれる。このフィールドは3ビット分あり,最初の1ビット目は必ず0(意味はない),2ビット目は分割可能なパケットなら0,分割してはならないパケットなら1がセットされる。そして3ビット目は,分割されたパケットの場合の最後かどうかを表す。この例だと,分割された1個目のパケットのヘッダーには1,2個目(最後)のパケットには0をルーターのIPがセットする。これで,受信側パソコンのIPが元に戻すときに,分割されたすべてのパケットを受信できたかどうかがわかる。

 なお,分割されたパケットは,その先のルーターのIPが,さらに再分割することはある。しかし,途中のルーターのIPが複数のパケットを集めて1個のパケットに組み立て直して転送することはない。組み立て直す作業は,最終到達地点である受信側パソコンのIPの仕事である。