如何find我能发送的最大的UDP数据包而不用分片?

我需要知道我可以发送到另一台计算机的最大的UDP数据包是不是碎片。

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

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

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

以下内容不直接回答你的问题,但你可能会觉得它很有趣。 它说IP数据包可以被反汇编/重组,并且因此大于对下层媒体的限制(例如1500字节的以太网): 解决IP分片,MTU,MSS和PMTUD问题与GRE和IPSEC


更多关于这个话题:

  • 回复:UDP碎片说你应该使用ICMP而不是UDP来发现MTU
  • pathMTU发现说,TCP连接可能包括通过ICMP的隐式MTU协商

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

不,它看起来像实现了:例如见Winsock程序员的常见问题示例:Ping:原始套接字方法 。

所以,要发现MTU,用'do not fragment'标志生成ping数据包。

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

除了所有以前的答案,引用经典 :

IPv4和IPv6定义了最小的重组缓冲区大小 ,这是我们保证任何实现必须支持的最小数据报大小。 对于IPv4,这是576字节。 IPv6将此提升至1,280字节。

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

另请注意,PMTU是path的dynamic属性。 这是TCP为您处理的事情之一。 除非您准备重新实现大量的sorting,时序和重传逻辑,否则将TCP用于任何关键networking。 基准,testing,configuration文件,即certificate TCP是你的瓶颈,才考虑UDP。

您自己的MTU在registry中可用,但是MTU在实践中会转到机器和目的地之间最小的MTU。 它的两个variables,只能凭经验确定。 有很多RFC显示如何确定它。

局域网内部可以有非常大的MTU值,因为networking硬件通常是同质的,或者至less是中央pipe理的。

这对我来说是一个有趣的话题。 当通过UDP在真实世界的因特网上传送大块的UDP数据时,一些实际的结果可能会引起人们的兴趣,并且每秒传送一个数据包的速率,数据继续以最小的包丢失达到约2K。 在这一点上,你开始遇到问题,但我们经常交付1600+字节的数据包,而不会遇到困难 – 这是通过GPRS移动networking以及世界范围内的WAN。 假设信号稳定(不是!),假设信号为1K,则丢包率较低。

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