【问题标题】:Why java send a tcp package with size larger than max MTU size and it works?为什么 java 发送一个大小大于最大 MTU 大小的 tcp 包并且它可以工作?
【发布时间】:2014-03-14 18:07:54
【问题描述】:

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

谢谢,

【问题讨论】:

  • 通过阅读"reassembled PDU"我认为确实是碎片化。
  • Java 与它无关。 Java 无法控制 TCP 段或 IP 数据包的大小。

标签: java networking tcp mtu


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    如果您为 NIC 禁用 tso/gso,那么您将看到所有传出数据包的大小为

    【讨论】:

      猜你喜欢
      • 2019-08-23
      • 1970-01-01
      • 2019-03-21
      • 2015-10-18
      • 2020-05-25
      • 2018-06-13
      • 2017-07-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多