MTUを超えたパケット

最近のこと。
1000Base-TGbEで構成されたネットワーク上の通信を調べるために、Linux上でtcpdumpを使って、キャプチャしていた時のことです。奇妙なことに気付きました。
あるファイル転送ソフトの通信なのですが、ファイルの送信ノードに比べて、受信ノードの方が、かなりパケット数が多いのです。
しかも、よく見ると len ( IPデータグラムサイズ ) が 4,000超の送信パケットがあります。たまに 60,000超のもあったり。件のネットワークではジャンボフレームを使っていないため、MTUは標準の1,500のはず。*1いや、ジャンボフレームを使っていたとしても、60,000超はありえません。MTUを超えたパケット、これはどうしたことでしょうか。
一方、受信ノード側のキャプチャを見ると、対応するパケットは、全て len が 1,500 になっています。…どこかで分割されているということか。でもスイッチやルータとは考えにくいし。
気になって色々検索をかけても分からなかったのですが、NICのドライバの情報から答が見つかりました。
それは、TSO ( TCP Segmentation Offload ) というNICの機能*2で、NICがハードウェア処理として、巨大なパケットを、TCPとして整合が取れるように、送信時に分割していたようなのです。
なぜ tcpdump で巨大パケットとして見えてしまったのかというと、それは、NICに渡されるデータ、つまりNICが分割する前のデータをキャプチャしているから、ということになるのでしょう。
いやはや、今まで全く知りませんでした。
取り敢えず、知らないところでパケットが分割されるのも気持ち悪いので、通信の調査の時は TSO を無効化することにしました。

*1:勿論、NICの設定でMTU1,500であることは確認しています。“ip link list”もしくは ifconfig といったコマンドで調べることができます

*2:“ethtool -k eth0”等のコマンドで、TSOが有効かどうかを確認できます。無効にする場合は、“ethtool -K eth0 tso off”で