Tips

2017.08.31

ネットワーク用語/IPフラグメンテーション

IPフラグメンテーション

IPフラグメンテーションとは、ネットワーク機器がIPパケットを送信や転送する際に、送信できるパケットサイズを超えるIPパケットを分割して処理することです。

図1 IPフラグメンテーション

1回のフレームで送信できる最大サイズをMTUといいます。MTUはフレームの最大サイズからL2ヘッダとトレーラを引いたサイズとなるため、IPパケットの最大サイズがMTUともいえます。
このMTUのサイズはリンクのカプセル化により異なります。
例えばEtherenetの場合、デフォルトではMTUが1500バイトなので1回のフレームで送信できるIPパケットのサイズは
1500ということになります。
それに対してPPPoEの場合、EthernetヘッダとFCS以外にPPPoEヘッダが付与されるため、MTUは1492となります。
こうしたMTUのサイズが異なる場合等にIPパケットのフラグメント化が行われます。

IPフラグメンテーション問題点

フラグメント化されたIPパケットを元の状態に戻すのは途中のルータではなく、宛先の端末となります。
そのためフラグメントを行うルータやフラグメントされたパケットを再構築する宛先端末に負荷がかかります。
また経路上にフラグメントを禁止している機器がある場合、そこから先への通信ができなくなります。

図2 IPフラグメンテーションの問題

フラグメント化の際の動作

フラグメント化されたパケットは受信先で再構築する必要があります。そのためにIPヘッダには、そのパケットが分割されていることや分割した際のどの部分なのかを表す情報を格納するフィールドがあります。
IPヘッダのIdentification、Flags、Fragment Offsetがその情報を格納するフィールドとなります。

・Identification
送信元でIPパケットを識別するための値を格納するのがこのフィールドです。16ビットのフィールドです。
フラグメント化されて届いたパケットのこの値が同じであれば、元は同じIPパケットだったことがわかります。

・Flags
制御用のフラグが格納されるのがこのフィールドです。3ビットのフィールドで最初の1ビット目は0となります。
 2ビット目はDF(Don’t Fragment)ビットとなっており、このビットが0となっているパケットは分割してもよいということになります。
1となっている場合は分割をしてはいけないことを表しています。
 3ビットはMF(More Fragments)ビットとなっており、このビットが0となっているパケットはフラグメントの最後を意味します。1となっている場合は、途中のフラグメントを意味しています。

・Fragment Offset
分割前のパケットのどの位置のデータなのかを表す値が格納されるフィールドです。分割された先頭のデータは0となり、後ろのデータは何バイト目なのかを表す値が格納されます。


MTU1500の環境でMAXサイズのIPパケットが先頭24バイトと後ろ1456とに分割された場合

図3 フラグメントの例

今回の図ではL3ヘッダ(IPヘッダ)も図示しています。
MTU1500なのでIPヘッダ20バイトを引くとデータの部分は1480となります。送信元でIdentificationが1477と設定されていたとします。
このデータが24バイトと1456に分割されたとした場合、この2つの分割されたパケットのIPヘッダのIdentificationは
同じ1477となります。受信した側では1477となっているデータを再構築すれば元のデータに戻せることになります。
最初の24バイトの方は後続のデータがあるのでFlagsの部分の3ビット目が1となります。Fragment Offsetは先頭なので0となります。
2つ目のデータはこれ以上フラグメント化されたデータがないのでFlagsは3ビットとも0となります。
Fragment Offsetの方は、先頭から24バイト目のデータなので24となります。
こうしたデータがIPヘッダに含まれることで受信先で元のデータに再構築することができます。

Recent News

Recent Tips

Tag Search