一次完整的递归解析

从本地缓存检查到 Stub Resolver、递归解析器依次问根/TLD/权威,最终拿到 A/AAAA/HTTPS/CNAME 并返回客户端的全过程。

#type / concept #status / growing #tech / network #protocol / dns

[!info] related notes

一次完整的递归解析

一句话定义

一次完整的 DNS 递归解析,是「本地检查 → Stub 交递归 → 递归依次问根/TLD/权威 → 返回并缓存」的链路;缓存命中时可跳过大部分外层查询。

核心机制 / 工作原理

以查询 www.example.com A 为例:

1. 本地检查

应用或系统先查:

应用缓存 → 系统 DNS 缓存 → hosts 文件 → 本地解析策略

命中有效缓存就直接返回,不访问外部 DNS。

2. 交给递归解析器

Stub Resolver 发出:

QNAME = www.example.com
QTYPE = A

含义:请告诉我 www.example.com 的 IPv4 地址。

3. 递归解析器问根

根只返回 .com 的 NS 委派:「去问 .com 的服务器」。

4. 问 .com

.com 权威返回:example.comns1.example-dns.net / ns2.example-dns.net 负责。

5. 问 example.com 权威

权威最终可能返回:

www.example.com.  300  IN  A  203.0.x.x

或返回 CNAME:

www.example.com.  300  IN  CNAME  edge.cdn.example.

解析器再继续把 edge.cdn.example. 解析成 IP。

6. 返回客户端

递归解析器把结果返回 Stub Resolver,并按 TTL 缓存。客户端随后连接 203.0.x.x:443

7. 查询结束

DNS 查询到这里已结束。后续 TCP、QUIC、TLS、HTTP 都属于其他协议层(见 dns-roles-beyond-phonebook)。

最小例子 / 最小场景

dig +trace www.example.com A

输出会依次显示:根返回的 .com NS、.com 返回的 example.com NS、权威返回的 A 记录,正是上面 1–6 步的可观测呈现。

边界与易混淆点

  • 递归 + 迭代混合:客户端→递归解析器是「递归」(帮我查到底);递归解析器→根/TLD/权威是「迭代」(每级只回「去问下一级」)。
  • 缓存可跳过整段:热缓存时根本不会触碰根与 TLD,这也是为什么大部分日常查询很快。
  • CNAME 链每多一层,就多一次「解析别名→解析目标」的过程,任何一层受缓存/调度/配置影响都会改变最终结果(见 dns-cname)。
  • 看到 SERVFAIL / 超时,要先判断断在链的哪一段(见 dns-systematic-diagnosis)。
创建于 2026/7/31 更新于 2026/7/31