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

Networking 发送方和接收方捕获的不同tcp数据包,networking,tcp,Networking,Tcp,我使用tcpdump/wireshark在tcp客户端向tcp服务器发送数据时捕获tcp数据包。客户端只需在一次“send()”调用中向服务器发送4096个字节。我在两个方面得到了不同的tcp数据包,发送方的两个数据包似乎在接收方被“压缩”,这与我对tcp协议的理解有冲突,我在这个问题上坚持了几天,真的需要一些帮助 请注意以下数据包中的数据包长度: 客户端(发送方)发送2个数据包0Xbcac(4)和0xbcae(5),总共发送2896+1200=4096字节 (0xbcac) 4 14:31:

我使用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,长度=4096(receiver.packet.0xbcac=sender.packet.0xbcac+0xbcae):

我知道tcp是一种流协议,发送的数据可以根据MSS(或MTU)划分为数据包,但我猜这种划分发生在数据包发送到NIC之前,因此在捕获之前。我还知道,数据包0xbcae中的PSH标志导致将数据从缓冲区写入NIC,但这无法解释“压缩”数据包。我还在客户端尝试在一次“发送”调用中发送9999999字节,数据被分成小数据包并发送,但仍然与服务器端捕获的数据包不匹配。最后我禁用了tcp nagle,得到了相同的结果,并排除了这个原因

所以我的问题是我遇到的不匹配是正常的吗?如果是,是什么原因造成的?如果不是,我正在局域网中使用Ubuntu12.04和Ubuntu13.10,那么这个“压缩”包的可能原因是什么

提前感谢您的帮助

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

它看起来像是一般接收卸载或大型接收卸载的情况。长话短说,接收网卡做了一些聪明的事情,并在它们到达内核之前合并片段,这提高了性能

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

$ ethtool -K eth0 gro off
$ ethtool -K eth0 lro off
在发送端会发生一些补充:tcp分段卸载或通用分段卸载

禁用这些功能后,不要忘记重新启用它们:它们会大大提高性能

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

它看起来像是一般接收卸载或大型接收卸载的情况。长话短说,接收网卡做了一些聪明的事情,并在它们到达内核之前合并片段,这提高了性能

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

$ ethtool -K eth0 gro off
$ ethtool -K eth0 lro off
在发送端会发生一些补充:tcp分段卸载或通用分段卸载

禁用这些功能后,不要忘记重新启用它们:它们会大大提高性能

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

它看起来像是一般接收卸载或大型接收卸载的情况。长话短说,接收网卡做了一些聪明的事情,并在它们到达内核之前合并片段,这提高了性能

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

$ ethtool -K eth0 gro off
$ ethtool -K eth0 lro off
在发送端会发生一些补充:tcp分段卸载或通用分段卸载

禁用这些功能后,不要忘记重新启用它们:它们会大大提高性能

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

它看起来像是一般接收卸载或大型接收卸载的情况。长话短说,接收网卡做了一些聪明的事情,并在它们到达内核之前合并片段,这提高了性能

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

$ ethtool -K eth0 gro off
$ ethtool -K eth0 lro off
在发送端会发生一些补充:tcp分段卸载或通用分段卸载


禁用这些功能后,别忘了重新启用它们:它们会大大提高性能。

谢谢!我关闭了gro和lro,并在接收端分离了tcp数据包。。。但你确实激励了我,在禁用lro、gro、tso和gso后,我在两侧得到了匹配的数据包!谢谢我关闭了gro和lro,并在接收端分离了tcp数据包。。。但你确实激励了我,在禁用lro、gro、tso和gso后,我在两侧得到了匹配的数据包!谢谢我关闭了gro和lro,并在接收端分离了tcp数据包。。。但你确实激励了我,在禁用lro、gro、tso和gso后,我在两侧得到了匹配的数据包!谢谢我关闭了gro和lro,并在接收端分离了tcp数据包。。。但你确实激励了我,在禁用lro、gro、tso和gso后,我在两侧得到了匹配的数据包!