为什么通过 UDP 的 DNS 有 512 字节的限制?

为什么通过 UDP 的 DNS 有 512 字节的限制?

我一直在寻找该问题(标题中的问题)的答案,而我发现的最好的答案是:

在 DNS 协议设计中,UDP 传输块大小(有效负载大小)被限制为 512 字节,以优化性能,同时产生最小的网络流量。

我的问题是:这究竟如何提高性能,以及使用 UDP 时还有其他原因造成这种限制吗?

答案1

512 字节的有效负载可确保 DNS 数据包在传输过程中发生碎片时能够重新组装。另外,一般来说,较小的数据包被随机丢弃的可能性较小。

IPv4 标准指定每个主机必须能够重组 576 字节或更少的数据包。使用 IPv4 报头(20 字节,但使用选项时最高可达 60 字节)和 8 字节 UDP 报头,有效负载为 512 字节的 DNS 数据包将小于 576 字节。

正如 @RyanRies 所说:DNS 可以使用 TCP 来传输更大的有效负载以及进行区域传输和 DNSSEC。当 TCP 发挥作用时,延迟会大得多,因为与 UDP 不同,在数据开始流动之前,客户端和服务器之间会进行握手。

答案2

现代 DNS 实际上不再限制 UDP 的 512 字节有效负载。

EDNS0在使用中可以指定更大的有效载荷大小,这对于支持 DNSSEC 的客户端来说也很常见。

通过 UDP 支持更大的有效载荷是一把双刃剑,然而,这也是为什么使用名称服务器进行放大攻击变得越来越流行,因为如果攻击者使用获得大量响应的查询,您可以实现更好的放大。

rfc2671了解 EDNS0 的具体细节

答案3

DNS 操作(例如查询和区域维护操作)默认使用端口 53。出于性能原因,查询使用 UDP 协议,块大小限制为 512 字节。对于查询操作,可以根据事务逐个协商 TCP,但由于 TCP 会产生性能开销,因此这基本上是一种理论上的能力。从历史上看,通常会不惜一切代价避免超过 512 字节的响应大小限制,事实上,13 个 IPv4 根服务器的限制是单个 512 字节 UDP 事务中可以返回的最大值。

Ron Aitchison - Pro DNS 和 BIND 10 - 2011

答案4

这是 QOS 的事情。

由于 UDP 是无状态的,因此无法对数据包进行错误处理。

因此,通过将数据包保持在最大大小,它们到达目的地的可能性就会更大,从而减少缺乏错误处理的影响。

相关内容