Internet上最大的安全UDP数据包大小是多少

时间:2009-07-08 15:39:49

标签: networking sockets udp ipv4

我已经阅读了很多关于UDP数据包大小的文章,但是我们无法得出正确的结论。

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

鉴于互联网上的最小MTU为576,IPv4标头的大小为20字节,UDP标头为8字节。这留下了548个可用于用户数据的字节

我是否可以在没有数据包碎片的情况下使用大小为548的数据包?或者是DNS的创建者知道什么,以及为什么他们将其限制为512字节。

我能安全地高于548字节吗?

11 个答案:

答案 0 :(得分:117)

典型的 IPv4标头确实是20个字节,UDP标头是8个字节。但是,可以包含IP选项,这可以将IP标头的大小增加到60个字节。此外,有时中间节点必须将数据报封装在另一协议内,例如IPsec(用于VPN等),以便将数据包路由到其目的地。因此,如果您不知道特定网络路径上的MTU,最好为您可能没有预料到的其他标头信息留出合理的余量。通常认为512字节的UDP有效负载可以做到这一点,尽管即使这样也没有为最大大小的IP报头留下足够的空间。

答案 1 :(得分:55)

UDP数据包的最大大小的理论限制(在Windows上)为65507字节。这是documented here

  

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

话虽如此,大多数协议限制为更小的尺寸 - 通常为512或偶尔为8192.如果您在可靠的网络上,您通常可以安全地高于548 - 但如果您通过互联网广播,你越大,就越有可能遇到数据包传输问题和丢失。

答案 2 :(得分:43)

576是最小最大重组缓冲区大小,即每个实现必须能够重新组装至少该大小的数据包。有关详细信息,请参阅IETF RFC 1122

答案 3 :(得分:43)

最大安全UDP有效负载为508字节。这是数据包大小为576,减去最大60字节IP标头和8字节UDP标头。保证这个大小或更小的UDP有效载荷可以通过IP传送(尽管不能保证交付)。任何更大的东西都可以被任何路由器彻底放弃。除了仅IPv6路由,其中​​最大有效负载为1,212字节。正如其他人所提到的,在某些情况下可以添加额外的协议头。可能更喜欢大约300-400字节的更保守的值。

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

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

来源:RFC 791,RFC 2460

答案 4 :(得分:14)

本文介绍了最大传输单位(MTU)http://en.wikipedia.org/wiki/Maximum_transmission_unit。它声明IP主机必须能够为IP数据包处理576个字节。然而,它注意到最小值是68. RFC 791:“每个互联网模块必须能够转发68个八位字节的数据报,而不会进一步碎片化。这是因为互联网标题可能高达60个八位字节,最小片段是8个八位字节“。

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

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

答案 5 :(得分:10)

IPv4 最小重组缓冲区大小为576,IPv6为1500.从此处减去标头大小。见UNIX Network Programming by W. Richard Stevens:)

答案 6 :(得分:6)

512是你最好的选择。它在别处使用,是一个很好的偶数(1024的一半)。

答案 7 :(得分:6)

鉴于IPV6的大小为1500,我认为运营商不会为IPV4和IPV6提供单独的路径(它们都是具有不同类型的IP),迫使他们使用ipv4的设备,这将是旧的,多余的,更多维护成本高,可靠性低。这没有任何意义。此外,这样做可能很容易被认为是为某些交通提供优惠待遇 - 根据他们可能不太关心的规则(除非他们被抓住),这是不可能的。

所以1472应该是安全的外部使用(虽然这并不意味着像DNS这样不知道EDNS的应用会接受它),如果你在谈论内部网络,你更有可能知道你的网络布局在这种情况下,jumbo数据包大小适用于非分段数据包,因此对于4096 - 4068字节,对于具有9014字节缓冲区的intel卡,包大小为...... 等待... 8086字节,将是最大...巧合? 窃笑

**** **** UPDATE

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

可以多次包含各种层的封装值。因为一旦你封装了一个流 - 没有什么可以禁止,比如下面的VPN层和完全重复的封装层。

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

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

答案 8 :(得分:6)

我在这里读到了一些好的答案;但是,有一些小错误。有人回答UDP标头中的Message Length字段最大值为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报头。

答案 9 :(得分:1)

UDP不是“安全”的,所以问题不是很大-但是-

  • 如果您使用的是Mac,则默认情况下可以发送的最大大小为9216字节。
  • 如果您使用的是Linux(CentOS / RedHat)或Windows 7,则最大为65507字节。

如果发送9217或更高版本(mac)或65508+(linux / windows),套接字发送函数将返回错误。

以上讨论分段和MTU等问题的答案不在主题之列-所有这些都发生在较低级别,对您“不可见”,并且在很大程度上不会影响典型连接上的“安全性”。

尽管要回答实际问题含义-不要使用UDP-请使用原始套接字,这样您就可以更好地控制所有内容;由于您在编写游戏,因此您需要深入研究这些标志,以便以某种方式优先处理流量,因此您最好同时消除UDP问题。

答案 10 :(得分:0)

我担心我会产生不安的反应,但是尽管如此,还是要为我澄清我是错的还是看到这个问题并对答案感兴趣的人:

我对https://tools.ietf.org/html/rfc1122的理解,其状态为“正式规范”,因此是该问题中使用的术语的参考,并且既不被其他RFC取代,也未与勘误表相矛盾:

从理论上讲,即根据书面规范,https://tools.ietf.org/html/rfc1122#section-4给出的UDP没有“数据包大小”。因此答案可能是“不确定的”

实际上,这是可能要寻求的问题(可以针对当前的实际技术进行更新),这可能有所不同,我不知道。

如果造成不安,我深表歉意。 https://tools.ietf.org/html/rfc1122#page-8根据我听到的消息,“ Internet协议套件”和“体系结构假设”对我所依据的“假设”并不清楚,层是分开的。就是UDP所在的层不必与IP所在的层相关(IP层确实具有诸如Reassembly,EMTU_R,Fragmentation和MMS_R(https://tools.ietf.org/html/rfc1122#page-56)之类的东西