我使用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,这个“压缩”数据包的可能原因是什么?
在此先感谢您的帮助!发送侧
谢谢!我关掉了gro和lro,并在接收端获得了tcp数据包分割......但是,在禁用lro,gro,tso和gso后,我确实启发了我,我在两边都找到了匹配的数据包! –