1

我通过发出以下命令从我的 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 大小的情况下取得成功?

谢谢,

4

2 回答 2

2

互联网协议实现数据报分片,将其分解成更小的片段,这样可以形成可以通过最大传输单元小于原始数据报大小的节点的数据包。在路由器接收到大于下一跳的MTU的协议数据单元的情况下,它有两种选择:丢弃PDU并发送指示条件数据包太大的ICMP消息,或将IP数据包分段。

于 2014-02-15T09:02:00.450 回答
0

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

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

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

于 2014-09-23T11:03:01.770 回答