UDP IP分片与MTU

16

我正在尝试理解在发送UDP数据包的上下文中所看到的一些行为。

我有两个小的Java程序:一个传输UDP数据包,另一个接收它们。我在我的网络上使用单个交换机连接的两台计算机上本地运行它们。

网卡的MTU设置(由/sbin/ifconfig报告)都是1500。

  • 如果我发送大小小于1500的数据包,则会接收到它们。预期。
  • 如果我发送1500 < 大小 < 24258的数据包,我会收到它们。预期。 我已通过wireshark确认IP层正在对它们进行分段。
  • 如果我发送大小> 24258的数据包,则它们会丢失。 不是预期的。当我在接收端运行wireshark时,我看不到这些数据包。

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

ping -s 24258 hostA可以工作但是

ping -s 24259 hostA失败。

是否有人了解可能发生的情况,或者有什么想法,我应该寻找什么?

两台电脑都运行CentOS 5 64位。 我正在使用1.6 JDK,但我不认为这是编程问题,而是网络或操作系统问题。


你在serverfault.com上提问可能会更有好运。 - ire_and_curses
3
Wireshark在发送端显示哪些内容对于大小大于24258字节的数据包? - Kaleb Pederson
1
@Kaleb 我不是wireshark专家,但是发送端的捕获看起来无论数据包大小是>还是<24258都是一样的。我看到了分段的IP数据包,但是只有小数据包的UDP数据包(我有很小和非常大的数据包混合)。我发送的数据是二进制的,所以很难确定哪个IP数据包属于哪个UDP数据包。我可能会尝试使用更可预测的数据进行简单的测试,并查看wireshark显示的内容。不过可能要等到明天才能做。@ire_and_curses,谢谢,我不确定serverfault具体包含什么。我可能会在那里尝试一下。 - wolfcastle
3
你所做的UDP和ping测试略有不同。ping -s 24258命令会向IP层发送大小为24266的数据包(ICMP协议需要8字节的开销)。而一个大小为24258的UDP数据包则会向IP层发送大小为24278的数据包(UDP协议需要20字节的开销)。 - camh
尝试更换或移除(交叉线缆)交换机。如果一侧正在发送而另一侧没有接收到,我会在中间寻找问题所在。 - camh
2个回答

12

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

看起来您的主机实现支持的最大大小远大于576,但仍远远小于65,535的最大理论大小。(我认为交换机不应该是问题,因为它不需要在IP层进行任何重组操作)。

IP标准进一步建议主机不要发送大于576字节的数据包,除非确定接收主机能够处理较大的数据包大小。您或许应该考虑是否更好地将程序发送一个较小的数据包大小。对于我来说,24,529似乎太大了。我认为可能有很多主机无法处理那么大的数据包。

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


1
我不知道实现可以有更小的最大数据包大小。你知道如何确定这个值吗? 我同意24k是一个非常大的大小,在部署系统中我可能不会发送那么大的数据包,我只是在测试过程中遇到了这个问题。在部署系统中,我完全控制网络(所有计算机/交换机/路由器)。我们使用千兆以太网,所以如果我们还使用巨型帧,我认为我应该能够使用9000的数据包大小(UDP头+有效负载)而不需要IP层分片。 - wolfcastle

5
我找到了以下可能会感兴趣的内容:

Dan的回答很有用,但请注意,在标头之后,您的限制实际上只有65507个字节。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接