DNS 解析:把域名变成 IP 的全过程
更新时间:2026-09-17。网络协议域·应用层。DNS 通常是一次网络访问的第一步,解析慢会直接拉高首字节延迟,命令用法见 dig/nslookup。
DNS(Domain Name System)把人类可读的域名(example.com)解析成机器要用的 IP(IPv4 的 A 记录、IPv6 的 AAAA)。它是一个分层、分布式、带强缓存的数据库。
一、一次解析经过的缓存层级
访问一个新域名,查询顺序大致从近到远:
浏览器 DNS 缓存
└─ 操作系统缓存(含 /etc/hosts)
└─ 本地 DNS 解析器(运营商/公共 DNS,如 114/8.8.8.8/1.1.1.1,stub→recursive)
└─ 根服务器 "." (告知 .com 在哪)
└─ 顶级域 TLD ".com"(告知 example.com 的权威服务器在哪)
└─ 权威名称服务器(给出 www.example.com 的最终记录)- 浏览器先查自身缓存;再到操作系统(
getaddrinfo/systemd-resolved),/etc/hosts优先级最高、可直接覆盖。 - 本机没有就发给配置的递归解析器(resolver)。
- 递归器若缓存未命中,代你从根开始做迭代查询(它去一级级问),最终把答案取回并缓存。
终端用户与递归器之间是递归查询("你帮我查到最终答案"),递归器与根/TLD/权威之间是迭代查询("我不知道,但你可以去问谁")——这是递归与迭代的区别。
二、递归 + 迭代的完整例子
主机 -> 递归器: www.example.com 是多少?
递归器 -> 根: www.example.com?
根 -> 递归器: 我不管 .com,去问 .com 的 TLD 服务器(附其地址)
递归器 -> TLD .com: www.example.com?
TLD -> 递归器: 去问 example.com 的权威 NS(附 NS 及 glue 记录)
递归器 -> 权威: www.example.com?
权威 -> 递归器: CNAME www.example.com.cdn.net;A 93.184.x.x
递归器 -> 主机: 最终 IP(并按 TTL 缓存中间与最终结果)根服务器有 13 组逻辑地址(a–m.root-servers.org,实际靠任播有海量实例);TLD(.com/.cn/.org…)由注册局运行;权威服务器由域名所有者或 DNS 服务商托管(NS 记录指定)。
三、常见记录类型
| 类型 | 含义 | 例子 |
|---|---|---|
| A | 域名 → IPv4 | example.com A 93.184.216.34 |
| AAAA | 域名 → IPv6 | example.com AAAA 2606:2800:: |
| CNAME | 规范名,把一个名字别名到另一个名字 | www CNAME example.com,CDN 常用 |
| MX | 邮件服务器(带优先级) | MX 10 mail.example.com |
| TXT | 任意文本(SPF/DKIM、域名所有权验证) | TXT "v=spf1 ..." |
| NS | 该域由哪些权威服务器管 | NS ns1.provider.net |
| PTR | 反向解析 IP→域名 | 邮件反查用 |
| SRV/CAA | 服务定位 / 限定可签发证书的 CA | — |
CDN 典型链路:www.example.com 先 CNAME 到 CDN 厂商域名,再由其权威 DNS 根据调度(用户来源、节点负载)返回最优边缘节点 IP——所以同一域名不同地区解析出不同 IP 是正常的。
四、TTL 与缓存
- 每条记录带 TTL(秒),告诉各级缓存可以存多久。解析快主要靠缓存命中。
- 改 DNS 记录要等旧缓存按 TTL 过期才全球生效("生效时间"),迁移/切流量前应提前调小 TTL。
- 负缓存:解析失败(NXDOMAIN)也会按 SOA 的 minimum TTL 缓存一段时间,删错记录后立即重建也可能暂时仍失败。
- 各级都可能无视/覆盖 TTL(JVM、某些递归器有自己的最小/最大缓存策略)。
五、协议端口与加密
- 传统 DNS 主要用 UDP 53(快、无连接,适合一问一答);当响应超过 512 字节/带 EDNS 大响应、或区域传送 AXFR 时回退/使用 TCP 53。
- 明文 UDP DNS 可被窃听、劫持(投毒、广告劫持)。加密方案:
- DoT(DNS over TLS):TCP 853,专用端口。
- DoH(DNS over HTTPS):跑在 443 的 HTTPS,看起来像普通网页流量,隐私和穿透性好(浏览器/系统可配置)。
六、排查"解析慢/解析错"
dig example.com # 看 ANSWER、查询耗时、用的 SERVER
dig +trace example.com # 从根开始逐级迭代,看卡在哪一级
dig @8.8.8.8 example.com # 指定递归器,对比本地是否被劫持
dig example.com NS +short # 看权威 NS
dig -x 93.184.216.34 # 反向解析
nslookup -type=mx example.com
host -v example.com
systemd-resolve --statistics 2>/dev/null; resolvectl status常见问题:本地 DNS 递归器慢或污染(换公共/可信 resolver 对比)、TTL 未过期导致旧 IP(等过期或本地清缓存:resolvectl flush-caches、浏览器清 DNS)、CNAME 链过长增加往返、只配了 IPv4 但优先解析 AAAA 带来 happy-eyeballs 延迟。
相关阅读
总结
DNS 解析依次查浏览器缓存、系统(hosts 优先)、本地递归解析器,递归器未命中再从根→TLD→权威做迭代查询取回 A/AAAA/CNAME 等记录并按 TTL 缓存;主要走 UDP 53、大响应回退 TCP,可用 DoT/DoH 加密;排查解析慢用 dig +trace/指定递归器,迁移前先调小 TTL、注意负缓存。