你在地址栏敲下 shop.example,按下回车,结果页面还空着。这时浏览器其实还不知道,服务器在哪。
这一步通常只要零点几秒。下面把它放慢,跟着这一次访问从头走一遍:浏览器怎么按域名查到服务器的 IP 地址,查到以后页面才开始加载。
跟着一次查询走一遍
1. 先翻本地记录#▶ 从这里看
IP 地址是联网时用来找到对方的数字地址,浏览器要连上服务器,得先有它。人记的是 shop.example 这样的域名,DNS 负责按域名查出对应的 IP 地址。34
第一站在本地。浏览器和操作系统都会把最近查过的结果暂存一段时间,这就是本地缓存:浏览器缓存、系统缓存里有还能用的记录,就直接拿来用,不用往外问。
这一次,两处都没有 shop.example 的记录,只能往外问。
2. 交给递归解析器#▶ 从这里看
往外问,问的是递归解析器:替你跑腿去查的服务。它通常由网络运营商提供,也可以在系统里改成别的公共服务。系统只问它一句「shop.example 的地址是多少」,剩下的路由它去跑。56
递归解析器自己也有缓存,有还能用的记录就直接回答。这一次它手里也没有,就从最顶层开始问。
3. 一层层往下问#▶ 从这里看
假设 shop.example 是个普通网站。域名是分层的,最顶层叫根。根服务器有 13 组名字,背后有很多台机器,分布在世界各地。7
根不给最终地址,只告诉解析器下一层该问谁。于是解析器转去问 .example 顶级域,也就是域名最右边那一段。顶级域同样不给地址,只指向管这个网站的服务器。5
4. 答案回来了#▶ 从这里看
权威服务器是负责发布这个域名记录的服务器。前面几层只给线索,到了这里,才拿到真正的地址:shop.example 对应 203.0.113.10。68
答案里还带着 TTL,就是这条记录允许被缓存多久,单位是秒。到期就重新查,没到期就直接用。8
浏览器自己的缓存按自己的规则保存,about:networking 页面里看到的到期时间,不一定等于 DNS 回答里的 TTL。
解析器把地址交回系统,再交给浏览器。浏览器终于知道,该连哪台服务器了。
5. 页面开始加载#▶ 从这里看
浏览器照着这个地址连上服务器,请求网页,空白页上开始出现标题和商品。在 Firefox 开发者工具的「网络」面板里,可以看到这个请求连的远程地址。9
整条路回顾一下:本地没有,就交给解析器,从根问到顶级域,最后由权威服务器给出地址。
想一想
马上再打开一次这个网站,还会从根开始查吗?评论区说说理由。
页面打开了,网站又怎么认出你?下期讲 Cookie 和会话。关注我,觉得有用就点赞、收藏
参考资料
Footnotes
-
RFC 2606:Reserved Top Level DNS Names,IETF,1999-06,.example 留作示例用(§2)。 ↩ ↩2
-
RFC 5737:IPv4 Address Blocks Reserved for Documentation,IETF,2010-01,203.0.113.0/24 专供文档示例(§3)。 ↩
-
MDN:IP Address,IP 地址是联网设备的数字地址。 ↩
-
RFC 1034:Domain Names - Concepts and Facilities,IETF,1987-11,域名分层、解析器与逐级引用(§4.3.2、§5.3.3)。 ↩ ↩2
-
RFC 9499:DNS Terminology,IETF,2024-03,递归解析器、权威服务器等术语(§6–7)。 ↩ ↩2
-
IANA:Root Servers,13 组根服务器名称及其运营机构。 ↩
-
RFC 1035:Domain Names - Implementation and Specification,IETF,1987-11,资源记录格式、A 记录与 TTL(§3.2.1、§3.4.1)。 ↩ ↩2
-
Firefox 开发者工具:Network Monitor,网络面板中的请求与远程地址。 ↩
幕后
这部片子完全由代码生成。
系列 · 请求链路第 3/7 期