2010-09-14 72 views
12

我想了解一些行为,我看到在发送UDP数据包的情况下。UDP IP分段和MTU

我有两个小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,但我并不认为这是一个编程问题,它是一个网络或操作系统问题。 IP协议的

+0

你可能有更好的运气问这在serverfault.com。 – 2010-09-14 19:27:27

+3

wireshark在连接的发送端显示“size> 24258”的数据包是什么? – 2010-09-14 19:31:01

+1

@Kaleb我不是wireshark专家,但发送端的捕获看起来是相同的,无论数据包大小是>还是<24258.我看到分段的IP数据包,但我只看到UDP数据包的小数据包(我有非常小和非常大的数据包的组合)。我发送的数据是二进制数据,因此很难弄清楚哪些IP数据包属于哪个UDP数据包。我可能会尝试使用更可预测的数据进行更简单的测试,并查看wireshark演示。但是直到明天我才会明白。 @ire_and_curses,谢谢我不确定什么serverfault完全包含。我可能会在那里尝试。 – wolfcastle 2010-09-14 20:42:58

回答

10

实现不要求能够处理任意大的数据包。理论上,最大可能的IP数据包大小为65,535个八比特组,但标准只要求实现支持至少576个八比特组。

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

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

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

+1

我不知道实现可能有一个较小的最大数据包大小。你知道如何确定这个值是什么吗? 我同意24k是一个非常大的尺寸,我可能不会在部署的系统中发送那么大的数据包,我只是在测试过程中遇到了这个问题。我可以完全控制部署系统中的网络(所有计算机/交换机/路由器)。我们使用千兆位以太网,所以如果我们也使用巨型帧,我会收集数据包大小为9000(UDP头+有效载荷),而无需IP层分片。 – wolfcastle 2010-09-15 15:41:57

5

我发现这可能是利益的情况如下:

丹的答案很有用,但是请注意,在标题之后,您确实限制为65507字节。