【网络协议】DNS域名解析的详细过程

·  阅读 166

1 问题来源

今天同事因为连接不上网络,疫情期间,公司IT又不方便联系,所以请我帮看看原因。问题排查倒是挺简单,用同事电脑在命令行出窗口输入ping 220.181.38.149(该IP访问的是百度首页网址),可以收到正常响应。但是ping www.baidu.com的时候就返回timeout,明明是同一个网址,ping的结果却大不相同。并且在地址栏输入220.181.38.149可以正常访问百度首页,但是www.baidu.com却提示无法连接。到这里,问题已经很显然了,IP访问毫无问题,域名一敲就凉凉,这显然是域名到IP这一步出了问题,也就是DNS域名解析出错。
在这个排查的过程,脑海中回想了用户通过域名请求到拿到请求地址的内容的整个流程,发现了对于DNS域名解析尚有模糊的地方,于是决定写下博客以作记录。

2 DNS基本概念

DNS是Domain Name System的缩写,就是域名系统。DNS协议则是用来实现域名和IP地址的相互转换IP地址是面向主机的,而域名则是面向用户的
实际上在电脑操作系统中的hosts文件就有记录域名和IP的一一对应关系。在早期的域名解析中,如果有一个新的计算机想接入网络,或者某个计算IP变更都需要到信息中心申请变更hosts文件。其他计算机也需要定期更新,才能上网。
但是这样太麻烦了,所以就出现了DNS系统。

2.1 域的划分

以www.baidu.com为例,实际上com后面还有“.”,只是习惯问题给省略了,这个“.”就是根域。根域服务器只是具有13个IP地址,但机器数量却不是13台,因为这些IP地址借助了任播的技术,所以我们可以在全球设立这些IP的镜像站点,你访问到的这个IP并不是唯一的那台主机。这里的com就是顶级域名,baidu是二级域名。

2.2 域名服务器的分类

域名是分层结构,域名服务器也是对应的层级结构。如下表所示。
表2-1 域名服务器的分类

名称作用
根域名服务器最高层次的域名服务器,本地域名服务器解析不了的域名就会向其求助
顶级域名服务器负责管理在该顶级域名服务器下注册的二级域名
权限域名服务器负责一个区的域名解析工作
本地域名服务器当一个主机发出DNS查询请求时,这个查询请求首先发给本地域名服务器

3 DNS域名解析全过程

例如,当用户在地址栏请求www.baidu.com时,实际上经历了以下过程:
1、浏览器先检查自身缓存中有没有被解析过的这个域名对应的IP地址,如果有,解析结束。同时域名被缓存的时间也可通过TTL(Time To Live)属性来设置。

2、如果在浏览器缓存中没有命中,浏览器会检查操作系统缓存中有没有对应的已解析过的结果。而操作系统也有一个域名解析的过程。在Windows中可通过C盘里的hosts文件来设置,如果你在这里指定了一个域名对应的ip地址,那浏览器会首先使用这个ip地址。但是这种操作系统级别的域名解析规程也被很多黑客利用,通过修改你的hosts文件里的内容把特定的域名解析到他指定的IP地址上,造成所谓的域名劫持。所以在windows7中将hosts文件设置成了readonly,防止被恶意篡改。

3、如果至此还没有命中域名,才会真正的请求本地域名服务器(LDNS)来解析这个域名,这台服务器一般在你所在的城市,并且这台服务器一般都会缓存域名解析结果,大约80%的域名解析到这里就完成了。

4、 如果LDNS仍然没有命中,就直接跳到**根域名服务器(Root Server)**请求解析。

5、根域名服务器返回给LDNS一个所查询域的顶级域名服务器(gTLD Server,Generic top-level domain Server,如.com .cn .org等)地址。

6、此时LDNS再发送请求给上一步返回的gTLD。

7、接受请求的gTLD查找并返回这个域名对应的Name Server的地址,这个Name Server就是网站注册的域名服务器。

8、 Name Server根据映射关系表找到目标IP,返回给LDNS。

9、LDNS缓存这个域名和对应的IP。

10、LDNS把解析的结果返回给用户,用户根据TTL值缓存到本地系统缓存中,域名解析过程至此结束。

小结

在域名解析过程中涉及到了递归查询和迭代查询;
(1)递归查询:本机向本地域名服务器发出一次查询请求,就静待最终的结果。如果本地域名服务器无法解析,自己会以DNS客户机的身份向其它域名服务器查询,直到得到最终的IP地址告诉本机。
(2)迭代查询:本地域名服务器向根域名服务器查询,根域名服务器告诉它下一步到哪里去查询,然后它再去查,每次它都是以客户机的身份去各个服务器查询。

技术是开源的,知识是共享的。

分类:
后端
标签:
收藏成功!
已添加到「」, 点击更改