DNS 解析的完整过程是怎样的?
一句话回答
浏览器依次查浏览器缓存、操作系统缓存和 hosts 文件,都没有就请求本地 DNS 服务器(递归解析器)。本地 DNS 服务器也没有缓存时,依次向根域名服务器、顶级域名服务器、权威域名服务器查询,拿到 IP 后返回给客户端并缓存。客户端到本地 DNS 服务器是递归查询,本地 DNS 服务器向各级域名服务器是迭代查询。
详细解析
域名的层级结构
www.example.com.
│ │ │ │
│ │ │ └─ 根域(.),书写时通常省略
│ │ └─── 顶级域(TLD):com、cn、org 等
│ └───────── 二级域:example.com,一般就是注册的域名
└─────────────── 子域:www.example.com,由域名所有者自己设置
解析过程
浏览器
1. 查浏览器自己的 DNS 缓存
2. 查操作系统的 DNS 缓存和 hosts 文件
3. 都没有,向本地 DNS 服务器发起查询(递归查询)
│
▼
本地 DNS 服务器(递归解析器):有缓存就直接返回,没有就逐级去问(迭代查询)
4. 问根域名服务器 → 告诉它 com 顶级域名服务器的地址
5. 问 com 顶级域名服务器 → 告诉它 example.com 权威域名服务器的地址
6. 问 example.com 的权威域名服务器 → 返回 www.example.com 的 IP:203.0.113.10
7. 把 IP 返回给浏览器,并按 TTL 缓存
- 本地 DNS 服务器通常由运营商提供,联网时自动配置;也可以手动改成 223.5.5.5(阿里)、8.8.8.8(Google)等公共 DNS
- 各级结果都会被缓存,实际很少需要从根开始查,比如 com 顶级域名服务器的地址通常早就在本地 DNS 服务器的缓存里了
- 根域名服务器只有 13 个名字(a.root-servers.net 到 m.root-servers.net),但它们通过任播在全球部署了大量节点,并不是全球只有 13 台机器
- DNS 查询通常使用 UDP 的 53 端口,响应过大时改用 TCP(见 从输入 URL 到页面显示 的追问)
常见记录类型
| 类型 | 作用 | 举例 |
|---|---|---|
| A | 域名指向 IPv4 地址 | www.example.com → 203.0.113.10 |
| AAAA | 域名指向 IPv6 地址 | www.example.com → 2001:db8::10 |
| CNAME | 别名,把域名指向另一个域名,接入 CDN 时常用(见 CDN) | www.example.com → CDN 厂商分配的域名 |
| MX | 指定接收邮件的服务器 | example.com → mail.example.com |
| NS | 指定这个域由哪些权威域名服务器负责解析 | example.com → ns1.example.net |
| TXT | 存放任意文本,常用于域名所有权验证、SPF(声明哪些服务器可以用这个域名发邮件) | v=spf1 ip4:203.0.113.0/24 -all |
TTL
每条记录都带有 TTL(单位是秒),浏览器、操作系统、本地 DNS 服务器在 TTL 内直接使用缓存。修改记录后,要等各级缓存里的旧记录过期,新记录才会全面生效。
前端优化
- 用
dns-prefetch提前解析后面会用到的域名,比如<link rel="dns-prefetch" href="https://cdn.example.com">(见 资源提示) - 减少页面使用的域名数量:每多一个域名,就多一次 DNS 解析,还要新建连接
安全问题
- DNS 劫持:解析结果被篡改、返回错误的 IP,比如运营商把访问导向广告页,或者路由器的 DNS 设置被恶意修改
- 缓存污染(DNS 投毒):攻击者伪造 DNS 响应,让解析器缓存错误的记录,所有使用这个解析器的用户都会受影响
| 对策 | 做法 | 解决的问题 |
|---|---|---|
| HTTPDNS | 客户端通过 HTTP 直接向可信的 DNS 服务查询 IP,绕过运营商的本地 DNS,移动端 App 常用 | 运营商劫持;还能让 CDN 调度更精准 |
| DoH / DoT | DNS over HTTPS / DNS over TLS,对 DNS 查询加密 | 查询被窃听、篡改 |
| DNSSEC | 给 DNS 记录加数字签名,解析器可以验证记录有没有被篡改 | 记录被篡改、投毒;但不加密,查询内容仍然可见 |
HTTPS 也能兜底:即使 DNS 被劫持到假服务器,对方拿不出有效的证书,浏览器会报错(见 HTTPS)。
面试官可能追问
递归查询和迭代查询有什么区别?
- 递归查询:被问的一方负责查到最终结果再返回,提问方只问一次。浏览器、操作系统向本地 DNS 服务器发起的就是递归查询
- 迭代查询:被问的一方只回答"下一步该去问谁",由提问方自己继续问。本地 DNS 服务器向根、顶级、权威域名服务器发起的是迭代查询
这样分工,根和顶级域名服务器只需返回下一级的地址,不用替所有客户端跑完整个查询,负担小很多。
为什么修改 DNS 记录后不是立刻生效?
解析结果在浏览器、操作系统、本地 DNS 服务器等多个地方都有缓存,旧记录要等 TTL 到期才会被丢弃,有些解析器还不完全遵守 TTL。所以迁移服务器前,可以提前把 TTL 调小(至少提前一个旧 TTL 的时间),切换完成后再调回来。本地调试时可以手动清缓存:Windows 用 ipconfig /flushdns,Chrome 可以在 chrome://net-internals/#dns 页面清除。
CNAME 和 A 记录有什么区别?
A 记录直接把域名指向 IP;CNAME 把域名指向另一个域名,解析器还要继续解析目标域名才能拿到 IP。CNAME 的好处是目标 IP 由对方维护:接入 CDN 后,CDN 厂商可以根据用户位置返回不同节点的 IP,自己不用改任何记录。限制是 CNAME 不能和同名的其他记录共存,而主域名(如 example.com,也叫裸域名)上必须有 NS、SOA 记录,所以通常不能设置 CNAME,有些 DNS 服务商提供 CNAME 拉平或 ALIAS 记录来解决。
易错点
- 递归和迭代的方向不要说反:客户端问本地 DNS 服务器是递归,本地 DNS 服务器问根、顶级、权威域名服务器是迭代
- 改了 hosts 文件没生效,可能是浏览器还在用自己缓存的旧结果,或者开着代理
- DNSSEC 只防篡改、不加密;防窃听要用 DoH / DoT
AI 模拟面试官
用自己的话回答,AI 对照参考答案打分、指出遗漏,再追问,最多 3 轮
这道题你掌握了吗?
选一个最接近的状态,没掌握的题会出现在"我的进度 · 待复习"里。
学习记录暂存在本机浏览器。登录后自动同步到账号,换设备也能看到。