当一个用户在浏览器输入 http://www.lakey.com 时,DNS 解析将会有近 10 个步骤,这个过程大致描述如下。
当用户在浏览器输入域名并按下回车之后,第 1 步,浏览器会检查缓存中有没有这个域名对应的解析过的 IP 地址,如果缓存中有,这个解析过程就将结束。浏览器缓存域名也是有限制的,不仅浏览器缓存大小有限制,而且缓存的时间也有限制,通常情况下为几分钟到几个小时不等,域名被缓存的时间限制可以通过 TTL 属性来设置。这个时间太长和太短都不太好,如果缓存时间太长,一旦域名解析到 IP 有变化,会导致被客户端缓存的域名无法解析到变化后的 IP 地址,以致该域名不能正常解析,这段时间内可能会有一部分用户无法访问网站。如果时间设置的太短,会导致用户每次访问网站都要重新解析一次域名。
第2步,如果用户浏览器缓存中没有,浏览器会直接查找操作系统中是否有这个域名对应的解析结果。其实操作系统也会有一个域名解析的过程,在 Windows 中可以通过 C:\Windows\Systeme32\drivers\hosts 文件来设置,你可以将任何域名解析到任何能够访问的 IP 地址。如果你在这里指定了一个域名对应的 IP 地址,那么浏览器会首先使用这个 IP 地址。;例如,我们在测试时可以将一个域名解析到一台测试服务器上,这样不用修改任何代码就能测试到单独服务器上的业务逻辑是否正确。正是因为这种 DNS 解析的规程,所以黑客就有可能通过修改你的域名解析来把特定的域名解析到它指定的 IP 地址上,导致这些域名被劫持。
这导致在早期的Windows版本中出现过很严重的问题,而且对于一般没有太多计算机知识的用户来说,出现问题后很难发现,即使发现也很难自己解决,所以 Windows 7 中将 hosts 文件设置成了只读的,防止这个文件被轻易修改
在Linux中这个配置文件是 /etc/hosts,修改这个文件可以达到同样的目的,当解析到这个配置文件中的某个域名时,操作系统会在缓存中缓存这个解析结果,缓存的时间同样受这个域名的失效时间和缓存的空间大小限制。
前面这两个步骤都是在本地完成的,所以在图 1-10 中没有表示出来。到这里还没有涉及到真正的域名解析服务器,如果在本机中仍然无法完成域名的解析,就会真正请求域名服务器来解析这个域名了。
图 1-10
第3步,如何知道域名服务器呢?在我们的网络配置中都会有“DNS 服务器”这一项,这个地址就是用于解决前面所说的如果两个过程解析时要怎么办,操作系统会把这个域名发送给这里设置的 LDNS,也就是本地区的域名服务器。这个 DNS 通常都提供给你一个本地互联网接入的一个 DNS 解析服务,例如你是在学校接入互联网,那么你的 DNS 服务器肯定就是你的学校,如果你是在一个小区接入互联网的,那这个 DNS 就是提供给你接入互联网的应用服务商,即电信或者联通,也就是通常所说的SPA,那么这个 DNS 通常也会在你所在城市的某个角落,通常不会很远。在 Windows 下可以通过 ipconfig 查询这个地址,在 Linux 下可以通过如下方式查询配置的 DNS Server。
这个专门的域名解析服务器性能都会很好,它们一般都会缓存域名解析结果,当天缓存时间是受域名的失效时间控制的,一般缓存空间不是影响域名失效的主要因素。大约80%的域名解析都到这里就已经完成了,所以 LDNS 主要承担了域名的解析工作。
第4步,如果 LDNS 仍然没有命中,就直接到 Root Server 域名服务器请求解析。
第5步,跟域名服务器返回给本地服务器一个所查询的主域名服务器(gTLD Server)地址。gTLD 是国际顶级域名服务器, 如 .com、.cn、.org 等,全球只有13台左右。
第6步,本地域名服务器(Local DNS Server)再向一步返回的 gTLD 服务器发送请求。
第7步,请求接受的 gTLD 服务器查找并返回次域名对应的 Name Server 域名服务的地址,这个 Name Server 通常就是你注册的域名服务器,例如你在某个域名服务器提供商申请的域名,那么这个域名解析任务就由这个域名提供商的服务器来完成。
第8步,Name Server 域名服务器会查询存储的域名和IP的映射关系表,在正常情况下都根据域名得到目标 IP 记录,连同一个 TTL 值返回给 DNS Server 域名服务器。
第9步,返回该域名对应的 IP 和 TTL 值, Local DNS Server 会缓存这个域名和 IP 的对应关系,缓存的时间由 TTL 值控制。
第10步,把解析结果返回给用户,用户根据 TTL 值缓存在本地缓存中,域名解析过程结束。
在实际解析过程中,可能还不止这10个步骤,如 Name Server 也可能有多级,或者一个GTM来负载均衡控制,这都有可能会影响域名解析过程。