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

为什么java发送的tcp包的大小大于最大MTU大小,并且可以正常工作?,java,networking,tcp,mtu,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 post时,我可以在wireshark中看到大小为1354的tcp包,整个请求/响应都成功了 4 0.054168000 my.ip

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

ping -s 1312 my.sever.com  --> 100% successful
ping -s 1313 my.sever.com  --> 100% failed
所以我假设我的最大MTU是1340(1312+28)

但是,当我从java客户机捕获到该服务器的http post时,我可以在wireshark中看到大小为1354的tcp包,整个请求/响应都成功了

4 0.054168000 my.ip -> server.ip TCP 1354 80 59060  [TCP segment of a reassembled PDU]
我想知道,如果包大小>最大MTU大小,它是如何成功的


谢谢,

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


如果您在服务器上捕获数据包,那么您可能会看到TCP发送的数据段比MTU要大。然而,线路上的数据包仅为MTU大小。您可以通过在网络设备(交换机)等上捕获来验证这一点。或者,在远程(客户端)机器上捕获数据包将显示每个数据包都是通过读取“重新组装的PDU”来实现的。我认为确实如此。Java与此无关。Java无法控制TCP段或IP数据包的大小。