8. DNS 解析过程与缓存(热度 318 · 高频选考)
Q: 域名是怎么解析成 IP 的?递归查询和迭代查询有什么区别?
A:
查询链(完整)
diagram
浏览器缓存 → OS 缓存 / hosts → 本地域名服务器 LDNS
→ (迭代)根服务器 → 顶级域服务器(TLD, 如 .com)
→ 权威域名服务器 → 返回 IP/A/AAAA/CNAME- 浏览器缓存: Chrome 等有内置 DNS 缓存。
- 操作系统缓存 / hosts: nscd、systemd-resolved、Windows DNS Client;hosts 静态优先。
- 本地域名服务器(LDNS): 常是运营商或企业 DNS;对主机通常是递归服务器。
- 根域名服务器: 返回 TLD 服务器地址(不直接给 IP)。
- 顶级域服务器: 如
.com返回该域名权威 NS 地址。 - 权威域名服务器: 返回最终记录(A/AAAA/CNAME 等)。
- 逐级缓存: 每一跳按 TTL 缓存(浏览器→系统→LDNS→…)。
递归 vs 迭代
| 递归查询 | 迭代查询 | |
|---|---|---|
| 含义 | 「你帮我查到底,给我最终结果」 | 「你告诉我下一步该问谁」 |
| 常见位置 | 主机 → LDNS | LDNS → 根/TLD/权威 |
| 负担 | 查询代理承担完整查询 | 每级只回答线索,LDNS 自己继续问 |
| 为什么不全程递归 | 根/TLD 若替全世界递归将无法扩展 | 用迭代分散负担 |
记录类型
| 类型 | 作用 |
|---|---|
| A | 域名 → IPv4 |
| AAAA | 域名 → IPv6 |
| CNAME | 别名 → 另一个域名(CDN 常用) |
| MX | 邮件交换服务器 |
| NS | 域名服务器 |
| TXT | 文本(SPF、验证等) |
| PTR | IP → 域名(反向解析) |
设计动机
- 为什么分布式数据库: 单点无法承受全球查询;分层+缓存把负载摊到边缘。
- 为什么 TTL: 缓存权衡:太久更新不及时,太短增加权威负载与延迟。
- 为什么 UDP 53: 查询报文小、一问一答、要低延迟;超时由应用重传兜底。
- 何时 TCP: 区域传送(AXFR/IXFR)、响应超过 512 字节(RFC 1035 规定的传统软上限;RFC 1035 §4.2.1 同时要求不设 EDNS0 时 UDP 数据报至少应支持到 576 字节)→ 截断并置 TC=1,客户端改用 TCP 53 重查;EDNS0(RFC 6891)就是用来抬高这个上限的、DNSSEC 较大记录。
加分点
- DNS 预解析 / HTTPDNS: 移动端弱网下传统 DNS 劫持/调度不准,可用 HTTPDNS 或 DoH/DoT。
- CNAME 与 CDN: 站点域名 CNAME 到 CDN 调度域名,由 CDN 权威返回边缘节点 IP。
- 根服务器: 逻辑 13 组标识(A–M),实际由全球上千个 anycast 实例承载(数量随年份增长,公开统计已逾 1500,答题按「十几台逻辑机构、上千物理实例」表述)。
- 与 URL 过程联动: DNS 解析失败 vs 连接超时 vs TLS 失败,排查命令不同。
常见追问
追问 1:递归查询和迭代查询的区别是什么?主机到 LDNS 是哪种?
- 答题要点: 递归=受托方必须查到最终结果;迭代=返回「下一步问谁」。主机→LDNS 通常是递归;LDNS→根/TLD/权威通常是迭代。
追问 2:DNS 用 UDP 还是 TCP?为什么?
- 答题要点: 默认 UDP 53(小查询、低延迟);区域传送或大响应用 TCP 53。防火墙需两者都考虑。
追问 3:DNS 缓存命中还会有网络 RTT 吗?各级 TTL 如何影响更新?
- 答题要点: 浏览器/系统/LDNS 命中则不走权威,延迟极低。TTL 到期后向上重新查询;运维改记录后需等各层缓存过期,或调低 TTL 预热变更。可
dig +trace观察链。
易错点
| 易错说法 | 纠正 |
|---|---|
| 「根服务器直接返回 IP」 | 根返回 TLD 服务器地址;权威才给记录 |
| 「递归都在全链路」 | 主机→LDNS 递归,其后多为迭代 |
| 「DNS 只有 UDP」 | 大响应/区域传送用 TCP |
| 「hosts 优先级最低」 | 本机 hosts 通常优先于向 LDNS 发起的查询(视 OS) |
| 「CNAME 返回 IP」 | CNAME 返回另一个域名,还要继续解析 |
与选择题对照
- 主库 150: 第 79 题(DNS 主要功能)、第 80 题(DNS 错误叙述)、第 81 题(域名层次最高)、第 82 题(迭代查询中 LDNS 行为)、第 83 题(A 记录)、第 94 题(URL 最先 DNS)、第 65 题(DNS 用 UDP)。
- 补题 16: 无直接 DNS 题;应用层对照见补-14(邮件协议,非 DNS)。
- 口述联动: 选择题考功能/层次/迭代;面试要完整讲查询链 + UDP/TCP + 缓存/TTL + 排障。
工程 / 抓包背景
- 命令:
dig +trace example.com、dig example.com A、nslookup、host、cat /etc/resolv.conf、ipconfig /displaydns(Windows)、resolvectl statistics(旧命令名systemd-resolve,systemd 239 起更名)。 - Wireshark: 过滤
dns;看 Query/Response、TTL、CNAME 链。 - curl:
curl --resolve example.com:443:1.2.3.4 https://example.com绕过 DNS 测源站;curl -v可显示解析到的 IP。 - Nginx:
resolver 8.8.8.8 valid=30s;动态解析 upstream 域名;proxy_pass 变量时需要 resolver。