- TCP
- TCPセグメンテーションが機能する.これにより,送出側ホストでペイロードを分割して複数のTCPパケットで送出する.
- ただし,何らかの理由でこれが十分に機能しない場合,IPフラグメンテーションが作動する.これにより,1つのTCPパケットが複数のIPパケットに分割されて送信される.
- IPv6では,ホストでのみIPフラグメンテーションが可能.中間ルータ/L3 SWでは行わない.
- UDP
IPフラグメンテーションについて
IPフラグメンテーションの過程で,リアセンブル(再組み立て)できるよう次の処理が行われる.
- 分割したすべてのパケットのIPヘッダ内Identificationフィールドに対し,元のIPヘッダの同フィールド値を記す.これによって,リアセンブル時に元のパケットを区別する.
- 最後を除く各パケットのIPヘッダでMFビット(More Fragment bit)が立ち,別途届く他のパケットを組み合わせる必要があることを示す.
- IPヘッダ内Fragment Offsetフィールドに,このパケットのペイロードが元のパケットのどの位置からを担っているのかを示す.これによって,同一IDを有する複数の分割済みIPパケットを,どの順番でリアセンブルすればよいのかを識別する.
ただし,
- リアセンブル時にフラグメント後のIPパケットが一部欠損している場合,リアセンブルは失敗し同一IdentificationをもつすべてのIPパケットは破棄される.
- IPヘッダのDFビットが立っている場合,IPフラグメンテーションは行われない.したがって,対応できない場合にはそのパケットは破棄される.
- Path MTU Discovery(ICMPで動作)を行う際や,多くのケースでTCPパケット送出時にDFビットが建てられる.
- TCPでDFビットを立てるのは,TCP使用時にIPフラグメンテーションが発生すると,分割後のパケットが1つでも欠落した場合にはじめから送り直すこととなり効率が大変悪いため.(TCPセグメンテーションで完璧に分割すべき)
- 一部のケースでは,DFビットを無視してフラグメントするケースもある.
例:Ethernet over IP機能 : FAQ : UNIVERGE IXシリーズ | NEC
- Path MTU Discovery(ICMPで動作)を行う際や,多くのケースでTCPパケット送出時にDFビットが建てられる.
実機で確認
$ netperf -H TARGET_HOST_IP -t TCP_STREAM -- -m 65477
$ netperf -H TARGET_HOST_IP -t UDP_STREAM -- -m 65489
のように,netperfでメッセージサイズを大きくした状態でスループット測定を走らせた.
経路上のL2 SWでミラーポート設定を行い,Wiresharkで見てみると次のようになった.