フラグメンテーション

読み:ふらぐめんてーしょん / 英語表記:IP fragmentation

IPパケットが回線のMTUを超える場合などに、元のパケットを複数の小さなIPパケット(フラグメント)へ分割する処理。IPv4では送信元や途中のルーターが行えるが、IPv6では送信元だけが行い、分割したパケットは宛先で再組み立てされる。

イマシルちゃんの解説

ネットワークでは、データをIPパケットというまとまりにして送るんだ。
でも、回線には一度に運べるパケットの大きさに上限があるよ。
大きすぎるIPパケットを小さなパケットに分けて送る処理を、フラグメンテーションというんだ。

分けたパケットには、元のデータのどの位置にあたるかを示す情報が付いているの。
受信した機器はその情報を使って、元のパケットに組み立て直すんだよ。

ただ、分けたパケットが一つでも届かなければ元に戻せなくなるから、なるべく分割せずに送れるように工夫されているんだ。

より深い解説

定義

フラグメンテーション(フラグメント化)は、IPv4で、パケットの大きさが送出するインタフェースのMTUを超える場合に、データ部を分割して、それぞれにIPヘッダーを付けた複数のパケット(フラグメント)にする処理である。途中のルータは組み立て直さず、最終的な宛先のホストだけが再組み立てを行う。

分割に使うIPv4ヘッダーのフィールド

フィールド役割
識別子(Identification)元が同じパケットのフラグメントに、同じ値を付ける
DFビット(Don't Fragment)1のとき、分割を禁止する。MTUを超えたら、ルータはパケットを捨てて、ICMPで送信元に知らせる
MFビット(More Fragments)1のとき、後ろにまだフラグメントが続く。最後のフラグメントは0
フラグメントオフセットこのフラグメントのデータが、元のデータのどの位置にあたるかを、8オクテット単位で示す

分割の計算例

IPヘッダー20オクテット、データ3,000オクテットのパケットを、MTU 1,500の回線に送る場合

フラグメントデータ長オフセットMF
1つ目1,48001
2つ目1,4801,480 ÷ 8 = 1851
3つ目402,960 ÷ 8 = 3700

最後のフラグメント以外のデータ長は、オフセットを8オクテット単位で表すため、8の倍数にする。

分割の問題点

問題内容
効率の低下フラグメントごとにIPヘッダーが付き、ルータや受信側の処理の負荷が増える
損失への弱さフラグメントが1つでも失われると、元のパケット全体が使えなくなる(TCPなら全体を再送する)
セキュリティ2つ目以降のフラグメントにはTCPやUDPのヘッダーがないため、ファイアウォールで検査しにくい。重なり合うフラグメントで検査をすり抜ける攻撃もある

そのため、TCPでは、MSSやパスMTU探索によって、最初から分割の不要な大きさで送るのが一般的である。

IPv6のフラグメント

IPv6では、途中のルータは分割しない。MTUを超えるパケットを受け取ったルータは、パケットを捨てて、ICMPv6のPacket Too Bigを送信元に返す。分割が必要な場合は、送信元が、フラグメントヘッダー(拡張ヘッダーの1つ)を使って分割する。

TCPのデータ長の求め方

「フラグメント化されることなく送れるTCPのデータの最大長」は、MTUからIPヘッダーとTCPヘッダーを引いたMSSである。MTUが1,500オクテットなら、1,500 − 20 − 20 = 1,460オクテットになる。

実際の試験ではここに出る!全7問

ネットワークスペシャリスト

午後Ⅰ
午前Ⅱ

この用語が出てくる記事

↑