フラグメント
MTU(Maximum Transmission Unit)が小さなネットワークに転送する場合、パケットは分割されます。
本項では、フラグメントについて説明します。
フラグメントとは
MTUが1500byteのネットワークからそれより小さなネットワーク、ジャンボフレームを有効にしたネットワークから通常のネットワークに中継する際などに、パケットの分割が行われます。これを、フラグメントと言います。
フラグメント化されたパケットは、元のパケットに組み立てできるように情報が付加され、MACアドレスなどを追加して複数のフレームとして送信されます。フラグメント化されたパケットの組み立てはネットワークの途中ではなく、通信相手に届いた時に行われます。
フラグとフラグメントオフセット
IPパケットで示したヘッダー構造の内、フラグ部分にフラグメントされているかどうかの情報、フラグメントオフセット部分に全体の何バイト目からのパケットかを示す情報が入っています。
フラグは3ビットありますが、それぞれの意味は以下のとおりです。
- 1ビット目(Reserved bit)
- 予約で常に0。
- 2ビット目(Don't fragment)
- 途中でフラグメントさせない時は1。0はフラグメント可能。以降、このビットをフラグメント不可ビットと呼びます。
- 3ビット目(More fragments)
- パケットが続く時に1。最後のパケットでは0。
例えば、パソコンがフラグメント不可ビットを0にして送信して、ルーターで3つのパケットにフラグメントが必要とします。この場合、最初と2つめのパケットの3ビット目は1、3つめのパケットの3ビット目は0にして転送します。
フラグメントオフセットは、8バイトの整数倍で表します。上の図であれば、1つめのパケットのペイロードは80バイトの長さでフラグメント化されています。このため、2つめのパケットではフラグメントオフセットが10(= 80バイト ÷ 8バイト)になっています。3つめのパケットのフラグメントオフセットは、それまでのパケットのペイロード合計になるため、フラグメントオフセットは20になります。
受信側は、このフラグメントオフセットを見て、元のデータに組み立てを行います。
Path MTU Discovery
フラグメントはパケットの分割や再構築を行うため、ルーターにとって負荷が高い処理であり、できるだけ避けた方が好ましいと言われています。
フラグメントを禁止するには、フラグメント不可ビットを有効にして(1にして)送信します。ルーターはMTUが小さなネットワークに転送する必要があり、且つフラグメント不可ビットが有効になっている場合は、ICMP(Internet Control Message Protocol)というプロトコルによりMTUサイズを応答します。
パソコンは、ICMPで教えられたMTU値でパケットを構成するため、ルーター側でフラグメント化が発生しません。これをPath MTU Discoveryと言い、最近のパソコンではデフォルトになっています。
ICMPは、pingで利用されるプロトコルのため知っている方も多いと思いますが、このようにネットワークの情報交換のために利用されます。
関連ページ
- 応用編「IPパケット」
- IPパケットの構造とMTUについて説明しています。