DNS 解析的完整过程是怎样的?

进阶高频约 6 分钟读完

一句话回答

浏览器依次查浏览器缓存、操作系统缓存和 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 轮

登录后就可以和 AI 面试官对练,面试记录也会保存下来。登录

这道题你掌握了吗?

选一个最接近的状态,没掌握的题会出现在"我的进度 · 待复习"里。

学习记录暂存在本机浏览器。登录后自动同步到账号,换设备也能看到。