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

Moh*_*mel 18 domain-name-system

我一直在寻找这个问题的答案(标题中的那个),我发现的最好的事情是:

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

我的问题是:这究竟如何提高性能,使用 UDP 时是否还有其他原因导致此限制?

Eva*_*son 22

512 字节的有效负载确保 DNS 数据包在传输过程中出现碎片时可以重新组合。此外,一般来说,随机丢弃较小数据包的可能性较小。

IPv4的标准指定每个主机必须能够以576个字节以内重组的工作。使用 IPv4 标头(20 字节,尽管它可以高达 60 字节带选项)和 8 字节 UDP 标头,具有 512 字节有效载荷的 DNS 数据包将小于 576 字节。

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

  • 相关说明:总是有 13 个根 DNS 解析器名称(a.root-servers.net 到 m.root-servers.net)的原因是因为这是可以容纳在对查询的 DNS 响应中的最大数量不超过 512 字节限制的根。因此,即使我们向根 DNS 基础设施添加更多物理服务器,逻辑上也将始终保留 13 个根服务器。 (9认同)
  • @RyanRies 对于具有更大允许负载的 DNSSEC EDNS0 实际上是正常的操作模式,而不是 TCP。 (2认同)

Håk*_*ist 15

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

使用EDNS0 时,可以指定更大的有效负载大小,这对于 DNSSEC 感知客户端来说也是常见的情况。

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

有关EDNS0的详细信息,请参阅rfc2671

  • 这是真的,但仍然有路由器和防火墙会丢弃超过 512 字节的 UDP DNS 数据包。 (2认同)
  • @RyanRies 是的,虽然这当然是按照今天的标准被认为不正确的行为,但它仍然偶尔会导致问题。(理论上,如果有这样的限制,人们就会知道配置相关软件不宣传处理/不发送更大响应的能力。) (2认同)