2016-11-22 34 views
0

我正在使用Linux TUN接口的服務器/客戶端套接字應用程序。分片數據包的TCP校驗和錯誤

服務器直接從TUN接口獲取的數據包,並將其傳遞給客戶,客戶直接在TUN接口把接收到的數據包。

<Server_TUN---><---Server---><---Clients---><---Client_TUN---> 

有時來自Server_TUN的數據包在傳輸到客戶端之前需要在IP層進行分段。

因此,在服務器上,我從TUN讀取一個數據包,在IP層開始分段並通過套接字將它們發送給客戶端。

當實施分段邏輯時,解決方案無法正常工作。

在Client_TUN上啓動Wireshark後,我注意到所有傳入的碎片數據包都收到TCP Checksum錯誤。

wireshark capture

在給定的屏幕截圖,幀數154權利155.

要重組,但在TCP校驗聲稱是不正確!

在服務器端,我保持tcp數據不變,對於給定的例子,當你在Wireshark中看到相反的時候,我已經分割了一個包含1452個字節(包括IP頭部)和30個字節(包括IP頭部)的數據包

我還檢查TCP校驗和值在服務器和它到底是0x935e,雖然我沒想到的是校驗和卸載事項傳入數據包,我檢查在客戶端卸載,這是關閉。

$ sudo ethtool -k tun0 | grep ": on" 
scatter-gather: on 
tx-scatter-gather: on 
tx-scatter-gather-fraglist: on 
generic-segmentation-offload: on 
generic-receive-offload: on 
tx-vlan-offload: on 
tx-vlan-stag-hw-insert: on 

儘管如此,由於解決方案現在不工作,我不認爲它是由卸載效應引起的。

你有任何想法,爲什麼TCP校驗可以爲分段的數據包是不正確的?

回答

0

希望我找到了問題。這是我的錯誤。當我應對緩衝區時,一些tcp數據丟失了。我正在追蹤索引和長度,但由於數據的變化,校驗和值在客戶端計算方式不同。