我正在使用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,这个“压缩”数据包的可能原因是什么?
提前感谢您的帮助!
答案 0 :(得分:1)
发送方的两个数据包似乎在接收方上“压缩”了 侧
看起来像是通用接收卸载或大型接收卸载的情况。简而言之,接收网卡在进入内核之前会做一些聪明的事情并合并细分,从而提高性能。
要检查是否是这种情况,您可以尝试使用以下方法禁用它:
$ ethtool -K eth0 gro off
$ ethtool -K eth0 lro off
发送端发生了互补:tcp分段卸载或通用分段卸载。
禁用后,不要忘记重新启用它们:它们会严重提高性能。