上一篇文章《浅析Web请求过程》讲述的是如何发起
HTTP
请求,对于请求发起过程中很重要的一个步骤——DNS
解析过程的描述是一带而过,本篇文章将跟着DNS
解析过程来分析域名是如何解析的。
下图是DNS
域名解析的一个示例图,它涵盖了基本解析步骤和原理。
下面DNS
解析步骤进行讲解,后面将采用命令行的形式来跟踪DNS
解析过程。当用户在地址栏键入www.baidu.com
并敲下回车键之后,域名解析就开始了。
用户通过浏览器浏览过某网站之后,浏览器就会自动缓存该网站域名对应的IP
地址,当用户再次访问的时候,浏览器就会从缓存中查找该域名对应的IP地址,因为缓存不仅是有大小限制,而且还有时间限制(域名被缓存的时间通过TTL
属性来设置),所以存在域名对应的IP
找不到的情况。当浏览器从缓存中找到了该网站域名对应的IP
地址,那么整个DNS
解析过程结束,如果没有找到,将进行下一步骤。对于IP
的缓存时间问题,不宜设置太长的缓存时间,时间太长,如果域名对应的IP
发生变化,那么用户将在一段时间内无法正常访问到网站,如果太短,那么又造成频繁解析域名。
如果第一个步骤没有完成对域名的解析过程,那么浏览器会去系统缓存中查找系统是否缓存过这个域名对应的IP
地址,也可以理解为系统自己也具备域名解析的基本能力。在Windows
系统中,可以通过设置hosts
文件来将域名手动绑定到某IP
上,hosts
文件位置在C:\Windows\System32\drivers\etc\hosts
。对于普通用户,并不推荐自己手动绑定域名和IP
,对于开发者来说,通过绑定域名和IP
,可以轻松切换环境,可以从测试环境切换到开发环境,方便开发和测试。在XP
系统中,黑客常常修改他的电脑的hosts
文件,将用户常常访问的域名绑定到他指定的IP
上,从而实现了本地DNS
解析,导致这些域名被劫持。在Linux
或者Mac
系统中,hosts
文件在/etc/hosts
,修改该文件也可以实现同样的目的。
前两步都是在本机上完成的,所以没有在上面示例图上展示出来,从第三步开始,才正在地向远程DNS服务器发起解析域名的请求。
如果在本机上无法完成域名的解析,那么系统只能请求本地域名解析服务系统进行解析,本地域名系统LDNS
一般都是本地区的域名服务器,比如你连接的校园网,那么域名解析系统就在你的校园机房里,如果你连接的是电信、移动或者联通的网络,那么本地域名解析服务器就在本地区,由各自的运营商来提供服务。对于本地DNS
服务器地址,Windows
系统使用命令ipconfig
就可以查看,在Linux
和Mac
系统下,直接使用命令cat /etc/resolv.conf
来查看LDNS
服务地址。LDNS
一般都缓存了大部分的域名解析的结果,当然缓存时间也受域名失效时间控制,大部分的解析工作到这里就差不多已经结束了,LDNS
负责了大部分的解析工作。
本地DNS
域名解析器还没有完成解析的话,那么本地域名解析服务器将向根域名服务器发起解析请求。
本地DNS
域名解析向根域名服务器发起解析请求,根域名服务器返回的是所查域的通用顶级域(Generic top-level domain,gTLD
)地址,常见的通用顶级域有.com
、.cn
、.org
、.edu
等。
本地域名解析服务器向gTLD服务器发起请求。
gTLD
服务器接收本地域名服务器发起的请求,并根据需要解析的域名,找到该域名对应的Name Server
域名服务器,通常情况下,这个Name Server
服务器就是你注册的域名服务器,那么你注册的域名的服务商的服务器将承担起域名解析的任务。
Name Server
服务器查找域名对应的IP
地址,将IP
地址连同TTL
值返回给本地域名服务器。
本地域名服务器缓存解析后的结果,缓存时间由TTL
时间来控制。
解析结果将直接返回给用户,用户系统将缓存该IP
地址,缓存时间由TTL
来控制,至此,解析过程结束。
这里对
DNS
解析的步骤进行了一个简单的介绍分析,后面将通过命令行的形式来解析一个域名的具体解析过程。
在正式开始分析解析过程之前,先来介绍几个基本的域名解析方式的概念。域名解析记录主要分为A记录
、MX记录
、CNAME记录
、NS记录
以及TXT记录
。
A记录
:A
代表的是Address
,用来指定域名对应的IP
地址,比如将map.baidu.com
指定到180.97.34.157
,将zhidao.baidu.com
指定到180.149.131.245
,A
记录允许将多个域名解析到一个IP
地址,但不允许将一个域名解析到多个IP地址上。
MX记录
:MX
代表的是Mail Exchage
,就是可以将某个域名下的邮件服务器指向自己的Mail Server
,如baidu.com
域名的A
记录IP
地址是180.97.34.157
,如果将MX
记录设置为180.97.34.154
,即xxx@baidu.com
的邮件路由,那么DNS
会将邮件发送到180.97.34.154
所在的服务器,而正常web
请求仍然会解析到A
记录的IP地址180.97.34.157
。
CNAME记录
:CNAME
指的就是Canonical Name
,也就是别名解析,可以将指定的域名解析到其他域名上,而其他域名就是指定域名的别名,整个解析过程称为别名解析。比如将baidu.com
解析到itlemon.cn
,将csdn.net
解析到itlemon.cn
,那么itlemon.cn
就是baidu.com
和CSDN.net
的别名。
NS记录
:就是为某个域名指定了特定的DNS
服务器去解析。
TXT记录
:为某个主机名或者域名设置特定的说明,比如为itlemon.cn
设置的的TXT记录为“Lemon的技术笔记”
,这个TXT
记录为itlemon.cn
的说明。
上面概念中的
IP
地址都是假定的,帮助理解。下面将通过解析域名baidu.com
为例,进一步说明域名解析流程。
直接查看域名结果,可以通过命令nslookup
加上域名来查看:
上图中Non-authoritative answer
表示解析结果来自非权威服务器,也就是说这个结果来自缓存,并没有完全经历全部的解析过程,从某个缓存中读取的结果,这个结果存在一定的隐患,比如域名对应的IP
地址已经更变。
这只是一个快捷的解析结果,如果需要浏览全部的解析过程,那么可以使用dig
命令来查看解析过程。
分析上图DNS
解析过程,我们可以看出:
第一步:从本地DNS
域名解析服务器获取到13
个根DNS
域名服务器(.)
对应的主机名。
第二步:从13
个根域名服务器中的其中一个(这里是h.root-servers.net
)获取到顶级com.
的服务器IP
(未显示)和名称。
第三步:向com.
域的一台服务器192.43.172.30(i.gtld-servers.net)
请求解析,它返回了baidu.com
域的服务器IP
(未显示)和名称,百度有四台顶级域的服务器。
第四步:向百度的顶级域服务器220.181.37.10(ns3.baidu.com)
请求www.baidu.com
,它发现这个www
有个别名,而不是一台主机,别名是www.a.shifen.com
。
一般情况下,DNS
解析到别名就停止了,返回了具体的IP
地址,如果想看到具体的IP
地址,可以进一步对别名进行解析,解析结果如下:
这时候看到最后的解析结果是180.97.33.107
和180.97.33.108
。在解析别名的过程中,可以发现shifen.com
和baidu.com
都是指定了相同的域名解析服务器。以上是一个域名的解析过程,最后的解析结果和一开始的使用nslookup
的结果一致。