2014-02-24 40 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后,我确实启发了我,我在两边都找到了匹配的数据包! –