以下の内容はhttps://tamasan238.hatenablog.com/entry/2025/07/05/170251より取得しました。


IPフラグメンテーションとTCPセグメンテーション,UDPの場合,TSO/LRO/UFO/GSO/GRO

巨大なペイロードTCP/UDPで送信するとき,

  • TCP
    • TCPセグメンテーションが機能する.これにより,送出側ホストでペイロードを分割して複数のTCPパケットで送出する.
    • ただし,何らかの理由でこれが十分に機能しない場合,IPフラグメンテーションが作動する.これにより,1つのTCPパケットが複数のIPパケットに分割されて送信される.
  • UDP
    • UDPには,TCPセグメンテーションのような機能がない.
      したがって,送出するアプリケーション側できちんとペイロードサイズを制御する必要がある.
    • これが十分でない場合には,TCPと同様にIPフラグメンテーションが作動し,1つのUDPパケットが複数のIPパケットに分割して送信される.

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

実機で確認

$ netperf -H TARGET_HOST_IP -t TCP_STREAM -- -m 65477
$ netperf -H TARGET_HOST_IP -t UDP_STREAM -- -m 65489

のように,netperfでメッセージサイズを大きくした状態でスループット測定を走らせた.

経路上のL2 SWでミラーポート設定を行い,Wiresharkで見てみると次のようになった.

  • TCP
    • MTU(1514 bytes)と同サイズのEthernetフレームが多数.各パケットのペイロードサイズがきちんと小さくなっていた.
    • DFビットOn.
  • UDP
    • MTU(1514 bytes)と同サイズのEthernetフレームが多数
    • Wiresharkでリアセンブルに成功し[Reassembled in xxxxx]と表示されるパケット群と,パケットが一部欠落しリアセンブルできず,当該表記のないパケット群が見受けられた.
    • DFビットOff.

関連技術




以上の内容はhttps://tamasan238.hatenablog.com/entry/2025/07/05/170251より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14