深入 Java Web 技术内幕(二)浅析 DNS 域名解析过程
>上一篇文章《浅析Web请求过程》讲述的是如何发起HTTP
请求,对于请求发起过程中很重要的一个步骤——DNS
解析过程的描述是一带而过,本篇文章将跟着DNS
解析过程来分析域名是如何解析的。
一、DNS域名解析步骤
下图是DNS
域名解析的一个示例图,它涵盖了基本解析步骤和原理。
下面DNS
解析步骤进行讲解,后面将采用命令行的形式来跟踪DNS
解析过程。当用户在地址栏键入www.baidu.com
并敲下回车键之后,域名解析就开始了。
第一步:检查浏览器缓存中是否缓存过该域名对应的IP地址
用户通过浏览器浏览过某网站之后,浏览器就会自动缓存该网站域名对应的IP
地址,当用户再次访问的时候,浏览器就会从缓存中查找该域名对应的IP地址,因为缓存不仅是有大小限制,而且还有时间限制(域名被缓存的时间通过TTL
属性来设置),所以存在域名对应的IP
找不到的情况。当浏览器从缓存中找到了该网站域名对应的IP
地址,那么整个DNS
解析过程结束,如果没有找到,将进行下一步骤。对于IP
的缓存时间问题,不宜设置太长的缓存时间,时间太长,如果域名对应的IP
发生变化,那么用户将在一段时间内无法正常访问到网站,如果太短,那么又造成频繁解析域名。
第二步:如果在浏览器缓存中没有找到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
域名解析器还没有完成解析的话,那么本地域名解析服务器将向根域名服务器发起解析请求。
第五步:根域名服务器返回gTLD域名解析服务器地址
本地DNS
域名解析向根域名服务器发起解析请求,根域名服务器返回的是所查域的通用顶级域(Generic top-level domain,gTLD
)地址,常见的通用顶级域有.com
、.cn
、.org
、.edu
等。
第六步:向gTLD服务器发起解析请求
本地域名解析服务器向gTLD服务器发起请求。
第七步:gTLD服务器接收请求并返回Name Server服务器
gTLD
服务器接收本地域名服务器发起的请求,并根据需要解析的域名,找到该域名对应的Name Server
域名服务器,通常情况下,这个Name Server
服务器就是你注册的域名服务器,那么你注册的域名的服务商的服务器将承担起域名解析的任务。
第八步:Name Server服务器返回IP地址给本地服务器
Name Server
服务器查找域名对应的IP
地址,将IP
地址连同TTL
值返回给本地域名服务器。
第九步:本地域名服务器缓存解析结果
本地域名服务器缓存解析后的结果,缓存时间由TTL
时间来控制。
第十步:返回解析结果给用户
解析结果将直接返回给用户,用户系统将缓存该IP
地址,缓存时间由TTL
来控制,至此,解析过程结束。
>这里对DNS
解析的步骤进行了一个简单的介绍分析,后面将通过命令行的形式来解析一个域名的具体解析过程。
二、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
的结果一致。
深入分析Java Web技术内幕系列读书笔记文章列表:
>深入分析Java Web技术内幕读书笔记(一)浅析Web请求过程
>深入分析Java Web技术内幕读书笔记(二)浅析DNS域名解析过程
更多干货分享,欢迎关注我的微信公众号:爪哇论剑(微信号:itlemon)
版权声明: 本文为 InfoQ 作者【独钓寒江雪】的原创文章。
原文链接:【http://xie.infoq.cn/article/a5fb0cfc11cd5cc71ef5ec1c7】。文章转载请联系作者。
评论