我看到一个奇怪的事情,这不是我所期望的TCP理论。 进行握手时客户端设置MSS(最大段大小)为1360,窗口大小为64K,但Linux服务器发送的TCP数据包包含4KB,7KB,一些8KB的数据包超过1360,我希望它能够小于1360字节
我通过做一个tcpdump然后在WireShark
中看到它来观察到这一点我没想到Server每个TCP数据包发送超过1360个字节, 在我对TCP工作原理的理论理解中,我错了吗?
答案 0 :(得分:2)
首先,@ fernacolo表示不要混淆MSS和MTU。
也许你的界面的通用分段卸载了 - 阅读here了解更多信息。
答案 1 :(得分:0)
检查您是否将MSS与MTU混淆。数据包大小受MTU限制,而不受MSS限制。完整的TCP数据包包含MAC头,IP头,TCP头,TCP选项和有效负载。因此,TCP数据包可能比MSS更大。
答案 2 :(得分:0)
如果您正在服务器上捕获数据包,那么您可能会看到TCP发送比MTU更大的段。但是,线路上的数据包仅为MTU大小。您可以通过在网络设备(交换机)上捕获来验证这一点。或者,在远程(客户端)计算机上捕获数据包将显示每个数据包都是< = MTU。
此行为是由于启用了TSO / GSO后,TCP段被NIC硬件拆分为MTU大小的数据包。由于tcpdump在软件层捕获,因此它会看到大于MTU的段被发送到NIC卡以进行进一步传输。
如果禁用NIC的tso / gso,那么您将看到所有传出的数据包都是< = MTU大小(更可能是pMTU大小)。