对于互联网一代的我们,一出生就学会使用电脑。当我们对着浏览器地址栏输入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服务器