DNS 解析原理:域名是怎么变成 IP 的
一次域名解析背后,请求要经过递归解析器、根、顶级和权威服务器的接力,最终把 `example.com` 变成一个可连接的 IP 地址。
当你在浏览器输入 example.com 时,计算机并不能直接拿这个名字去连接服务器——网络通信靠的是 IP 地址。把人类可读的域名翻译成 IP 的过程,就是 DNS 解析(Domain Name System)。它像一本全球分布式的电话簿,而查询过程是一场多方接力。
两种查询:递归与迭代
DNS 查询有两种风格:
- 递归查询(recursive):你把问题「全权委托」给一台服务器,它负责跑完全程,直接把最终答案还给你。你的电脑对递归解析器发起的就是这种请求。
- 迭代查询(iterative):被问的服务器如果不知道答案,只回复「我不知道,但你去问它」,给出下一跳的线索。递归解析器对上游各级服务器用的就是这种方式。
简单说:你只问一次(递归),而解析器替你问了很多次(迭代)。
DNS 的层级结构
权威数据分布在一棵树上,从右往左逐级细化:
- 根 DNS(Root):全球 13 组根服务器,知道每个顶级域该去哪查。
- 顶级域 DNS(TLD):负责 .com、.net、.org 等后缀,知道每个二级域名的权威服务器在哪。
- 权威 DNS(Authoritative):持有 example.com 的真实记录(A、AAAA、MX 等),给出最终答案。
权威 NS 通常由域名注册商或专业 DNS 服务商托管——你在注册商后台填写的「NS 记录」,就是在指定谁对你的域名有最终解释权。
一次解析的完整旅程
以查询 www.example.com 为例:
- 电脑先查本地缓存(浏览器 / 操作系统 / hosts),命中则直接返回。
- 未命中,则请求配置的递归解析器(如运营商的,或公共的 8.8.8.8)。
- 解析器缓存也没有,便迭代询问:先问根,根指向 .com 的 TLD 服务器。
- 解析器再问 TLD,TLD 返回 example.com 的权威服务器地址。
- 解析器最后问权威服务器,拿到 www 的 IP。
- 解析器把结果缓存一段时间(由记录的 TTL 决定)后返回给你,浏览器随即发起连接。
缓存无处不在,正是它让绝大多数查询无需再惊动根服务器。
用 dig / nslookup 观察
在 Ubuntu/Debian 上安装工具:
sudo apt update
sudo apt install dnsutils
查看最终结果:
dig www.example.com A +short
nslookup www.example.com
用 +trace 亲眼看递归解析器如何从根一路问到权威:
dig www.example.com +trace
查看域名的权威 NS,以及缓存剩余的 TTL:
dig example.com NS +short
dig www.example.com # 关注返回中的 TTL 数值
小结
DNS 解析是把域名翻译成 IP 的接力过程:你的电脑对递归解析器发一次递归请求,解析器再用迭代方式,依次问过根 → TTL → 权威三级服务器,拿到 IP 并按 TTL 缓存。理解这条链路,再配合 dig +trace,排查「域名打不开」「改了解析不生效」这类问题就会清晰很多。