UDP IP分片和MTU

我试图了解在发送UDP数据包的上下文中看到的一些行为。

我有两个小Java程序:一个传输UDP数据包,另一个接收它们。 我在两台通过一台交换机连接的计算机之间的networking上本地运行它们。

两个networking适配器上的MTU设置(由/ sbin / ifconfig报告)均为1500。

  • 如果我发送大小<1500的数据包,我收到它们。 预期。
  • 如果我发送1500 <size <24258的数据包,我收到它们。 预期。 我已经通过wireshark确认IP层将它们分段。
  • 如果我发送大小> 24258的数据包,则会丢失。 不期望。 当我在接收端运行wireshark时,我没有看到任何这些数据包。

我能够看到类似的行为与ping -s。

ping -s 24258 hostA可以工作

ping -s 24259 hostA失败。

有没有人了解可能发生的事情,或者有我应该寻找的想法?

这两台电脑都运行CentOS 5 64位。 我使用1.6 JDK,但我不认为这是一个编程问题,这是一个networking或操作系统的问题。

Solutions Collecting From Web of "UDP IP分片和MTU"

IP协议的实现不需要能够处理任意大的数据包。 理论上,最大可能的IP数据包大小是65,535个八位字节,但是标准只要求实现至少支持576个八位字节。

看起来,你的主机的实现支持最​​大尺寸远远大于576,但仍然显着小于最大理论尺寸65,535。 (我不认为交换机应该是一个问题,因为它不应该做任何碎片整理 – 它甚至不在IP层运行)。

IP标准还建议主机不要发送大于576字节的数据包,除非他们确定接收主机可以处理更大的数据包大小。 你也许应该考虑一下,你的程序发送一个更小的数据包是否会更好。 24,529对我来说似乎非常大。 我认为可能有很多主机不会处理大数据包。

请注意,这些数据包大小限制完全独立于MTU(数据链路层协议所支持的最大帧大小)。

我发现以下可能是有趣的:

  • 确定Linux上UDP数据报包的最大大小
  • 设置IP报头中的DF位并发送不断更大的数据包,以确定每个路径MTU发现的数据包是否被分段。 然后数据包碎片应该产生一个ICMP类型3的数据包, 代码为4,表示数据包太大,不能被分片发送。

丹的答案是有用的,但请注意,标题后,你真的限于65507字节。