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


201

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

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

给定Internet上的最小MTU为576,IPv4标头的大小为20个字节,而UDP标头的大小为8个字节。剩下548个字节可用于用户数据

我可以使用不超过548个大小的数据包而不会造成数据包碎片吗?还是DNS的创建者知道某些东西,以及为什么他们将其限制为512字节。

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



10
这是一个严肃的问题。我想问的是,我可以通过互联网发送的最大数据包(不了解其他网络或进行探测)是什么,该数据包不会产生碎片。本质上是最大的安全大小,它将在任何情况下都起作用,而不必担心探测连接。
KM

2
您无法消除碎片的可能性,但这不会降低安全性。如果片段被丢弃,就好像整个数据包都被丢弃一样,无论如何都是UDP。如果数据包超出了路由器需要支持的最小大小,因此不能保证可交付(相对于保证已交付),将是不安全的。这就是512字节数字的来源
。– Beejor

Answers:


129

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


36
只是要清楚:避免碎片的小尺寸并不能使数据包“安全”地发送,仍然有无数种可能使数据包不可靠,例如将我的网络电缆吞噬了。那说; 碎片少可以使传送“更安全”,因为如果有一个以上的碎片,而其中任何一个从未达到,则UDP将丢弃整个数据包(数据报)。
markmnl

3
出于问题的考虑,人们会假定使用海报的“安全”定义,而不是某些标准书中从未见过的定义。
阿斯塔拉

是否已经知道现实世界中的路由器会丢弃UDP数据包而不是对其进行分段?
user253751 '19

60

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

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

话虽这么说,大多数协议的大小限制都非常小-通常为512,或者有时为8192。如果您处于可靠的网络中,则通常可以安全地超过548,但是如果您要通过整个Internet进行广播,则更大您去的时候,您更有可能遇到数据包传输问题和丢失。


39
Microsoft链接不是规范性引用。RFC是规范性参考。您引用的内容仅适用于IPv4。
罗恩侯爵

2
仅仅因为MS允许它并不意味着它总是一个好主意,因为中间路由器等可能会被迫分割更大的数据包大小(如您所述)。
rogerdpack

1
@EJP他们没有在Microsoft链接上清楚地解释它,但这似乎是IPv4的必然结果:IPv4的总长度字段为16位,并且该值必须包括IP报头的长度和IP报头的长度。 UDP标头。
jtpereyda

@jtpereyda我完全了解所有这些。我的意思恰好是我已经说过的:您应该在存在规范引用的地方引用它们。
洛恩侯爵

考虑到我的wifi卡(IEEE 802.3)只能执行1500 MTU,而巨型帧只有9k字节,我认为最大UDP数据包大小不会达到65507字节。
Christian Stewart

52

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


2
默认情况下,任何UDP数据包都被视为“ _U_nreliable”。您可以预期收到的唯一安全UDP数据包大小为1,即未分段的数据包。如果要“安全”数据包,请在TCP之上使用数据包协议。
阿斯塔拉

26
@Astara是的,从本质上讲UDP是不可靠的。但是问题是给定大小的数据包是否保证可交付,而不是保证交付。任何路由器都可以出于任何原因丢弃(或丢弃)特定大小的数据包,而根据行业标准,所有路由器都必须尽力处理较小的数据包。因此,在这种情况下,“安全”的意思是“我的汽车能装到桥下吗”,而不是“我的汽车会堵车”。
Beejor

1
我建议停止重复某些随机家伙说的话并检查事实,因为UDP实际上非常可靠。顺便说一句,我在UDP上有安全的数据包,而没有TCP的不必要开销。 openmymind.net/How-Unreliable-Is-UDP
Pablo Ariel

5
UDP不是“不可靠”的,因为丢弃的数据包数量很大,而是因为数据包可以(并且被丢弃)。您不能“依赖”任何特定的数据包到达,订购或确认。数据非常脆弱,这就像说在99%的时间内都能正常工作的汽车转向系统和89%的正确方向的汽车转向系统一样,都是可靠的。并不是说UDP在很多事情上都不是很好,而是它要求您在其上面基本编写自己的“ TCP”版本。这是游戏开发人员世界中一个有趣的现实案例(尽管有些过时):gamasutra.com/view/feature/131781
Beejor

@Beejor您在正确的道路上,但是“它要求您基本上在其上面编写自己的版本的“ TCP””是完全错误的。UDP非常适合广播,非常适合快速发送“非关键”数据。(关于游戏),您可以使用UDP发现(LAN)服务器/服务,并使用UDP快速发送玩家位置。如果一个数据包被丢弃;您不必担心,因为下一个数据包将具有其他玩家的最新位置。TCP可能具有“乱序”数据包,具有开销并且不能完全进行一对多连接。在某些情况下,UDP可能更适用。
保罗

46

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


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

@Astara在IPv6中,分段是由发送方完成的,因此对于不兼容的不兼容的中间路由器没有问题。而且,如果接收方不是受内存限制的嵌入式大小,则它可能可以重新组装至少64kB的数据包。
user253751 '19

@ user253751不仅仅是不兼容的路由器会造成碎片。有路径MTU发现,但即使这样还不足以完全消除碎片。
dstromberg

@dstromberg在哪些情况下允许IPv6路由器对数据报进行分段?
user253751

@ user253751我还没有太多的IPv6,但是这里有一个例子:假设一个IPv6网络向另一个也支持jumbograms的IPv6网络发送了jumbograms(> 65536字节)。进一步假设“路径MTU发现”说应支持这些jumbograms,而不会造成碎片。但是,然后对路由器重新上电,然后将一部分网络路径替换为未配置为抖动的设备。
dstromberg

14

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


11

IPv4的最小重组缓冲区大小为576,IPv6的最小重组缓冲区大小为1500。从此处减去标头大小。请参阅W. Richard Stevens撰写的UNIX Network Programming:)


1
最低,当然。感谢您发现它。不知道这些年来怎么没人注意到这个错误。
Nikolai Fetissov '16

1
尽管IPv6的最小重组缓冲区为1500,但不允许对IPv6数据包进行分段,而最小IPv6 MTU为1280。终端设备永远不需要重组分段的IPv6数据包。
罗恩·莫平

1
@RonMaupin IPv6数据包可以由端点分段。只是不在中间的路由器。
纳文

3
@Navin,不,IPv6数据包不会被分段,在将数据打包为IPv6数据包之前,必须先对数据进行分段,但数据包本身不会被分段。它们是有区别的。与具有要处理分段的字段的IPv4数据包头不同,IPv6数据包头没有任何内容可以处理分段。IPv6数据包头比IPv4数据包头简单得多。
罗恩·莫平


6

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


1
您如何计算1472?以太网的MTU为1500,这是您所指的吗?
rogerdpack

4
@rogerdpack我认为他的意思是因为IPv4和IPv6可能共享许多基础结构,并且IPv6变得相对流行,所以应该假设IPv6限制(因此为1500)是安全的。但是,我无法确定这种推理的有效性。
Thomas

2
网络“链”中的IPv6兼容组件必须支持1500-如果使用的IPv4可以在支持IPv6的链上传输(尽管并非如此),则因为IPv4的标头大小为20字节,并且UDP的标头大小为8个字节,这将使1500-20-8 = 1472成为最大安全大小(因为IPv6不允许分段)。注意-如果人们添加了足够多的封装层,则可以想象没有足够的数据空间。由于您要求的是MAX,因此将假定未使用多层封装开销。
Astara

1500必须通过网络链的IPv6兼容的组件来支持。 ”不,最小的IPv6 MTU是1280。以太网MTU是1500
罗恩莫平

@RonMaupin-原始Q是最大的安全UDP数据包大小,而不是MTU。请参阅RFC2460。除了提到1280个八位位组的MTU之外,它还指出:节点必须能够接受一个分片的数据包,当重组时,它最多可以容纳1500个八位位组。处理大于1500的数据包是可选的。
Astara

6

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


1
您没有回答问题。发问者想知道他们可以用来避免数据包碎片的最大大小是多少。
阿斯塔拉

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))


1
UDP报头的数据报长度字段为16位,这意味着最大的理论UDP数据报为65,535,但是由于UDP封装在IP数据包中而无法实现,理论上最大总长度为65,535(相同),但您必须从该大小中减去IP和UDP标头,以计算出理论上的最大数据大小。
罗恩·莫平

我很久以前问过这个问题,但它只是在寻找务实的答案(在现实生活中可行),而不是规范或理论上的说法。我想让数据包从a到b没有碎片,这是一个实时游戏网络问题-我认为现在有很多更聪明的人开发的解决方案:)
KM
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.