互联网上最大的安全UDP数据包大小是多less?

我已经阅读了大量有关UDP数据包大小的文章,但是一直没有得出什么是正确的结论。

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

假设互联网上的最小MTU是576,并且IPv4报头的大小是20个字节,并且UDP报头是8个字节。 这留下了548个字节用于用户数据

我将能够使用数据包的大小为548没有数据包碎片? 或者,DNS的创build者知道的是,他们为什么将其限制在512字节。

我可以安全地超过548字节吗?

典型的 IPv4报头是20个字节,而UDP报头是8个字节。 但是可以包含IP选项,这可以将IP报头的大小增加到60个字节。 另外,有时中间节点需要将数据报封装在另一个协议中,如IPsec (用于VPN等),以便将数据包路由到目的地。 因此,如果您不知道特定networkingpath上的MTU ,最好为其他标题信息留下合理的余量,这些信息可能并不是您预期的。 通常认为512字节的UDP有效载荷是这样做的,但即使这样也不能为最大尺寸的IP标头留下足够的空间。

UDP数据包的最大大小的理论上限(在Windows上)是65507字节。 这是在这里logging :

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

话虽如此,大多数协议限制到一个小得多的规模 – 通常是512或偶尔8192.如果你在一个可靠的networking上,你可以经常安全地高于548 – 但如果你在整个互联网广播,更大你走了,越有可能遇到包传输问题和损失。

576是最小的最大重组缓冲区大小 ,即每个实现必须能够重组至less那个大小的分组。 有关详细信息,请参阅IETF RFC 1122 。

最大安全UDP有效载荷是508字节。 这是一个数据包大小576,减去最多60个字节的IP标头和8个字节的UDP标头。 任何这个规模或更小的UDP有效载荷都保证可以通过IP交付(尽pipe不能保证交付)。 由于任何原因,任何更大的路由器都可以被任何路由器直接丢弃。 除了仅IPv6路由,最大有效载荷为1,212字节。 正如其他人所提到的,在某些情况下可以添加额外的协议头。 取而代之的是300-400字节的更保守的值。

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

有趣的是,最大理论数据包大小约为30 MB(1,500个以太网MTU-60 IP头×65,536个最大片段数),虽然它通过的可能性是无限小的。

来源:RFC 791,RFC 2460

IPv4 最小重组缓冲区大小是576,IPv6在1500处。从这里减去标题大小。 请参阅W. Richard Stevens的UNIXnetworking编程 🙂

512是你最好的select。 它在其他地方使用,是一个不错的偶数(1024的一半)。

本文介绍最大传输单元(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所提到的,必须重新组合其他networking层的碎片。 https://tools.ietf.org/html/rfc1122#page-56 3.3.2重组IP层必须实现IP数据报的重组。 我们指定可由EMTU_R(“有效MTU接收”)重新组合的最大数据报大小; 这有时称为“重组缓冲区大小”。 EMTU_R必须大于或等于576

鉴于IPV6的大小为1500,我将断言运营商不会为IPV4和IPV6(它们都是不同types的IP)提供单独的path,迫使它们用于IPv4的设备,这将是旧的,冗余的,更昂贵的维护而且不太可靠。 这没有任何意义。 此外,这样做可能很容易被认为是为某些交通提供优惠待遇 – 一个没有根据的规则,他们可能不关心(除非他们被抓到)。

因此,1472应该是安全的外部使用(虽然这并不意味着一个应用程序,如DNS不知道EDNS会接受它),如果你正在说内部网,你可以更有可能知道你的networking布局在这种情况下巨大的数据包大小适用于非分段的数据包,因此为4096 – 4068字节,而英特尔的卡与9014字节的缓冲区,封装大小为…等待… 8086字节,将是最大的…巧合? 暗笑

**** ****更新

各种答案给出了1个软件供应商允许的最大值,或者假设封装的各种答案。 用户没有要求尽可能低的值(比如“0”表示安全的UDP大小),而是最大的安全包大小。

各层的封装值可以包含多次。 因为一旦你封装了一个stream,就没有什么东西可以阻止下面的VPN层,并且在上面封装层的完全重复。

由于这个问题是关于最大安全值的,我假设他们正在讨论可以接收的UDP数据包的最大安全值。 由于没有UDP数据包的保证,如果您收到一个UDP数据包,最大的安全大小将是1个数据包通过IPv4或1472个字节。

注意 – 如果你使用的是IPv6,最大的大小应该是1452字节,因为IPv6的头大小是40字节,而IPv4的20字节大小(无论哪种方式,仍然必须允许8字节的UDP头)。

我在这里读了一些很好的答案。 但是,有一些小错误。 有些人已经回答说,UDP报头中的消息长度字段最大为65535(0xFFFF); 这在技术上是正确的。 有些人回答说,实际最大值是(65535 – IPHL – UDPHL = 65507)。 错误在于,UDP报头中的消息长度字段包括所有有效负载(层5-7)以及UDP报头(8字节)的长度。 这意味着如果消息长度字段是200字节(0x00C8),则有效载荷实际上是192字节(0x00C0)。

最难的是IP数据报的最大容量是65535字节。 这个数字到达了L3和L4头部的总和,加上层5-7的有效载荷。 IP报头+ UDP报头+图层5-7 = 65535(最大)。

对于UDP数据组的最大大小,最正确的答案是65515字节(0xFFEB),因为UDP数据报包含UDP标头。 对于UDP有效负载的最大大小,最正确的答案是65507字节,因为UDP有效负载不包括UDP标头。