簡體   English   中英

TCP校驗和計算更改-禁用TCP卸載

[英]TCP Checksum Calculation Changing - tcp offloading is disabled

我正在使用netfilter處理TCP數據包,因此我必須重新計算TCP和IP校驗和,該校驗和將按預期工作。

Wireshark報告在離開服務器的途中校驗和是正確的(這也與客戶端認為的正確匹配),但是當它們到達客戶端時,校驗和始終替換為0xAA6A。

在路由后掛接中,我在操縱地址/端口后按如下方式計算TCP校驗和。

 tcp_header->check = 0;
 tcp_header->check = tcp_v4_check(tcp_len,
   ip_header->saddr,
   ip_header->daddr,
   csum_partial((char *)tcp_header, tcp_len, 0));

IP校驗和可以使用

 ip_send_check(ip_header);

該服務器沒有為RX或TX啟用TCP卸載,並且甚至不支持它,嘗試啟用或禁用時出現不支持的錯誤。

Offload parameters for eth0:
rx-checksumming: off
tx-checksumming: off
scatter-gather: off
tcp-segmentation-offload: off
udp-fragmentation-offload: off
generic-segmentation-offload: off
generic-receive-offload: on
large-receive-offload: off
rx-vlan-offload: off
tx-vlan-offload: off
ntuple-filters: off
receive-hashing: off

我不確定的另一個相關要點...我還在服務器上的預路由掛鈎中處理數據包/端口,它們被傳輸層接受,無論我看起來如何,它們肯定會進入我的應用程序對於TCP校驗和,我假設如果在更改IP地址/和端口后未更新TCP校驗和,則將丟棄它們。

是否有這種現象的明顯原因,或者我是否誤解了網絡堆棧的一部分?

更新:

將ip_summed設置為CHECKSUM_NONE會在離開我的代碼后停止重新計算校驗和。 我不確定是為什么將其重新計算為不正確的固定值? 如果未設置,則設置為CHECKSUM_PARTIAL。

如果另一側的值始終相同,則我看到2種主要可能性:1)您稍后在此代碼后覆蓋校驗和2)tcp_len錯誤。您還應該檢查sockbuff dev-> features中是否設置了NETIF_F_V4_CSUM,因為在這種情況下,內核會有所不同

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM