PR

IPフラグメンテーションとは?MTUとの関係・IPv4とIPv6の違いを解説

IPフラグメンテーション ネットワーク
スポンサーリンク

はじめに

IPパケットは、どのネットワークでも同じ大きさのまま送れるとは限りません。通信経路の途中に、現在のパケットより小さいサイズまでしか運べないリンクがあると、そのままでは転送できないためです。

このとき関係するのがMTUとIPフラグメンテーションです。ただし、IPv4とIPv6では「誰がパケットを分割できるか」が異なります。この記事では、IPv4で断片化と再構築が行われる仕組み、IPv6との違い、Path MTU Discoveryで断片化を避ける考え方を解説します。

IPフラグメンテーションとは

IPフラグメンテーションとは、1つのIPパケットを複数の小さな断片(フラグメント)へ分けて送る処理です。ネットワークではリンクごとにMTU(Maximum Transmission Unit)があり、そのリンクで一度に運べるIPパケットの大きさに上限があります。

例えば、送信元からは大きなパケットを送れても、途中のリンクのMTUが小さければ、そのサイズに収まらないパケットをそのまま転送できません。IPv4では条件によって送信元や途中のルーターがフラグメンテーションできますが、IPv6では途中のルーターはフラグメンテーションしません。

IPパケットがネットワーク層でどのように宛先まで転送されるかは、IPとは?ネットワーク層の役割やルーティングを初心者向けに分かりやすく解説で解説しています。

IPv4でフラグメンテーションが起きる流れ

IPv4では、パケットが次のリンクのMTUを超えていて、かつDF(Don’t Fragment)フラグで分割が禁止されていなければ、途中のルーターがパケットをフラグメントへ分割できます。

例えば、MTU 9000のリンクからMTU 1500のリンクへ、IPv4ヘッダーを含めて8220バイトのパケットを転送するとします。そのままではMTU 1500のリンクへ送れないため、ルーターは各フラグメントが1500バイト以下になるように分割します。分割後の各フラグメントには、それぞれIPv4ヘッダーが付与されます。

MTU 9000のリンクからMTU 1500のリンクへ転送する際、IPv4パケットをルーターで6つのフラグメントに分割する図
図1 IPv4で経路のMTUに合わせてフラグメンテーションする例

ルーターは分割したフラグメントを元のパケットへ戻してから次へ送るのではなく、それぞれを独立したIPパケットとして転送します。さらに小さいMTUのリンクを通る必要があれば、IPv4ではフラグメントが再び分割される場合もあります。元のパケットへの再構築は最終的な受信先で行います。

分割されたIPv4パケットはどう再構築されるか

受信側は、IPv4ヘッダーにあるIdentification、MF(More Fragments)、Fragment Offsetなどの情報を使って、複数のフラグメントを元のパケットへ再構築します。

Identificationは、送信元・宛先・Protocolなどの情報と組み合わせて、どのフラグメントが同じ元パケットに属するかを識別するために使われます。Fragment Offsetは各フラグメントが元のデータのどの位置にあったかを示し、MFは後続のフラグメントがあるかを示します。これらを組み合わせることで、受信側は断片を正しい位置へ並べられます。

IPv4ヘッダーの各フィールド自体の役割は、IPv4ヘッダーとは?各フィールドの役割を図解でわかりやすく解説で解説しています。

途中でフラグメントの一部が失われると、受信側は元のIPパケットを完全には再構築できません。IPは失われたフラグメントだけを再送する仕組みを持たないため、必要な再送などは上位層の仕組みに委ねられます。

IPv4とIPv6ではフラグメンテーションの扱いが違う

IPv4とIPv6で最も重要な違いは、途中のルーターがフラグメンテーションするかどうかです。

項目IPv4IPv6
途中ルーターでの分割DF=0なら可能行わない
MTUを超えて転送できない場合DF=1なら破棄し、ICMPで送信元へ通知破棄し、ICMPv6 Packet Too Bigで送信元へ通知
断片化情報IPv4ヘッダーのIdentification、Flags、Fragment Offsetなど送信元がFragment Headerを付ける
再構築最終的な受信先で行う最終的な受信先で行う

IPv6では、ルーターが経路途中でパケットを小さく分割することはありません。大きすぎるIPv6パケットを受け取ったルーターはそのパケットを破棄し、Packet Too Bigメッセージで送信元へ通知します。必要に応じてフラグメンテーションする場合も、処理を行うのは送信元です。

そのため、「MTUを超えたら途中のルーターが分割する」という説明はIPv4には当てはまる場合がありますが、IPv6へそのまま当てはめることはできません。

Path MTU Discoveryで断片化を避ける

実際の通信では、できるだけ途中でフラグメンテーションが発生しないよう、送信側が経路に合うパケットサイズを使うことが重要です。そのための仕組みがPath MTU Discovery(PMTUD)です。

Path MTUは、送信元から宛先までの経路にあるリンクのうち、最も小さいMTUです。PMTUDでは、経路上でパケットが大きすぎて転送できないことが分かると、その情報を送信元へ返し、送信側が以降のパケットサイズを小さくします。

IPv4ではDFを設定したパケットがMTUを超えると、ルーターはパケットを破棄してICMPで通知できます。IPv6ではルーターによるフラグメンテーション自体を行わず、ICMPv6 Packet Too Bigで送信元へ通知します。どちらも、送信側が経路に収まるサイズへ調整することで、途中の断片化を避ける方向へ動作します。

TCPでは、得られた経路MTUに合わせて送信するセグメントの大きさを調整できます。ここで重要なのは、PMTUDが「最小MTUを事前に検索して、そのサイズへIPパケットを分割する処理」ではなく、転送できないサイズを検知しながら送信サイズを調整する仕組みだという点です。

IPフラグメンテーションをできるだけ避ける理由

フラグメンテーションは、大きなIPパケットを小さいMTUの経路へ通すために必要な仕組みですが、常に積極的に使うものではありません。

分割すると各フラグメントにIPヘッダーが必要になり、処理するパケット数も増えます。また、1つのフラグメントが失われるだけでも元のパケットを再構築できなくなるため、通信効率や安定性へ影響することがあります。ネットワーク機器やファイアウォールなどがフラグメントを適切に扱えない場合もあります。

そのため、送信側で経路のMTUを考慮し、可能な限りフラグメンテーションに依存しないサイズで送ることが基本です。

まとめ

IPフラグメンテーションは、IPパケットを経路のMTUに収まる大きさへ分割する仕組みです。IPv4ではDFで禁止されていなければ途中のルーターでも分割できますが、IPv6では途中のルーターは分割せず、送信元だけが必要に応じてフラグメンテーションします。

分割されたIPv4パケットは、Identification、MF、Fragment Offsetなどを使って最終的な受信先で再構築されます。一方、実際の通信ではPath MTU Discoveryなどを利用して送信サイズを調整し、途中のフラグメンテーションをできるだけ避けることが重要です。

関連記事


タイトルとURLをコピーしました