我读过许多关于UDP数据包大小的文章,但一直无法得出正确的结论。

许多服务将最大的UDP数据包限制在512字节(如dns)

假定internet上的最小MTU是576,IPv4报头的大小是20字节,UDP报头的大小是8字节。这就为用户数据留下了548个字节可用

我是否能够使用548大小的数据包而不产生数据包碎片?或者DNS的创造者知道一些事情,这就是为什么他们把它限制在512字节。

我能安全的把数据设置在548字节以上吗?


当前回答

我担心我会引起不安的反应,但尽管如此,为了澄清我是否错了,或者那些看到这个问题并对答案感兴趣的人:

我对https://www.rfc-editor.org/rfc/rfc1122的理解,它的状态是“官方规范”,因此是这个问题中使用的术语的参考,它既没有被另一个RFC取代,也没有与以下内容相矛盾的错误:

从理论上讲,ie。根据书面规范,像https://www.rfc-editor.org/rfc/rfc1122#section-4这样的UDP没有“数据包大小”。因此答案可能是“不确定的”

在实践中,这就是这个问题可能寻求的(以及可以根据当前的技术进行更新),这可能是不同的,我不知道。

如果我造成了困扰,我道歉。https://www.rfc-editor.org/rfc/rfc1122#page-8“互联网协议套件”和“架构假设”并没有让我清楚地知道我所做的“假设”,基于我所听到的,这些层是分开的。Ie。UDP所在的层不需要关心IP所在的层(IP层确实有像重组,EMTU_R,碎片和MMS_R (https://www.rfc-editor.org/rfc/rfc1122#page-56))

其他回答

本文介绍了最大传输单元(MTU) http://en.wikipedia.org/wiki/Maximum_transmission_unit。它规定IP主机必须能够处理576字节的IP数据包。然而,它指出,最低是68。RFC 791:“每个互联网模块必须能够转发一个68字节的数据报,而不会产生进一步的碎片。这是因为一个互联网报头可能高达60个字节,而最小的片段是8个字节。”

因此,安全数据包大小508 = 576 - 60 (IP头)- 8 (udp头)是合理的。

正如user607811所提到的,其他网络层的碎片必须重新组合。 https://www.rfc-editor.org/rfc/rfc1122#page-56 3.3.2重新组装 IP层必须实现IP数据报的重组。 我们指定可以重新组合的最大数据报大小 通过EMTU_R(“有效MTU接收”);有时候 称为“重组缓冲区大小”。EMTU_R必须更大 大于或等于576

udp有不同的最大值。最后,这是你的选择,你认为足够安全的限制。注意:UDP本身是不安全的,因此您的数据包可能在任何时候丢失。

注意:所有这些都有一个范围。具体有多大取决于你的IP选项。一般情况下,可以这样计算:[upper maximum]-[IP-Options长度,以字节为单位]。这里列出的所有范围都不包括UDP-Header(8字节)

最小最大传输限制(或类似的东西,我忘记了实际的名称,在任何地方都找不到它):512-552字节

这可能是最安全的尺寸。IPv4协议要求所有跳来传输这个大小的数据包,更大的数据包可能在任何时间被任何主机丢弃。

最大传输单元:1432-1472:

这种大小的数据包可以在单个以太网帧中发送,而不会被分割。任何一个片段的丢失都会导致整个数据包无用。因此,当超过这个限制时,由于单个片段的碎片和潜在损失,您的数据包变得无用的机会增加。

绝对限制:65467-65507:

没有数据包可以超过这个限制,因为在这个限制下,IPv4协议达到了它的全部潜力。不能发送更大的数据包。这是因为IPv4协议只保留2个字节(16位)作为总长度。将所有这些位都设置为1,就得到65535。减去IP(20-60字节)和UDP头(8字节),就得到了这个限制。这种大小的数据包将导致至少44个片段。请记住,这些片段中的任何一个丢失都会导致整个包无用。

UDP最大安全负载是508字节。这是一个576(“最小最大重组缓冲区大小”)的数据包大小,减去最大60字节的IP头和8字节的UDP头。

任何这种大小或更小的UDP有效载荷都保证可以通过IP传递(尽管不保证传递)。任何更大的值都允许被任何路由器以任何理由直接丢弃。只有ipv6路由例外,ipv6路由最大负载为1212字节。正如其他人所提到的,在某些情况下可以添加额外的协议头。更保守的大约300-400字节的值可能是首选的。

最大可能的UDP负载是67 KB,分成45个IP包,增加额外的900字节开销(IPv4, MTU 1500,最小20字节IP头)。

任何UDP报文都可能被分片。但这并不太重要,因为丢失一个片段与丢失一个未分片的数据包具有相同的影响:整个数据包被丢弃。使用UDP,这将发生任何一种方式。

IP报文中包含一个分片偏移字段,表示UDP分片相对于其UDP报文的字节偏移量。该字段是13位的,允许8192个值,这些值以8字节为单位。所以IP包可以引用的偏移量范围是0…65528字节。作为偏移量,我们为最后一个UDP片段添加1480,得到67,008。减去第一个片段中的UDP头,我们得到了一个漂亮的约67 KB。

来源:RFC 791, RFC 1122, RFC 2460

UDP报文的最大大小的理论限制(Windows)是65507字节。这是记录在这里:

正确的UDP消息最大大小是65507,由以下公式确定: 0xffff -(sizeof(IP头)+ sizeof(UDP头))= 65535-(20+8)= 65507

也就是说,大多数协议限制的大小要小得多——通常是512或偶尔是8192。如果你在一个可靠的网络上,你通常可以安全地超过548,但如果你在整个互联网上广播,你的频率越大,你就越有可能遇到数据包传输问题和丢失。

IPv4最小重组缓冲区大小为576,IPv6为1500。从这里减去标题大小。参见W. Richard Stevens的UNIX网络编程:)