WiresharkでMTU超えの大きすぎるパケットがキャプチャーされてる!
Linux(CentOS on Let's note)上でRawソケットでキャプチャーをしていたら,64,294バイト(約64KB)とかMTUを軽く超えるパケットが送信されているのを発見!
いやいや,そんなバカな,と思いつつ,Wiresharkでも確認してみたらやっぱりありました.MTUを超えた大きなパケットが.
MTUを超えるサイズのパケットはIP層でフラグメントされてMTUサイズ以下にされるはずなのにおかしい.
RawソケットもWiresharkもIP層の下でパケットをキャプチャしているはずだから,フラグメント後のパケットをキャプチャーできるはずなのに・・・.
原因について,いろいろ調べてみると,分かりました.
「GSO(Generic Segmentation Offload)」でした.
パケットのフラグメントという,わりと重い処理をハードウェアであるNICにオフロードすることでCPU負荷を減らすあれです.
GSOが有効になっているかどうかは,ethtoolコマンドで確認できるようです.
$ ethtool -k eth0 Features for eth0: rx-checksumming: on tx-checksumming: on scatter-gather: on tcp-segmentation-offload: off udp-fragmentation-offload: off generic-segmentation-offload: on generic-receive-offload: off large-receive-offload: off rx-vlan-offload: on tx-vlan-offload: on ntuple-filters: off receive-hashing: off
試しに,
ethtool -K eth0 gso off
で,GSOをオフってみると,WiresharkのキャプチャーでのMTU超えのパケットがすっかりなくなった!
やったー!
GSOって,普通のノートPCのNICにもちゃんと実装されているもんなんですね.
--- 参考サイト ---
Seeing 25,000 byte packets in Wireshark Super packets Unleash Networks Blog
http://www.unleashnetworks.com/blog/?p=307
LinuxでNICのオフロード機能のON/OFF - id:rx7(@namikawa)の技術メモ - 技術日記
http://tech.g.hatena.ne.jp/rx7/20130425/p1
【レポート】FreeBSD 10ギガビットネットワーク高速通信の秘密 (3) ハードウェアオフロードによる処理の高速化 | 開発・SE | マイナビニュース
http://news.mynavi.jp/articles/2008/10/29/bsdcon5/002.html