1、DNS 解析过程
当客户端对域名发起访问时,会将解析请求发送给递归解析服务器,递归服务器会代替客户端进行全球递归查询。
首先递归服务器会请求根域名服务器,根域名服务器根据域名后缀,告知对应的顶级域名服务器;递归服务器再向顶级服务器发起请求,顶级域名服务器告知对应的权威服务器;递归服务器向权威服务器发起请求,权威服务器告知解析结果;递归服务器将结果告知客户端,客户端完成访问。
2、DNS 缓存
以上是 DNS 解析的标准流程,但是由于各种 DNS 缓存的存在,导致 DNS 解析环节更为复杂。
所谓 DNS 缓存是指 DNS 返回正确的 IP 地址之后,系统会将这个结果临时储存起来,并为缓存设定一个失效时间(TTL 值),在TTL失效前,当再次访问这个网站,系统就会直接从 DNS 缓存中将结果返回,而不必再次委托递归服务器进行全球解析查询,加快了 DNS 解析的流程。
当然TTL值失效后,系统还会自动再次询问DNS服务器以获取最新的解析结果。
3、DNS 缓存分类
(1)浏览器 DNS 缓存:浏览器会根据一定频率缓存 DNS 记录;
(2)本地 DNS 缓存:如果浏览器缓存中找不到解析记录,就会去询问操作系统中的缓存;
(3)本地 HOSTS 文件:HOSTS 是记录域名与 IP 地址一一映射关系的本地文件。
Windows 系统中位于C:\Windows\System32\drivers\etc;
Linux 系统中位于 /etc/hosts
(4)路由器 DNS 缓存:我们常用的路由器也带有自动缓存功能,路由器 DNS 被篡改会造成域名劫持,将访问网址定位到另外一个服务器;
(5)递归服务器缓存:递归服务器在将解析结果告知客户端的同时,将记录缓存下来,当下次请求同一个域名时,直接会将记录返回,而无需再进行全球查询。
4、DNS 解析顺序
DNS 解析顺序是“先查缓存,再递归解析”,查询顺序为:浏览器缓存 --> 系统缓存 --> 路由器缓存--> 递归服务器缓存 --> 递归查询。
我们以 www.example.com 这个域名为例进行查询,具体流程如下:
(1)搜索浏览器自带的 DNS 缓存
当收到访问请求后,浏览器首先会查询浏览器自身的 DNS 缓存,这个缓存时间比较短(chrome://net-internals/#dns 这里可以查询缓存的dns记录),且只能容纳 1000条缓存,如果缓存中有对应条目,返回结果,解析到此结束。
(2)查询操作系统缓存和 hosts 本地文件
如果浏览器缓存中没有找到对应条目(ipconfig /displaydns可以查看),操作系统也会有一个域名解析的过程,浏览器会先搜索操作系统的 DNS 缓存中是否有这个域名解析记录,如果有返回结果,解析结束。
此外,电脑本地文件 HOSTS 中可以设定域名到 IP 地址的指向关系。如果 HOSTS 文件中保存有该域名的记录,浏览器会首先使用这个 IP 地址,并将其结果缓存下来,缓存时间同样受域名失效时间和缓存空间大小决定。
(3)查询路由器缓存
如果浏览器和操作系统中没有域名解析记录,就会查询路由器中的 DNS 缓存,如果路由器 DNS 缓存中有解析条目,直接返回结果,解析结束。
(4)递归解析服务器缓存
如果本机和路由器 DNS 缓存中没有该域名的解析记录,浏览器就会向递归服务器发起请求,如果递归服务器缓存有该域名解析条目,返回结果,解析结束。
(5)查询根域名服务器
如果递归服务器缓存中没有结果,就会委托递归服务器发起全球查询,首先递归服务器会向根域名服务器发起解析请求。根域名服务器告知 .com 顶级域名服务器地址。
(6)查询顶级域名服务器
递归服务器向 .com 顶级域名服务器发起 DNS 请求,.com 顶级服务器告知 example.com 所属权威域名服务器地址。
(7)查询权威域名服务器
递归服务器向 example.com 的权威域名服务器地址发起请求,权威服务器告知 www.example.com 所对应的IP地址。
(8)返回解析结果
得到 www.example.com 的 IP 地址后,递归服务器将结果告知客户端,客户端对该 IP 地址发起访问。整个 DNS 解析流程到此结束。
(SAW:Game Over!)