代码之家  ›  专栏  ›  技术社区  ›  Sean Nguyen

为什么java发送一个大小大于最大MTU大小的tcp包,并且它可以工作?

  •  1
  • Sean Nguyen  · 技术社区  · 11 年前

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

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

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

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

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

    我想知道,如果包装尺寸>最大MTU大小?

    谢谢

    2 回复  |  直到 11 年前
        1
  •  2
  •   user1134181 user1134181    11 年前

    这个 Internet协议 工具 数据报分段 ,将其分成更小的部分,这样可以形成能够通过最大传输单元小于原始数据报大小的节点的数据包。在路由器接收到大于下一跳的协议数据单元的情况下 MTU公司 ,它有两个选项: 个人数据单元 并发送 集成电路板 指示条件包太大的消息,或将 IP地址 小包裹

    看见

        2
  •  0
  •   vivek.a.dasgupta    10 年前

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

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

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