发送方和接收方捕获的不同tcp包

时间:2014-02-24 11:11:05

标签: networking tcp

我正在使用tcpdump / wireshark来捕获tcp数据包,而tcp客户端将数据发送到tcp服务器。客户端只需在一次“send()”调用中向服务器发送4096个字节。而且我在两侧获得了不同的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,length = 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 个答案:

答案 0 :(得分:1)

  

发送方的两个数据包似乎在接收方上“压缩”了   侧

看起来像是通用接收卸载或大型接收卸载的情况。简而言之,接收网卡在进入内核之前会做一些聪明的事情并合并细分,从而提高性能。

要检查是否是这种情况,您可以尝试使用以下方法禁用它:

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

发送端发生了互补:tcp分段卸载或通用分段卸载。

禁用后,不要忘记重新启用它们:它们会严重提高性能。