在浏览器地址栏输入 www.example.com 按下回车,页面加载出来,背后会快速完成一套几乎无法感知的操作,也就是DNS解析。简单来说,它负责把人类能看懂的域名,翻译成服务器识别的IP地址。整套流程拆解下来大概十多个步骤,全部在毫秒级别完成。
解析最先发生在本地电脑。浏览器会先查询自身缓存,看看之前访问时有没有保存这个域名对应的IP。短时间内访问过的话,缓存记录还在,可以直接调用,不用向外发起查询,这一步叫浏览器缓存查询。缓存没有记录,浏览器就会请求操作系统完成域名查询。
操作系统同样维护DNS缓存,Windows和Mac系统都会保存近期解析成功的域名和对应的IP地址。还有更早的hosts文件机制,纯文本文件,可以手动配置域名绑定指定IP。一旦hosts里写好了example.com的映射,系统会直接返回这个IP,跳过后面全部解析流程。系统缓存和hosts文件都找不到对应记录,操作系统才向外发起请求。

查询请求会发给本地DNS服务器,也叫递归解析器。这个地址一般由路由器自动获取,或是运营商分配,也可以手动设置公共DNS,例如8.8.8.8、114.114.114.114。电脑向本地DNS发送请求,询问www.example.com对应的IP地址,等待返回结果。
本地DNS收到请求之后,优先检索自身缓存。如果之前处理过相同域名查询,记录还没过期,可以直接返回保存好的IP。多数场景下缓存没有数据,本地DNS就会启动迭代查询,逐级向上查找。
第一步访问根域名服务器。全球一共13组根服务器,分布在世界各地,它们的IP地址固定,写进所有递归解析器配置文件。根服务器不会直接给出www.example.com的IP,只会告知.com顶级域名服务器地址,指引本地DNS去查询。拿到根服务器返回信息,本地DNS继续访问.com顶级域名服务器,询问example.com对应的权威服务器地址。所有.com后缀域名都由顶级域名服务器管理,它记录example.com已经注册,并且保存对应的权威域名服务器列表,把地址回传给本地DNS。
本地DNS接着访问example.com的权威域名服务器,这台服务器才是管理该域名所有解析记录的源头。本地DNS请求查询www.example.com的A记录。权威服务器检索配置,确认www主机指向IP,例如93.184.216.34,把IP返回给本地DNS。
本地DNS拿到IP之后会做两件事。一是存入自身缓存,后续收到相同查询就不用重复完整流程;二是把IP结果回传给操作系统,操作系统再交给浏览器。浏览器拿到IP地址,发起HTTP请求,开始拉取网页内容渲染页面。
整个流程里有个区分要点。本地DNS会代为完成根服务器、顶级域服务器、权威服务器的全部查询,不会直接回复客户端无法查询。电脑向本地DNS发起的属于递归查询,含义是让DNS服务器一次性拿到最终结果。本地DNS依次询问各级服务器,属于迭代查询,每次只获取下一级服务器地址,继续往下查询。
域名解析不只有A记录。A记录用来把域名映射到IPv4地址;AAAA记录对应IPv6地址;CNAME记录实现域名跳转至另一个域名;MX记录用于邮件服务。所有这类解析记录都保存在权威域名服务器,本地DNS查询时,会指定要读取的记录类型。
解析结果会在多处留下缓存,缓存有效时长由权威服务器配置的TTL值决定,单位是秒。TTL设为3600,代表一小时。在这个有效期内,所有缓存该记录的服务器,不会重新访问权威服务器,直接读取缓存IP。这样能够降低查询压力,但带来一个问题,如果网站更换服务器IP,要等到TTL过期,全网缓存才会更新。更换服务器之后解析迟迟不生效,大多是TTL还没到期造成的。
整套流程步骤看着多,正常网络环境下耗时一般在几十毫秒以内。电脑、系统、本地DNS、根服务器、顶级域、权威服务器,一轮查询完成,快到几乎感知不到。网页加载缓慢,不一定是网站服务器性能问题,DNS解析环节阻塞也是常见原因。更换响应更快的公共DNS,效果有时候比升级宽带更明显。