DNS 的解析过程是怎样的?
简化版
DNS 把域名解析成 IP,过程是逐级查缓存 + 分层查询:先查浏览器缓存 → 系统缓存 → hosts 文件 → 本地 DNS 服务器;本地 DNS 没有就替你去问 根域名服务器 → 顶级域(TLD)服务器 → 权威域名服务器,一层层拿到最终 IP,再逐级缓存返回。域名是分级的(. → .com → example.com),查询也就沿着这个层级走。
详细版
完整解析流程(访问 www.example.com):
- 浏览器缓存:浏览器先查自己缓存过的域名→IP;
- 操作系统缓存 + hosts 文件:查系统 DNS 缓存,以及本地
hosts文件(hosts 里配了就直接用); - 本地 DNS 服务器(递归解析器,通常是运营商或 8.8.8.8 这类):以上都没命中,就请求它。它若有缓存直接返回,没有则代替你去递归查询:
- 问根域名服务器(
.):根不知道具体 IP,但告诉你「去问.com的 TLD 服务器」; - 问顶级域 TLD 服务器(
.com):它告诉你「去问example.com的权威服务器」; - 问权威域名服务器(
example.com):它保存着www.example.com的真实记录,返回 IP;
- 问根域名服务器(
- 本地 DNS 把 IP 缓存(按 TTL)后返回给你,浏览器拿到 IP 去建连。
完整版教学
一、域名是分级的,查询也分级
理解 DNS 的钥匙是域名的层级结构。www.example.com 从右往左是逐级细分的:
. 根(root)
└── com 顶级域 TLD
└── example 二级域
└── www 主机名
没有一台服务器存着全世界所有域名(那不可能),而是分层分布式管理:根服务器管「各 TLD 在哪」,TLD 服务器管「该顶级域下各域名的权威服务器在哪」,权威服务器管「该域名的具体记录」。查询就沿着这个层级从根往下问,一级级被指引到最终答案。这是一个巨大的分布式数据库。
二、多级缓存:绝大多数查询根本到不了根服务器
如果每次解析都从根开始查,根服务器早就被压垮了。实际上 DNS 靠多级缓存把绝大部分查询挡在前面:
- 浏览器缓存、操作系统缓存、hosts、本地 DNS 服务器缓存,任何一层命中就直接返回;
- 常用域名(如各大网站)几乎总在本地 DNS 的缓存里,根本不用往上查。
所以真正走完「根 → TLD → 权威」全程的查询很少,多数在本地就解决了。缓存的有效期由记录的 TTL 控制(详见「DNS 缓存与 TTL」那道题)。
三、递归查询 vs 迭代查询
解析过程里其实有两种查询模式(详见「递归查询和迭代查询」那道题):
- 你 → 本地 DNS:递归查询——你只管问一次,本地 DNS 负责一路查到底、把最终 IP 给你;
- 本地 DNS → 根/TLD/权威:迭代查询——每一级不直接给答案,只给「下一步该问谁」的指引,本地 DNS 顺着指引一级级问下去。
这样概括:本地 DNS 对你是「全包」的递归,对上游是「自己一步步问」的迭代。
四、hosts 文件的特殊地位
hosts 文件(Windows 在 C:\Windows\System32\drivers\etc\hosts,Linux/Mac 在 /etc/hosts)是本地的「域名→IP」静态映射表,优先级高于 DNS 查询。配了它就直接用、不走 DNS。
用途:本地开发(把域名指到 127.0.0.1)、临时绕过 DNS、屏蔽广告域名(指到无效 IP)。这也是为什么「改了 hosts 立即生效」——它在 DNS 查询之前就拦截了。
五、常见误区
- ❌ 以为每次解析都从根服务器开始——绝大多数命中本地各级缓存,到不了根。
- ❌ 以为有一台服务器存所有域名——DNS 是分层分布式的,根/TLD/权威各管一段。
- ❌ 忽略 hosts 文件——它优先于 DNS 查询,配了就直接用。
- ❌ 把「你→本地DNS」和「本地DNS→上游」的查询模式混为一谈——前者递归、后者迭代。
六、常见误区与追问
| 考点 | 正确口径 |
|---|---|
| 浏览器/系统缓存 | 先查本机缓存和 hosts |
| 递归解析器 | 代客户端完成多级查询 |
| 权威 DNS | 最终回答某个域名记录 |
browser cache
-> OS cache / hosts
-> recursive resolver
-> root -> TLD -> authoritative
-> cache result by TTL
-> return IP
面试讲 DNS 解析,要区分“谁替我一路问到底”和“谁只告诉我下一站”。
- 误区:浏览器每次都从根 DNS 开始查。 浏览器、系统、递归解析器都会缓存,命中缓存时不会走完整链路。
- 误区:根 DNS 保存所有域名 IP。 根服务器主要告诉你顶级域服务器在哪里,不保存所有业务域名记录。
- 误区:DNS 解析只发生在输入 URL 时。 页面中的子资源、接口域名、重定向目标都可能触发新的解析。
- 追问:递归查询和迭代查询在流程里怎么体现? 客户端通常递归问本地解析器,本地解析器再迭代询问 root、TLD、权威 DNS。
- 追问:为什么第一次访问慢,第二次快? 第一次可能要完整递归解析,第二次常命中缓存,省掉多次网络往返。
- 追问:hosts 文件在哪个阶段生效? 系统解析阶段会查 hosts,命中后可绕过后续 DNS 查询。
七、加强记忆
DNS 解析 = 逐级查缓存(浏览器 → 系统/hosts → 本地 DNS)+ 分层查询(根 → TLD → 权威)。域名是分级的,查询沿层级从根往下被指引到权威服务器拿 IP,再逐级缓存返回。你对本地 DNS 是递归(全包),本地 DNS 对上游是迭代(一步步问);多级缓存让多数查询根本到不了根,hosts 文件优先级最高。