我已经阅读了许多有关UDP数据包大小的文章,但无法得出正确的结论。
许多服务将最大UDP数据包限制为512字节(例如dns)
给定Internet上的最小MTU为576,IPv4标头的大小为20个字节,而UDP标头的大小为8个字节。剩下548个字节可用于用户数据
我可以使用不超过548个大小的数据包而不会造成数据包碎片吗?还是DNS的创建者知道某些东西,以及为什么他们将其限制为512字节。
我可以安全地超过548个字节吗?
我已经阅读了许多有关UDP数据包大小的文章,但无法得出正确的结论。
许多服务将最大UDP数据包限制为512字节(例如dns)
给定Internet上的最小MTU为576,IPv4标头的大小为20个字节,而UDP标头的大小为8个字节。剩下548个字节可用于用户数据
我可以使用不超过548个大小的数据包而不会造成数据包碎片吗?还是DNS的创建者知道某些东西,以及为什么他们将其限制为512字节。
我可以安全地超过548个字节吗?
Answers:
的确,典型的 IPv4标头为20个字节,而UDP标头为8个字节。但是,可以包含IP选项,这些选项可以将IP标头的大小增加到60个字节。另外,有时中间节点有必要将数据报封装在另一个协议(例如IPsec(用于VPN等)中)内,以便将数据包路由到其目的地。因此,如果您不知道特定网络路径上的MTU,则最好为您可能未预料到的其他标头信息留有合理的余量。通常认为可以使用512字节的UDP有效负载来做到这一点,尽管即使这样也不能为最大大小的IP标头留下足够的空间。
UDP数据包最大大小的理论限制(在Windows上)为65507字节。这是记录在这里:
正确的最大UDP消息最大大小为65507,由以下公式确定:0xffff-(sizeof(IP标头)+ sizeof(UDP标头))= 65535-(20 + 8)= 65507
话虽这么说,大多数协议的大小限制都非常小-通常为512,或者有时为8192。如果您处于可靠的网络中,则通常可以安全地超过548,但是如果您要通过整个Internet进行广播,则更大您去的时候,您更有可能遇到数据包传输问题和丢失。
最大安全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
576是最小最大重组缓冲区大小,即每个实现必须能够重组至少该大小的数据包。有关详细信息,请参见IETF RFC 1122。
本文介绍了最大传输单位(MTU)http://en.wikipedia.org/wiki/Maximum_transmission_unit。它指出IP主机必须能够为IP数据包处理576个字节。但是,它指出最小值为68。RFC 791:“每个Internet模块必须能够转发68个八位位组的数据报,而不能进一步分段。这是因为Internet报头最多可以包含60个八位位组,并且最小片段为8个八位位组”。
因此,安全数据包大小为508 = 576-60(IP报头)-8(udp报头)是合理的。
如用户607811所述,必须重新组合其他网络层的分段。 https://tools.ietf.org/html/rfc1122#page-56 3.3.2重组IP层必须实现IP数据报的重组。我们指定可以由EMTU_R重新组合的最大数据报大小(“要接收的有效MTU”);有时称为“重组缓冲区大小”。EMTU_R必须大于或等于576
IPv4的最小重组缓冲区大小为576,IPv6的最小重组缓冲区大小为1500。从此处减去标头大小。请参阅W. Richard Stevens撰写的UNIX Network Programming:)
512是您最好的选择。它在其他地方使用,并且是一个偶数(1024的一半)。
鉴于IPV6的大小为1500,我断言运营商不会为IPV4和IPV6提供单独的路径(它们都是IP,具有不同的类型),从而迫使它们使用旧的,冗余的,维护成本更高的ipv4设备而且不太可靠。这没有任何意义。此外,这样做可能很容易被视为为某些流量提供了优惠待遇-根据他们可能不太在意的规则(除非被抓住),这是不可以的。
因此1472应该可以安全地用于外部使用(尽管这并不意味着不知道EDNS的DNS之类的应用程序会接受它),如果您使用的是内部网络,则在这种情况下您更有可能知道您的网络布局巨型数据包大小适用于非分段数据包,因此适用于4096-4068字节,对于具有9014字节缓冲区的intel卡,包大小为... wait ... 8086字节,这将是最大...巧合吗? 暗笑
****更新****
各种答案给出了1个SW供应商所允许的最大值,或者给出了封装的各种答案。用户没有要求最小值(例如,“ 0”表示安全的UDP大小),而是要求最大的安全数据包大小。
可以多次包含各个层的封装值。自从您封装了流之后,没有什么比禁止它下面的VPN层和它上面的封装层完全相同的了。
由于问题是关于最大安全值的,因此我假设他们正在谈论可以接收的UDP数据包的最大安全值。由于无法保证没有UDP数据包,因此,如果您收到UDP数据包,则最大的安全大小将是IPv4上的1个数据包或1472字节。
注意-如果使用的是IPv6,则最大大小为1452字节,因为IPv6的标头大小为40字节,而IPv4的标头大小为20字节(无论哪种方式,UDP标头都必须允许8个字节)。
我在这里读了一些很好的答案;但是,有一些小错误。有人回答说,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标头。
我担心我会产生不安的反应,但是尽管如此,还是要为我澄清我是错的还是看到这个问题并对答案感兴趣的人:
我对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))