我已经阅读了很多关于UDP数据包大小的文章,但是无法得出结论.
许多服务将最大的UDP数据包限制为512字节(如dns)
给定互联网上的最小MTU为576,IPv4标头的大小为20字节,UDP标头为8字节.这留下了548个可用于用户数据的字节
我是否能够使用大小为548的数据包而不会出现数据包碎片?或者是DNS的创建者知道什么,以及为什么他们将其限制为512字节.
我能安全地高于548字节吗?
确实,典型的 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 - 但如果你在互联网上广播,更大你去,你越有可能遇到数据包传输问题和丢失.
最大安全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:"每个互联网模块必须能够转发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
IPv4 最小重组缓冲区大小为576,IPv6为1500.从此处减去标头大小.请参阅W. Richard Stevens的UNIX网络编程 :)
512是你最好的选择.它在别处使用,是一个很好的偶数(1024的一半).
鉴于IPV6的大小为1500,我认为运营商不会为IPV4和IPV6提供单独的路径(它们都是具有不同类型的IP),迫使他们使用ipv4的设备,这将是旧的,冗余的,维护成本更高并且不太可靠.这没有任何意义.此外,这样做可能很容易被认为是为某些交通提供优惠待遇 - 根据他们可能不关心的规则(除非他们被抓住).
所以1472应该是安全的外部使用(虽然这并不意味着像DNS这样不知道EDNS的应用程序会接受它),如果你在谈论内部网络,你可能更有可能知道你的网络布局在哪种情况下巨型数据包大小适用于非分段数据包,因此对于4096 - 4068字节,对于具有9014字节缓冲区的英特尔卡,封装大小为......等待... 8086字节,将是最大...巧合? 暗笑
********更新
各种答案给出了1个SW供应商允许的最大值或假设封装的各种答案.用户没有要求尽可能低的值(如安全UDP大小的"0"),但是最大的安全数据包大小.
可以多次包括各种层的封装值.因为一旦你封装了一个流 - 没有什么可以禁止,比如说下面的VPN层和完全重复的封装层.
由于问题是关于最大安全值,我假设他们正在讨论可以接收的UDP数据包的最大安全值.由于没有保证UDP数据包,如果收到UDP数据包,最大的安全大小将是IPv4上的1个数据包或1472个字节.
注意 - 如果您使用的是IPv6,则最大大小为1452字节,因为IPv6的标头大小为40字节而不是IPv4的20字节大小(无论哪种方式,UDP标头仍必须允许8字节).
我在这里读到了一些好的答案; 但是,有一些小错误.有人回答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报头.