2014-02-24 39 views
0

我使用tcpdump/wireshark捕獲tcp數據包,同時tcp客戶端發送數據到tcp服務器。客戶只需在一個「send()」調用中向服務器發送4096個字節。而且我在兩邊獲得不同的tcp數據包,發送方的兩個數據包似乎在接收端被「壓縮」,這與我對tcp協議的理解有衝突,並且我在這個問題上停留了幾天,真的需要一些幫幫我。在發送方和接收方捕獲不同的tcp數據包

請注意分組長度中的分組如下:

客戶(發送方)發送2個分組0Xbcac(4)和0xbcae(5),發送2896 + 1200 = 4096字節中的所有。

(0xbcac) 4 14:31:33.838305 192.168.91.194 192.168.91.193 TCP 2962 59750 > 9877 [ACK] Seq=1 Ack=1 Win=14720 **Len=2896** TSval=260728 TSecr=3464603 0 
(0xbcae) 5 14:31:33.838427 192.168.91.194 192.168.91.193 TCP 1266 59750 > 9877 [PSH, ACK] Seq=2897 Ack=1 Win=14720 **Len=1200** TSval=260728 TSecr=3464603 0 

但是在服務器(接收機)側,只有一個數據包被呈現,以ip.id = 0xbcac和長度= 4096(= receiver.packet.0xbcac + sender.packet.0xbcac 0xbcae):

(0xbcac) 4 14:31:33.286296 192.168.91.194 192.168.91.193 TCP 4162 59750 > 9877 [PSH, ACK] Seq=1 Ack=1 Win=14720 **Len=4096** TSval=260728 TSecr=3464603 0 

我知道tcp是一個流協議,根據MSS(或MTU)發送的數據可以分爲數據包,但是我猜想在數據包發送到NIC之前會發生分割,因此在捕獲之前。我也知道數據包0xbcae中的PSH標誌導致將數據從緩衝區寫入NIC,但這不能解釋「壓縮」數據包。此外,我試圖在客戶端發送一個「發送」電話999999字節,數據被分成小包和發送,但仍然不匹配在服務器端捕獲的數據包。最後我禁用tcp nagle,得到相同的結果,並排除了原因。

所以我的問題是我遇到的不匹配正常嗎?如果是這樣,是什麼造成的?如果沒有,我在局域網中使用ubuntu 12.04和ubuntu 13.10,這個「壓縮」數據包的可能原因是什麼?

在此先感謝您的幫助!發送側

回答

1

兩個包似乎是在接收 側

它看起來像通用的情況下,「壓縮」收到卸載或大型接收卸載。長話短說,接收網卡在內核之前會做一些聰明的事情併合並段,從而提高性能。

要檢查,如果這是你可以嘗試使用禁用它的情況:

$ ethtool -K eth0 gro off 
$ ethtool -K eth0 lro off 

互補的東西發生在發送方:TCP分段卸載或通用分段卸載。

禁用這些之後不要忘記重新啓用它們:它們會嚴重提高性能。

+0

謝謝!我關掉了gro和lro,並在接收端獲得了tcp數據包分割......但是,在禁用lro,gro,tso和gso後,我確實啓發了我,我在兩邊都找到了匹配的數據包! –