2014-02-15 61 views
2

我发出找到MTU值从我的Linux主机在我的服务器:为什么java发送一个大小超过最大MTU大小的tcp包并且工作正常?

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

所以,我认为我的最大MTU是1340(1312 + 28)。

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

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

我想知道如何在封装尺寸>最大MTU尺寸的情况下取得成功?

谢谢,

+1

碎片? –

+0

通过阅读_“重组PDU”_我认为它是确实的碎片。 –

+0

Java与它无关。 Java不能控制TCP段或IP数据包的大小。 – EJP

回答

2

因特网协议实现数据报分段,分解成更小的碎片,从而使数据包可以形成能够以更小的最大传输单元通过节点比原来的数据报大小。在路由器接收的协议数据单元比下一跳的MTU大的情况下,它有两个选项:删除PDU和发送ICMP消息,该消息指示所述条件包太大,或片段的IP包。

0

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

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

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

相关问题