![为什么通过 UDP 的 DNS 有 512 字节的限制?](https://linux22.com/image/630587/%E4%B8%BA%E4%BB%80%E4%B9%88%E9%80%9A%E8%BF%87%20UDP%20%E7%9A%84%20DNS%20%E6%9C%89%20512%20%E5%AD%97%E8%8A%82%E7%9A%84%E9%99%90%E5%88%B6%EF%BC%9F.png)
我一直在寻找该问题(标题中的问题)的答案,而我发现的最好的答案是:
在 DNS 协议设计中,UDP 传输块大小(有效负载大小)被限制为 512 字节,以优化性能,同时产生最小的网络流量。
我的问题是:这究竟如何提高性能,以及使用 UDP 时还有其他原因造成这种限制吗?
答案1
512 字节的有效负载可确保 DNS 数据包在传输过程中发生碎片时能够重新组装。另外,一般来说,较小的数据包被随机丢弃的可能性较小。
这IPv4 标准指定每个主机必须能够重组 576 字节或更少的数据包。使用 IPv4 报头(20 字节,但使用选项时最高可达 60 字节)和 8 字节 UDP 报头,有效负载为 512 字节的 DNS 数据包将小于 576 字节。
正如 @RyanRies 所说:DNS 可以使用 TCP 来传输更大的有效负载以及进行区域传输和 DNSSEC。当 TCP 发挥作用时,延迟会大得多,因为与 UDP 不同,在数据开始流动之前,客户端和服务器之间会进行握手。
答案2
答案3
DNS 操作(例如查询和区域维护操作)默认使用端口 53。出于性能原因,查询使用 UDP 协议,块大小限制为 512 字节。对于查询操作,可以根据事务逐个协商 TCP,但由于 TCP 会产生性能开销,因此这基本上是一种理论上的能力。从历史上看,通常会不惜一切代价避免超过 512 字节的响应大小限制,事实上,13 个 IPv4 根服务器的限制是单个 512 字节 UDP 事务中可以返回的最大值。
Ron Aitchison - Pro DNS 和 BIND 10 - 2011
答案4
这是 QOS 的事情。
由于 UDP 是无状态的,因此无法对数据包进行错误处理。
因此,通过将数据包保持在最大大小,它们到达目的地的可能性就会更大,从而减少缺乏错误处理的影响。