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

245

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

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

考虑到互联网上的最小MTU为576,IPv4头部大小为20字节,UDP头部大小为8字节。因此,还剩下548字节可用于用户数据。

如果不需要分片,我是否能够使用大小为548的数据包?或者是DNS创建者知道的某些问题,这就是为什么他们将其限制为512字节。

甚至可以安全地超过548字节吗?


2
重复,请参见https://dev59.com/yXNA5IYBdhLWcg3wmfAa - ChrisW
13
这是一个略微不同的问题。我正在问的是,在不了解其他网络或进行探测的情况下,我可以发送的最大数据包大小(不需要分段)。基本上是最大安全尺寸,适用于所有设备而无需担心连接的探测。 - K M
2
你无法消除碎片化的可能性,但这并不会使事情变得不安全。如果一个分片被丢弃,那么与UDP本身丢弃整个数据包是一样的。不安全的情况是数据包超过了路由器所需支持的最小大小,并因此不能保证可传递(而不是保证已传递)。这就是512字节的数字发挥作用的地方。 - Beejor
13个回答

2

UDP并不是“安全”的,所以问题并不好 - 但是 -

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

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

上述讨论分段和MTU等内容都与主题无关 - 所有这些都发生在较低级别,对您来说是“不可见的”,并且在典型连接中不会对“安全性”产生重大影响。

回答实际问题的含义 - 不要使用UDP - 使用原始套接字,以便更好地控制一切;由于您正在编写游戏,因此您需要深入了解标志以使您的流量具有优先级,因此您可能会同时解决UDP问题。


0

我担心我的回答会引起不满,但是为了澄清我的观点或者对于那些对这个问题感兴趣的人:

根据我理解https://www.rfc-editor.org/rfc/rfc1122,它的状态是“正式规范”,因此是本问题中使用术语的参考依据,既没有被其他RFC取代,也没有勘误与以下内容相矛盾:

从理论上讲,即基于书面规范,UDP(如https://www.rfc-editor.org/rfc/rfc1122#section-4所述)没有“数据包大小”。因此,答案可能是“不确定的”。

实际上,这可能与当前技术的应用有所不同,而这也是这个问题想要探讨的,但我不确定。

如果我的言行导致了不悦,我深表歉意。https://www.rfc-editor.org/rfc/rfc1122#page-8 在“Internet协议套件”和“架构假设”中,并没有清楚地说明我所依据的“假设”,根据我所听到的,即层是分离的。也就是说,UDP所在的层并不需要关注IP所在的层(而IP层确实有一些像重组、EMTU_R、分段和MMS_R这样的东西(https://www.rfc-editor.org/rfc/rfc1122#page-56))。


1
UDP头部有一个数据报长度字段,它是16位的,这意味着最大的理论UDP数据报是65,535,但是这个值永远无法达到,因为UDP被封装在IP数据包中,而IP数据包的理论最大长度也是65,535(相同),但你必须从该大小中减去IP和UDP头部的长度才能计算出理论上的最大数据大小。 - Ron Maupin
我很久以前就问过这个问题,但当时寻求的是实用的答案(即真实情况下有效的解决方法),而不是规范/理论上的解决方案。我想在不发生分段的情况下从a到b获取数据包,这是一个实时游戏网络问题 - 我认为现在有许多由更聪明的人开发的解决方案 :) - K M

0

UDP有不同的最大值。最终,你可以自己选择哪些限制足够安全。注意:UDP本身并不安全,因此你的数据包随时可能会丢失。

注意:所有这些都有一个范围。它实际上可以有多大,取决于你的IP选项。一般来说,你可以这样计算:[上限]-[IP选项的长度,以字节为单位]。这里列出的所有范围都不包括UDP头(8个字节)

最小最大传输限制(或类似名称,我忘记了实际名称,也找不到):512-552字节

这可能是最安全的大小。IPv4协议要求所有跳转传输这个大小的数据包,较大的数据包可能会被任何主机随时丢弃。

最大传输单元:1432-1472:

这个大小的数据包可以在单个以太网帧中发送而不需要分段。任何片段的丢失都将导致整个数据包无用。因此,当超过此限制时,由于分段和单个片段的潜在丢失,你的数据包变得无用的几率会增加。

绝对极限:65467-65507:

没有数据包可以超过这个限制,因为在这个限制下,IPv4协议达到了其最大潜力。您无法发送更大的数据包。这是因为IPv4协议仅为总长度保留了2字节(16位)。将所有这些位设置为1,您将获得65535。减去IP(20-60字节)和UDP头(8字节),您就会得到这个限制。这样大小的数据包将导致至少44个片段。请记住,任何这些片段的丢失都将导致整个数据包无用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接