如何找到我能发送的最大的UDP数据包而不需要分片?

问题描述:

我需要知道我可以发送给另一台计算机的最大UDP数据包是什么没有碎片。如何找到我能发送的最大的UDP数据包而不需要分片?

这个大小通常被称为MTU(最大传输单位)。据推测,在2台电脑之间,会有很多路由器和调制解调器可能有不同的MTU。

我读到Windows中的TCP实现自动查找路径中的最大MTU。

我也在试验,我发现从我的电脑到服务器的最大MTU是57712字节+标题。以上任何东西都被丢弃了。我的电脑在局域网中,不是MTU应该在1500字节左右?

以下内容不直接回答您的问题,但您可能会觉得它很有趣;它说,IP数据包可以拆卸/重新组装,因此比上限更大的下属媒体(例如1500字节的以太网):Resolve IP Fragmentation, MTU, MSS, and PMTUD Issues with GRE and IPSEC


更多关于这个话题:

包括隐含的MTU协商

我不知道如何通过Windows上的API生成ICMP:曾经有人提出过这样的API,并且存在争议,因为人们认为可以很容易地编写软件来实现拒绝服务功能,方法是生成ICMP消息的泛滥。

不,它看起来像它实现:见例如Winsock Programmer's FAQ Examples: Ping: Raw Sockets Method

因此,要发现MTU,使用'do not fragment'标志生成ping数据包。

也许有比这更简单的API,我不知道;但我希望我已经让你了解底层协议[s]。

+1

谢谢你这有点帮助。我只是想知道是否所有使用UDP的其他人都只能使用576的最低默认值,这似乎是一个可怕的想法。 – Unknown 2009-05-23 02:58:31

您自己的MTU可在registry中找到,但MTU在实践中将用于机器与目的地之间最小的MTU。它的两个变量,只能凭经验确定。有许多RFCs显示如何确定它。

由于网络硬件通常是同构的或者至少是集中管理的,因此局域网的内部可以有非常大的MTU值。

+0

为什么人们经常说以太网的MTU是1500? – Unknown 2009-05-23 02:57:23

+0

因为这是以太网V2的RFC中定义的内容。我不够精确地知道以太网数据包的碎片在以太网到ip-only路由器上是否会发生逆转,因此它可能与手头的问题相关或不相关。 – Jherico 2009-05-23 03:05:53

除了以前所有的答案,引述classic

IPv4和IPv6定义 最小重组缓冲区大小,我们保证所有实现必须支持的最小数据包的大小。对于IPv4,这是576字节。 IPv6将其提升到1,280字节。


这几乎意味着,如果您在公共互联网上工作并且只控制交换的一端 - 这就是大多数标准的基于UDP的协议所做的工作,您希望将数据报大小限制在576以下。

另请注意,PMTU是路径的动态属性。这是TCP为您处理的事情之一。除非您准备重新实施大量的排序,时序和重传逻辑,否则将TCP用于任何关键网络。基准,测试,配置文件,即证明 TCP是你的瓶颈,然后才考虑UDP。

这对我来说是一个有趣的话题。当通过UDP在真实世界的互联网上传送大块的UDP数据时,一些实际的结果可能会引起人们的兴趣,并且传输速率为每秒1个数据包时,数据会以最小的包丢失高达约2K的速度继续变化。在此过程中,您开始遇到问题,但我们通常会在没有遇险的情况下交付1600+字节的数据包 - 这是通过GPRS移动网络以及全球范围内的WAN。在〜1K假设信号稳定(不是!)时,您的数据包丢失率较低。

有趣的是,它并不是奇数的数据包,而是经常出现几秒钟的大量数据包 - 这可能是VoIP电话偶尔崩溃的原因。