DNS自述:我是如何为域名找到家的
对于互联网一代的我们,一出生就学会使用电脑。当我们对着浏览器地址栏输入www.baidu.com
的时候,百度的首页就出现在面前。但你可曾想过,为什么我们输入www.baidu.com
就可以弹出百度首页?在这弹指一挥间,到底发生了什么?今天就让我带你来揭开这背后发生的一切。
当我们开始之前,我们需要明白:虽然我们每次访问网页,都是使用域名的方式(例如:www.baidu.com)。但对于计算机来说,它最终访问的是域名对应的IP(例如:10.102.201.253)。所以今天我们要讲的这一切,其实就为了说清楚一件事情:DNS是如何为域名找到对应的 IP 地址的。
浏览器DNS缓存
当我们在浏览器地址栏输入域名后,浏览器首先会去其本身的 DNS 缓存中查找是否有对应域名的记录。如果有,那么直接访问对应的服务器。
不同浏览器会设置不同的 DNS 缓存时间,一般来说是 2-30 分钟之间。如果当你修改了系统 DNS 缓存后,发现访问还是没生效,你可以尝试清除下浏览器的 DNS 缓存。
系统DNS缓存
当浏览器在其自身的缓存中找不到对应域名的记录时,其将会去系统的 DNS 缓存中寻找记录。在 Windows 系统中,DNS 缓存信息存储在 C:/windows/system32/drivers/etc/hosts
中。而在 Mac OSX 系统中,DNS 缓存信息存储在 /etc/hosts
文件中。
但无论在哪个系统,该文件的格式都是域名的 IP 地址的映射。每一行是一个映射,前面是域名对应的 IP 地址,后面是对应的域名。
127.0.0.1 www.baidu.com
192.168.1.1 www.google.com
如上面的范例所示,其设置了当我们访问 www.baidu.com
时,我们直接访问 127.0.0.1
这台机器。而当我们访问 www.google.com
时,我们直接访问 192.168.1.1
这台机器。
所以很多时候,当我们在本地调试时我们可以设置任意的域名,只要该域名对应的 IP 存在对应的服务即可。例如像我这样喜爱写文章的程序员,我可以写这样设置一个域名的映射:
127.0.0.1 top-writer.google.com
当你的机子上访问 top-writer.google.com
的时候,请求自然就会转发到本机上,即使你并不是这个域名的所有者。
本地DNS服务器
如果在系统 DNS 也找不到域名的记录,那么浏览器就会去本地的 DNS 服务器(LDNS)上寻找该域名的记录。在这里的 LDNS 一般是指本机所设置的 DNS 服务器地址。例如在我的电脑上,其对应的 DNS 地址为:10.xxx.xxx.253。那么浏览器就会去这个 DNS 服务器上寻找域名对应的记录。
如果在 LDNS 服务器上找到了记录,那么就直接返回就可以。但如果还是没找到记录,那么就得进一步深入查找了。
根DNS服务器
当 LDNS 服务器还是招不到域名对应的记录时,那么其就会去根 DNS 服务器去寻找域名对应的记录。根 DNS 服务器全球只有 13 台,所以在 LDNS 服务器建立的时候,其会写死一个根 DNS 服务器的 IP 地址列表。
但实际上根 DNS 服务器并不存储所有域名的信息,其只存储顶级域名的解析记录。即对于我们访问的域名 www.baidu.com
来说,根 DNS 服务器并不能告诉我们 www.baidu.com
这个域名对应的 IP 是多少,它只能告诉我们 .com
这个顶级域名应该找哪个 DNS 服务器解析,然后把对应顶级 DNS 服务器的 IP 地址告诉我们。
顶级DNS服务器
我们访问域名 www.baidu.com
后,根 DNS 服务器告诉我们可以找对应的 .com
顶级 DNS 服务器解析。但实际上顶级 DNS 服务器只能解析二级域名的地址,即它只能告诉你:baidu.com
这个域名应该找哪台 DNS 服务器去解析。
这里我们从顶级 DNS 服务器解析 baidu.com
这个域名得到的 DNS 服务器,其实就是你买域名时用于管理解析的服务器。而且也是你设置域名 NS 记录时,设置的 DNS 服务器的地址。
注:关于什么是 NS 记录,可以在公众号后台回复「域名解析类型」,查看我写的另一篇文章。
域名DNS服务器
上一步我们知道 baidu.com
这个顶级域名应该找哪台 DNS 服务器去解析,其实这台 DNS 服务器就是我们购买域名时设置的用于解析的 DNS 服务器。在这台 DNS 服务器上,我们通过设置一条 A 记录(A 记录就是域名到 IP 地址的映射)就可以让某个域名与 IP 联系起来。
当浏览器去请求 baidu.com
对应的 DNS 服务器时,其会尝试寻找解析类型为 A ,并且主机名为 www
的解析记录。如果找到了,那么就返回对应的 IP 地址。否则就报告 DNS 解析错误,其不会再去其他 DNS 服务器上寻找了。
总结
看到这里,相信大家都清楚了 DNS 寻址的整个流程了。总的来说,DNS 寻址的顺序为:
- 浏览器 DNS 缓存
- 系统 DNS 缓存
- 本地 DNS 服务器
- 根 DNS 服务器
- 顶级 DNS 服务器
- 域名 DNS 服务器
如果到最后还是找不到解析记录,那么就直接报域名解析错误。在这个过程中,我们还可以学到两个重要的知识点,即:
第一,域名 DNS 服务器就是 NS 记录设置的地址。 我们在域名服务商可以设置 NS 记录,将域名托管给另外一台 DNS 服务器进行解析,这个时候顶级 DNS 服务器注册的域名 DNS 服务器,就是我们 NS 记录配置的值。
上图我为 doc.csyimg.com 子域名设置了一条 NS 解析记录。那么当我访问 doc.csyimg.com 的时候,当解析到顶级 DNS 服务器时,顶级 DNS 服务器应该是返回 csyimg.com 对应的域名 DNS 服务器地址。接着浏览器访问 csyimg.com 对应的域名 DNS 服务器时,发现是要访问 doc.csyimg.com 域名,因为设置了 NS 记录,于是告诉它去 ns.baidu.com DNS 服务器上去寻找对应的解析记录。
注:这里说的找 ns.baidu.com 解析,其实应该是该域名对应的 IP,这里为了表述方便,没有做过多解释。
第二,域名最终得到的 IP 地址,是通过域名的 A 解析类型。 通过上面的解释,你会发现无论怎样设置,最终都会有一台 DNS 服务器去解析该域名。而在该 DNS 服务器上,必然存在一条解析类型为 A 的解析记录。如下图所示,我设置的是一条针对 hello.csyimg.com 域名的 A 记录,其指向了 192.168.1.1 这个 IP。如果最终找不到 A 记录,那浏览器就会报 DNS 解析错误。
第三,域名是由:主机名.二级域名.顶级域名.根域名组成的。 例如:www.baidu.com 中,www
就是主机名,.baidu
就是二级域名,.com
就是顶级域名。而在 .com
后面省略的 .
就是根域名。
通过这两个知识点,你会发现域名的解析类型与 DNS 的解析原理息息相关的。如果你感兴趣可以在公众号后台回复「域名解析类型」,查看我写的另一篇文章。