UDP IP 分片和 MTU

Posted

技术标签:

【中文标题】UDP IP 分片和 MTU【英文标题】:UDP IP Fragmentation and MTU 【发布时间】:2011-04-12 08:19:38 【问题描述】:

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

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

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

如果我发送大小 如果我发送 1500 如果我发送大小 > 24258 的数据包,它们就会丢失。 不是预期的。当我在接收端运行 wireshark 时,我看不到任何这些数据包。

我可以通过 ping -s 看到类似的行为。

ping -s 24258 hostA 有效,但是

ping -s 24259 hostA 失败。

有人了解可能发生的事情,或者知道我应该寻找什么吗?

两台计算机都运行 CentOS 5 64 位。我使用的是 1.6 的 JDK,但我真的不认为这是一个编程问题,它是一个网络或操作系统问题。

【问题讨论】:

在 serverfault.com 上问这个问题可能会更好。 对于带有size > 24258 的数据包,wireshark 在连接的发送端显示什么? @Kaleb 我不是wireshark专家,但是无论数据包大小是>还是 你的 UDP 和 ping 测试有点不同。 ping -s 24258 将给 IP 层一个大小为 24266(ICMP 开销为 8 字节)的数据包。大小为 24258 的 UDP 数据包将为 IP 层提供大小为 24278(UDP 开销为 20 字节)的数据包。 尝试更换或移除(交叉电缆)开关。如果一侧正在发送而另一侧未接收,我会在中间寻找问题。 【参考方案1】:

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

您的主机实现支持的最大大小似乎远大于 576,但仍远小于最大理论大小 65,535。 (我不认为交换机应该是个问题,因为它不需要进行任何碎片整理——它甚至不在 IP 层运行)。

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

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

【讨论】:

我不知道实现可以有更小的最大数据包大小。你知道如何确定这个值是多少吗?我同意 24k 是一个非常大的大小,我可能不会在部署的系统中发送这么大的数据包,我只是在测试期间遇到了这个问题。我可以完全控制已部署系统中的网络(所有计算机/交换机/路由器)。我们正在使用千兆以太网,所以如果我们也使用巨型帧,我想我应该能够使用 9000 的数据包大小(UDP 标头 + 有效负载)而无需 IP 层分段。【参考方案2】:

我发现了以下可能感兴趣的内容:

Determine the maximum size of a UDP datagram packet on Linux 设置 IP 标头中的 DF 位并不断发送更大的数据包以确定数据包在哪个点按照Path MTU Discovery 进行分段。数据包分段应该会产生一个带有code 4 的 ICMP 类型 3 数据包,表明该数据包太大而无法在不分段的情况下发送。

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

【讨论】:

以上是关于UDP IP 分片和 MTU的主要内容,如果未能解决你的问题,请参考以下文章

面试冲刺:54---MTU是什么?IP分片是什么?MSS是什么?TCP和UDP会分片吗?它们的关系是什么?

面试冲刺:54---MTU是什么?IP分片是什么?MSS是什么?TCP和UDP会分片吗?它们的关系是什么?

TCP/UDP 和以太网 MTU 分片

tcp分片和ip分片的区别

TCP UDP 分段 IP分片

Linux网络编程 -ip