データグラムをフレームにカプセル化し、複数のネットワークを経由する際、 フレーム形式の違いの問題が現れる。異なるネットワーク技術は、 異なるフレーム形式を使用しているので、異種ネットワークを接続する ルータはIPデータグラムをフォワードする時に、フレームを交換する必要がある。
各ハードウェア技術には、最大転送単位(Maximum Transmission Unit : MTU)が存在する。 MTUはフレームが運ぶことのできるデータ量、つまりIPデータグラムのサイズである。 ネットワークハードウェアは、MTUバイト以下のデータグラムを受信、及び送信しなければいけない。 例えば、MTU=1500のネットワークハードウェアでは、IPデータグラムを1500byte送信できる。 IPデータはIPデータグラムヘッダ分を除いた1480byte送信できることになる(ヘッダが20byteの時)。
そのままでは、ホストH1がホストH2へ1500byteのIPデータグラムを送信すると、 ネットワーク2はMTU=1000なので、ルータはこのデータグラムを送信できない。 そこでIPデータグラムを断片化(fragmentation)する必要がある。
IPルータはMTUの問題を解決するためにIPデータグラムをフラグメント(fragment) に分割する。
フラグメント化されたIPデータグラムには、もとの完全なIPデータグラムと ほとんど同じIPヘッダが付加(コピー)される。 変更されるのは、FLAGS、FLAGMENT OFFSETといったフラグメンテーション用のフィールドである。 (当然、TOTAL LENGTHや、HEADER CHECKSUMなども変更される)
インターネットプロトコルでは、最終的な宛先ホストにおいて フラグメントは再組み立てされるべきだと規定している。
主な理由として、
IPは配信を保証するものではないので、全てのフラグメントが確実に到着するわけではない。 また、フラグメントの到着順序もバラバラである。さらに、異なるIPデータグラムのフラグメントが 連続して受信されることがある。 つまり、受信したフラグメントがどのIPデータグラムのもので、そのIPデータグラムの どの部分のフラグメントであるかを知るための仕組みが必要になる。 そのために、IPヘッダの識別番号(IDENTIFICATION)と、 フラグメントオフセット(FRAGMENT OFFSET)が用意されている。 IPデータグラムの所属を判定するためには、IDENTIFICATIONの値および IP送信元アドレスが使われる。
受信者はフラグメントが紛失した際、本当に紛失したのか、
それともただ遅延しているだけなのかを知る方法がない。
もし、遅延しているとみなして永遠に待ちつづけるとすると、
それまでに到着したフラグメントのためにメモリを浪費することになる。
そこで、受信者は最初のフラグメントが到着するとタイマーを起動し、
タイマーが切れると受信したフラグメントを破棄するようにする。
タイマーが切れる前に全てのフラグメントを受信した場合は、データグラムを再組み立てする。
送信者は、フラグメントを意識しないので、
受信者が送信者にフラグメントの到着を知らせるようなことはない。
IPデータグラムがフラグメント化され、
その次のIPルータでさらに細かいフラグメントに分割されることがある。
この時、IPヘッダのFRAGMENT OFFSETがさらに小さくなるが、
基本的に元のフラグメントとサブフラグメントに違いはない。
これは、IPデータグラムの再組み立ての時に、フラグメントとサブフラグメント
の区別をしないで、1度に再組み立てできることを示している。
MTUが順次減少していくような場合、インターネットワークの設計が悪いといえる。