为什么java发送大小超过最大MTU大小的tcp包并且它有效?

时间:2014-02-15 08:39:34

标签: java networking tcp mtu

我通过发出以下命令从我的linux主机找到我的服务器的mtu值:

ping -s 1312 my.sever.com  --> 100% successful
ping -s 1313 my.sever.com  --> 100% failed

所以我假设我的最大MTU是1340(1312 + 28)。

但是,当我从我的Java客户端捕获一个http帖子到该服务器时,我可以在wireshark中看到一个大小为 1354 的tcp包,整个请求/响应成功。

4 0.054168000 my.ip -> server.ip TCP 1354 80 59060  [TCP segment of a reassembled PDU]

我想知道如何使用包装尺寸>成功最大MTU大小?

谢谢,

2 个答案:

答案 0 :(得分:2)

Internet协议实现数据报碎片,将其分成更小的部分,以便形成可以通过最大传输单位小于原始数据报大小。如果路由器收到的协议数据单元大于下一跳的 MTU ,则有两种选择:删除 PDU 并发送 ICMP 消息,表示条件包太大,或者分段 IP 包。

答案 1 :(得分:0)

如果您正在服务器上捕获数据包,那么您可能会看到TCP发送比MTU更大的段。但是,线路上的数据包仅为MTU大小。您可以通过在网络设备(交换机)上捕获来验证这一点。或者,在远程(客户端)计算机上捕获数据包将显示每个数据包都是< = MTU。

此行为是由于启用了TSO / GSO后,TCP段被NIC硬件拆分为MTU大小的数据包。由于tcpdump在软件层捕获,因此它会看到大于MTU的段被发送到NIC卡以进行进一步传输。

如果禁用NIC的tso / gso,那么您将看到所有传出的数据包都是< = MTU大小(更可能是pMTU大小)。