我读了许多关于UDP数据包大小的文章,但无法得出正确结论。
许多服务限制最大的UDP数据包为512字节(如DNS)。
考虑到互联网上的最小MTU为576,IPv4头部大小为20字节,UDP头部大小为8字节。因此,还剩下548字节可用于用户数据。
如果不需要分片,我是否能够使用大小为548的数据包?或者是DNS创建者知道的某些问题,这就是为什么他们将其限制为512字节。
甚至可以安全地超过548字节吗?
我读了许多关于UDP数据包大小的文章,但无法得出正确结论。
许多服务限制最大的UDP数据包为512字节(如DNS)。
考虑到互联网上的最小MTU为576,IPv4头部大小为20字节,UDP头部大小为8字节。因此,还剩下548字节可用于用户数据。
如果不需要分片,我是否能够使用大小为548的数据包?或者是DNS创建者知道的某些问题,这就是为什么他们将其限制为512字节。
甚至可以安全地超过548字节吗?
UDP并不是“安全”的,所以问题并不好 - 但是 -
如果您发送9217或更多(mac)或65508+(linux / windows),则套接字发送函数将返回错误。
上述讨论分段和MTU等内容都与主题无关 - 所有这些都发生在较低级别,对您来说是“不可见的”,并且在典型连接中不会对“安全性”产生重大影响。
回答实际问题的含义 - 不要使用UDP - 使用原始套接字,以便更好地控制一切;由于您正在编写游戏,因此您需要深入了解标志以使您的流量具有优先级,因此您可能会同时解决UDP问题。
我担心我的回答会引起不满,但是为了澄清我的观点或者对于那些对这个问题感兴趣的人:
根据我理解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))。
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个片段。请记住,任何这些片段的丢失都将导致整个数据包无用。