一次完整的递归解析
从本地缓存检查到 Stub Resolver、递归解析器依次问根/TLD/权威,最终拿到 A/AAAA/HTTPS/CNAME 并返回客户端的全过程。
#type / concept
#status / growing
#tech / network
#protocol / dns
[!info] related notes
- 所属 MOC: DNS 知识地图
- 本地客户端: Stub Resolver
- 递归者: 递归 DNS 解析器
- 上层: 根与顶级域服务器 / 权威 DNS 服务器
- 隐私优化: QNAME 最小化
一次完整的递归解析
一句话定义
一次完整的 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.com 由 ns1.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)。