問題描述:
在使用wireshark抓取報文時,發現從10.81.2.92發過來的報文絕大部分標記為異常報文(開啟IPv4和TCP checksum)
分析如下報文,發現http報文(即tcp payload)的長度遠遠大於實際的mss大小,如下圖為4126
- 查看該報文的ip長度,為4148,遠大於Ethernet的mtu
- 且tcp的校驗和有來自wireshark的如下提示,那什么是“TCP checksum offload”呢?
問題解決:
- 在分析問題前,先給出上述問題答案,在10.81.2.92中關閉抓包的網卡的tso和tx功能.
ethtool -K eth0 tso off
ethtool -K eth0 tx off
- 重新抓包,發現wireshark顯示的報文長度和校驗都已經正確
問題分析:
目前很多網卡已經支持IP片以及IP/TCP/UDP等協議的校驗和計算,用來減少內核層面的運算(減少CPU負載),當協議層發現網卡支持相應的特性時,會將相應的處理交給網卡操作。如上面提到的校驗和,正常情況下,校驗和由對應的協議層處理,但在網卡使能情況下會將其推遲到網卡層面處理,網卡處理結束后直接發送,這就是為什么wireshark抓到的報文里面的校驗和會提示不正確的原因,同樣地,TCP會選擇不大於滑動窗口的報文(該報文可能大於MSS),交由網卡去分片處理。使用ethtool -k 命令可以查看網卡支持的特性。
- rx-checksumming/tx-checksumming:支持接收/發送方向的IP校驗和計算;
- scatter-gather:用於將一個buffer分割為多個小的部分,是實現tcp-segmentation-offload(TSO)的基礎;
- tcp-segmentation-offload(TSO):也被稱為large send offload (LSO),用於將TCP按照實際的mss進行分段發送。接收方向的參數為large-receive-offload(LRO),僅支持TCP;
- udp-fragmentation-offload(UFO):工作方式與tcp-fragmentation-offload類似;
- generic-segmentation-offload(GSO):工作方式與TSO,UFO類似,但支持所有的網絡協議。接受方向的參數為generic-receive-offload(GRO);GSO/GRO和的TSO/LRO的使用參見這篇文檔
- rx-vlan-offload:移除接收到的vlan tag;
- tx-vlan-offload:對出去的報文加上vlan tag;
TIPS:
- 類似地,如果抓UDP報文顯示校驗和等異常時,可以通過ethtool臨時關閉UDP offload功能
- TSO,UFO,GSO等功能可以提高報文交互能力,關閉會影響報文收發效率
- 開啟網卡的offload功能可能會規避防火牆對如分片攻擊的檢查
參考:
https://www.kernel.org/doc/Documentation/networking/checksum-offloads.txt