当前位置:  开发笔记 > 前端 > 正文

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

如何解决《Internet上最大的安全UDP数据包大小是多少》经验,为你挑选了9个好方法。

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

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

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

我是否能够使用大小为548的数据包而不会出现数据包碎片?或者是DNS的创建者知道什么,以及为什么他们将其限制为512字节.

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



1> mark4o..:

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


需要明确的是:小尺寸以避免碎片并不能使数据包的传输"安全",仍然存在无限的可能性,使得交付不可靠,例如狗吃了我的网络电缆.那说; 拥有更少的碎片使得交付"更安全",因为如果有多个并且其中任何一个从未做过 - 整个数据包(数据报)被UDP丢弃.
出于问题的考虑,人们会假定使用海报的“安全”定义,而不是某些标准书中从未见过的定义。

2> Reed Copsey..:

UDP数据包的最大大小的理论限制(在Windows上)为65507字节.这在此处记录:

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

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


Microsoft链接不是规范性参考.RFC是规范性参考; 而您所引用的内容仅适用于IPv4.
仅仅因为MS允许它并不意味着它总是一个好主意,因为中间路由器等可能被迫分割更大的数据包大小(正如你所提到的).

3> Beejor..:

最大安全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


@Astara True,本质上UDP是不可靠的.但问题是,是否保证给定大小的数据包是可交付的,而不是保证交付.根据行业标准,超过一定大小的数据包可以由任何路由器以任何原因(并且被)丢弃,而较小的数据包*必须由所有路由器尽力处理.因此,"安全"在这种情况下意味着"我的车是否适合在桥下",而不是"我的车会堵塞交通".
UDP不是"不可靠",因为丢弃的数据包的数量*,但因为数据包*可能被*(和)丢弃.您不能"依赖"任何特定的数据包到达,订单或确认.数据是脆弱的,这就像说汽车转向99%的时间工作,89%的正确方向,是可靠的.并不是说UDP对很多东西来说并不是很好,只是它要求你基本上在它上面编写自己的"TCP"版本.这是游戏开发世界中一个引人入胜的真实案例(虽然有点过时):http://www.gamasutra.com/view/feature/131781
默认情况下,任何UDP数据包都被视为“ _U_nreliable”。您可以预期收到的唯一安全UDP数据包大小为1,即未分段的数据包。如果要“安全”数据包,请在TCP之上使用数据包协议。

4> 小智..:

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


如果且仅当您的网络不承载IPv6时才如此。如果它携带IPv6,请使用IPv6标头的最大数据包大小,然后减去用于在IPv6上进行IPv4的封装标头。;-)

5> edW..:

本文介绍了最大传输单位(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



6> Nikolai Feti..:

IPv4 最小重组缓冲区大小为576,IPv6为1500.从此处减去标头大小.请参阅W. Richard Stevens的UNIX网络编程 :)


为576,IPv6为1500.从此处减去标头大小.请参阅
@Navin,不,IPv6数据包不会被分段,在将数据打包为IPv6数据包之前,必须先对数据进行分段,但数据包本身不会被分段。它们是有区别的。与具有要处理分段的字段的IPv4数据包头不同,IPv6数据包头没有任何内容可以处理分段。IPv6数据包头比IPv4数据包头简单得多。

7> Justin Niess..:

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



8> Astara..:

鉴于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字节).


@rogerdpack我认为他的意思是因为IPv4和IPv6很可能共享很多基础设施,并且IPv6越来越受欢迎,因此假设IPv6限制应该是安全的(因此1500).然而,这个推理的有效性如何,我无法分辨.
网络"链"中的IPv6兼容组件必须支持1500 - 如果使用IPv4,它可以通过支持IPv6的链路传输(虽然反之亦然),那么因为IPv4的报头大小是20字节, UDP的头大小为8个字节,这将留下1500-20-8 = 1472作为最大安全大小(因为IPv6不允许分段).注意 - 如果人们添加足够的封装层,可以想象没有可用于DATA的空间.因为你要求MAX,所以假设没有使用多层封装开销.

9> 小智..:

我在这里读到了一些好的答案; 但是,有一些小错误.有人回答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报头.

推荐阅读
kikokikolove
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有