从https://www.cloudflare.com/en-au/learning/dns/dns-server-types/
每个递归解析器都知道这 13 个 DNS 根域名服务器,它们是递归解析器寻找 DNS 记录的第一站。根服务器接受包含域名的递归解析器的查询,然后根域名服务器根据该域名的扩展名(.com、.net、.org 等)将递归解析器定向到 TLD 域名服务器。
但是为什么递归解析器不能直接查询 TLD 服务器呢?据我所知,TLD 服务器只有大约 1500 个,这很容易分布到所有解析器服务器。
需要类似根服务器的东西来将所有 TLD 服务器分发给解析器。但它们只应轮询一次以初始化 TLD 列表。据我了解,每个 DNS 请求都会询问根服务器,例如“.com 的 TLD 服务器在哪里?”这似乎相当低效?
答案1
但是为什么递归解析器不能直接查询 TLD 服务器呢?据我所知,TLD 服务器只有大约 1500 个,这很容易分布到所有解析器服务器。
因为当您拥有 1500 台服务器的列表时,您需要更频繁地分发更新 - 并且避免将这样的列表分发给所有用户(即使只是那些运行解析器的用户)是 DNS 最初构建的原因。
是的,这是可以做到的(在某些情况下确实可以做到),但你仍然需要拥有那些 X 根服务器分发名单无论如何,使用现有的机制更容易——很可能是更多的比每次启动时检索整个列表更有效率。
需要类似根服务器的东西来将所有 TLD 服务器分发给解析器。但它们只应轮询一次以初始化 TLD 列表。据我了解,每个 DNS 请求都会询问根服务器,例如“.com 的 TLD 服务器在哪里?”这似乎相当低效?
是的,每个 DNS 请求都需要这样的查询,但大多数情况下,只要其 TTL 允许,它将直接从解析器的缓存中执行。在这方面,根查询没有什么特别之处——它们像链中的所有其他查询一样被缓存(当然,最终查询也是如此)。
由于每个 TLD 都是单独缓存的,因此这可能比检索整个列表更有效率——对于用户主要需要 10 个 TLD 的解析器来说,它每天只需向根服务器发出 10 次查询。对于包含 1500 个服务器的大型列表,以相同频率刷新整个列表会消耗根服务器上的大量资源,即使您使用增量传输,您仍会收到许多更改,而您不需要。
答案2
正如@gantendo 指出的那样,缓存是存在的。
从https://en.m.wikipedia.org/wiki/Domain_Name_System
如果互联网上的每一次解析都需要从根开始,这种机制将给根服务器带来巨大的流量负担。实际上,DNS服务器使用缓存来减轻根服务器的负担,因此,根名称服务器实际上只涉及所有请求的一小部分。
换句话说,根服务器仅偶尔被轮询以初始化 TLD 列表