DNS 的解析过程是怎样的?
DNS(Domain Name System,域名系统)的解析过程是将人类易读的域名(如 www.google.com)转换为机器易读的 IP 地址(如 142.250.190.46)的过程。
可以将这个过程想象成在图书馆找一本书,或者层层向上级部门询问的过程。
以下是 DNS 解析的详细步骤(假设你第一次访问该网站,没有任何缓存):
核心角色
在介绍流程前,先认识一下几个关键角色:
- 客户端(Client):你的电脑或手机。
- 本地 DNS 服务器(Local DNS / Recursive Resolver):通常由你的网络运营商(ISP)提供,或者你手动设置的(如 Google 的 8.8.8.8)。它是帮你跑腿的“苦力”。
- 根域名服务器(Root Nameserver):全球互联网的最高层级,管理顶级域(如 .com, .cn)。
- 顶级域名服务器(TLD Nameserver):管理特定后缀的服务器(如管理所有 .com 的服务器)。
- 权威域名服务器(Authoritative Nameserver):域名持有者配置的服务器,它知道最终的 IP 地址。
详细解析流程(8个步骤)
当你在浏览器输入 www.example.com 并回车时:
第一阶段:检查缓存(就在你身边找)
解析速度最快的是直接从缓存读取,不需要去互联网上问。
- 浏览器缓存:浏览器会先检查自己有没有访问过这个网站的记录。如果有且没过期,直接使用。
- 操作系统缓存(OS Cache / hosts 文件):如果浏览器没找到,会去问操作系统。操作系统会检查本地的
hosts文件和 DNS 缓存。 - 路由器缓存:如果电脑也没找到,请求会发给路由器,路由器通常也有 DNS 缓存。
第二阶段:递归查询(委托给本地 DNS 服务器)
如果本地都没找到,请求就会发给本地 DNS 服务器(LDNS)。
- ISP DNS 缓存:本地 DNS 服务器收到请求后,先查自己的缓存。如果有,直接返回给你。如果没有,它就要开始“跑腿”了。
第三阶段:迭代查询(全球接力问路)
本地 DNS 服务器代表你去互联网上层层询问。
询问根域名服务器(Root Server):
- 本地 DNS 问根服务器:“你知道
www.example.com的 IP 是多少吗?” - 根服务器回答:“我不知道具体 IP,但它是
.com结尾的。我给你 .com 顶级域名服务器 的地址,你去问它。”
- 本地 DNS 问根服务器:“你知道
询问顶级域名服务器(TLD Server):
- 本地 DNS 根据刚才得到的地址,去问
.com服务器:“你知道www.example.com的 IP 吗?” .com服务器回答:“我不知道具体 IP,但我知道example.com这个域名是在哪家注册的。我给你它的 权威域名服务器 的地址,你去问它。”
- 本地 DNS 根据刚才得到的地址,去问
询问权威域名服务器(Authoritative Server):
- 本地 DNS 去问权威服务器:“你是
example.com的老大,你应该知道www.example.com的 IP 吧?” - 权威服务器回答:“是的,我知道。它的 IP 地址是
93.184.216.34。”
- 本地 DNS 去问权威服务器:“你是
第四阶段:返回结果与缓存
- 保存并返回:
- 本地 DNS 服务器拿到了 IP,它会做两件事:
- 缓存这个结果(根据 TTL 时间),下次有人问同样的域名,它就不用再跑一遍了。
- 把 IP 返回给你的操作系统。
- 操作系统也缓存一份,然后把 IP 给浏览器。
- 浏览器拿到 IP,终于可以向目标服务器发起 TCP 连接(三次握手)并请求网页了。
- 本地 DNS 服务器拿到了 IP,它会做两件事:
两个重要概念
为了理解得更透彻,需要区分两种查询方式:
递归查询 (Recursive Query):
- 发生在你和本地 DNS 服务器之间。
- 意思就是:“我把任务交给你了,你必须给我一个最终结果(要么是 IP,要么是报错),别让我自己再去跑。”
迭代查询 (Iterative Query):
- 发生在本地 DNS 服务器和根/TLD/权威服务器之间。
- 意思就是:“我告诉你下一步去哪里找,但我不会帮你去问,你自己去问下一级。”
总结图解
plaintext
用户
|
(1) 输入 www.example.com
|
v
[ 浏览器/OS 缓存 ] --(2) 有?--> 结束
| (没有)
v
[ 本地 DNS 服务器 ] --(3) 有缓存?--> 结束
| (没有,开始跑腿)
|
+---(4) 问根服务器 (.) ---------> [ 根域名服务器 ]
| |
| <----(5) 回复: 去找 .com 服务器 -----+
|
+---(6) 问 TLD 服务器 (.com) ---> [ .com 顶级域名服务器 ]
| |
| <----(7) 回复: 去找权威服务器 -------+
|
+---(8) 问权威服务器 (example.com) -> [ 权威域名服务器 ]
|
<----(9) 回复: IP 是 93.184.216.34 --+
|
v
[ 本地 DNS 服务器 ] (存入缓存)
|
v
(10) 返回 IP 给用户