DNS 解析
DNS 解析把 www.example.com 这样的主机名查成 IP 地址。本课冷缓存流程由递归解析器从根向下查询:根与顶级域服务器给转介,example.com 的权威服务器给目标 A 记录。
这像按接待处的指引寻找办公室。前两处不知道具体人,但知道下个管理者;最后一处才给答案。解析器还保存这些指引,后面同域请求可以省掉前面的路程。
DNS 解析如何工作
域名按层次从右到左理解:根委派 com,com 委派 example.com,www 是本课 example.com 区域内的名字,不是自动另立的区域。父区保存委派所需的 NS 等记录,子区管理自己的数据,普通主机记录更新不必集中写进根区。
客户端的 stub resolver 向 recursive resolver 请求完整答案或错误。本课只有一问一答,递归器代它向其他服务器发迭代查询:能答就答,不能则提供更具体的管理者。stub 不参与这些逐级查询。
画布聚焦三类回复:权威 A 答案、权威 NXDOMAIN、NS 转介。真实 DNS 还可能有 CNAME、NODATA、SERVFAIL 等;缓存解析器也可返回缓存答案,根和 TLD 对自己管理的数据亦是权威,不能说它们永远只转介。
解析器按缓存与验证规则保存答案和委派,遵守 TTL。缓存 com 的 NS 可为共享该解析器的其他 .com 请求复用,不仅服务最初那个名字。
逐步演示
默认冷缓存解析 www.example.com,计八条消息:
- 缓存空,顶部层次未活动。
- 展示
(root)→com.→example.com.→www.example.com。前三项是沿途区域,最后为主机名。 - stub 发一次递归
www.example.com A给解析器。 cache.best_ns(name)未找到委派,回到模型 ROOT。真实迭代解析器可用 root hints 引导,转发型则可能交给上游。- 解析器向根询问完整 www.example.com。
- 根回复委派
com. NS a.gtld-servers.net,没有目标地址。 - 收到 NS 转介。此时含 stub 问题共三消息,尚无 A 答案,但已知下一管理者。
- 用两天 TTL 缓存该委派。有效且保留期间,后续 .com 查询可省根这跳。
- 向 a.gtld-servers.net 发相同完整问题。
- 它给
example.com. NS a.iana-servers.net。 - 转介返回,仍无目标 A。
- 缓存第二份委派。
- 查询 example.com 权威服务器。
- 它回复模型答案
www.example.com A 93.184.216.34。 - 答案到解析器,本例迭代结束。
- 按 TTL 缓存 A 记录。
- 返回地址给 stub,stub 只经历自己的问答。
- 八条消息结束。本课答案 TTL 为一小时,有效期间相同请求只需两条。
三个上游往返是六消息,加 stub 两条为八。画布的 IP 与 TTL 是固定示例;93.184.216.34 是 example.com 的历史地址,不能当作当前解析结果。
dig +trace www.example.com 可从本机展示迭代过程,通常能在 AUTHORITY 看 NS、最终 ANSWER 看目标记录;实时委派、别名与额外查询可能让输出不同于本课固定轨迹。
缓存如何省查询
Warm TLD 已保存 com NS a.gtld-servers.net,cache.best_ns(name) or ROOT 直接选 com 服务,根始终不参与。剩两次上游往返加 stub 问答,共六消息。
Warm answer 有未过期 A,resolve 直接返回,不访问任何层次服务器,只剩两消息。实际命中率依查询分布、TTL 与缓存策略而定,不能仅凭冷查八消息就诊断故障。
委派让命名空间分区管理,缓存让同一指引跨请求复用。若根直接保存全部主机答案,所有变化都得集中更新,失去这一分工。
边界情况
- NXDOMAIN 的 missing.example.com 在本冷缓存预设走完整路径,根与 com 委派都合法,由 example.com 权威方确认缺名,消息量和成功例同为八。其他名字可能在更早的委派边界失败,或命中负缓存。
- 负缓存也有期限,由否定回复的 SOA 相关 TTL 规则决定。重复拼错不必每次重走全链。
- 缓存转介不是缓存答案。Warm TLD 仍有两次上游往返,仅省前缀。
- 本课 TTL 到期后删除记录,再查询需重取相关部分。迁移前降低 TTL 要提前生效,已有缓存仍按旧剩余期限使用;更短 TTL 也会增加查询量。真实缓存还可能提前淘汰或按明确策略提供过期内容。
- 真实区域通常有多个 NS,解析器可选服务器、超时重试,UDP 回复截断等情况需 TCP 后备,本课未画。
常见错误
- 认为根把查询转发给 com。它只返回转介,下一次对话由解析器发起。
- 混淆递归与迭代。stub 委托拿最终结果,递归服务内部可迭代,也可再转发给上游。
- 把每层都问完整名当成所有实现的要求。画布如此,现代解析器可做 QNAME minimization,只向各层暴露所需的名字部分。
- 认为 NS 转介直接回答目标地址。NS 指向下个服务器;附加区的 glue A/AAAA 通常是服务器地址,不是本例 www 的答案。
- 以为每个 NXDOMAIN 必须到相同深度。缺失发生在哪个管理边界、缓存是否已有否定,都会改变路径。
- 把八条当每次正常成本,忽略缓存、别名、DNSSEC、重试等条件。
模型范围
每区只画一个 NS,固定记录与 TTL,无 UDP 重试、TCP 回退、EDNS(0)、DNSSEC 验证、CNAME 跟随或 anycast 多实例。
真实转介可在 ADDITIONAL 附 nameserver 的 glue 地址。对受委派区内部的 NS,父区提供可用的必要 glue,避免为找 NS 地址反过来又依赖它本身;详见 RFC 9471。区外 NS 若没有可用缓存或附加地址,可能另查其名字,画布省略这些嵌套访问。不能把“目标 A 未得到”写成“报文里没有任何地址”。
基础协议见 RFC 1034、1035,术语参考 RFC 9499,它已替代 RFC 8499。