DNS

简述:

浏览器中访问一个www.baidu.com,首先会访问浏览器缓存,如未命中则进一步访问操作系统缓存,如未命中则访问hosts文件。如未命中,则客户端想本地DNS服务器发起递归查询(本地DNS会将结果也就是ip直接返回),如本地DNS解析服务器未命中,则由本地DNS解析服务器向根域名服务器、顶级域名服务器、管理方域名服务器等依次进行迭代查询(每有一个未命中则返回下一个域名服务器地址给本地域名服务器,比如local dns server向根域名服务器查询未命中,则根域名服务器返回顶级域名服务器地址给local dns server,然后local dns server向收到的这个地址迭代发起查询)

迭代与递归查询区别:客户端向本地dns服务器发起的是递归查询,客户端拿到的ip是由本地dns服务器直接返回;本地dns服务器向外网查询时是用的迭代查询,即向根域名服务器查询未命中返回给本地dns服务器的是下一个域名服务器的地址而非根域名去访问下一个域名服务器返回结果ip。

这里还有一个权威性的问题:如果客户端向本地dns服务器发起递归查询时,本地dns存在缓存,并将结果返回客户端,则该结果不具权威性(即缓存可能已经失效);反之如果由本地dns服务器解析命中后返回,则具有权威性

域名的级别:

.代表根域名, .com这种是顶级域名,也叫一级域名,baidu.com这种叫二级域名, www.baidu.com这种叫三级域名,依次类推。

注:也有其他叫法的,反正你知道这个意思就可以了。

再介绍一下最常见的两种域名服务器:

权威DNS:负责对请求作出权威的回答。权威DNS中存储着记录,最常见的3种:A记录(记录某域名和其IP的对应),NS记录(记录某域名和负责解析该域的权威DNS),CNAME记录(负责记录某域名及其别名)。权威能直接回答的,就回A记录;需要其他权威DNS回答的,就回NS记录,然后LDNS再去找其他权威DNS问;如果该记录是别名类型的,就回CNAME,LDNS就会再去解析别名。

递归DNS:通常就是LDNS,它接受终端的域名查询请求,负责在网上问一圈后,将答案返回终端。

现在举一个具体的例子:比如终端请求www.baidu.com这个域名的IP。

在没有缓存时,LDNS会从根DNS问起:

1、LDNS问根DNS说:“www.baidu.com的IP是多少啊?”。

2、根DNS说:“我哪有时间管你这么细的问题,你去问com顶级域的DNS吧,我只管到顶级域,喏,这些是com顶级域DNS的名字和IP,你去问它们吧”。(以NS记录回应)

3、LDNS又忙问com的权威DNS,com权威DNS说:“你问的这是三级域名,我不管这么多,你去问baidu.com的权威DNS吧,它的名字是ns.baidu.com,他的IP是XXX(这里可能给出多个权威DNS)”。

4、LDNS继续问baidu.com的权威DNS,这次痛快,因为www.baidu.com正是它管的,它可能直接给出A记录,也可能给出CNAME记录,如果是前者,就直接得到IP,如果是后者,就需要对别名再做查询。

5、最终,LDNS得到www.baidu.com的IP,并将其返回给终端。

美国如果把根域名服务器封了,中国会从网络上消失?

细心的人会问,在第1步中,LDNS问根DNS的时候,他是怎么知道根DNS的IP的?

这13个IP通常是预先配置在LDNS里面的。在LDNS初始化DNS缓存或者缓存失效的时候,LDNS向自己被预先配置的这些IP中的一个,发起对根的查询(也即询问.的NS记录),获得最新的根DNS的信息_(6)_。

对于DNS服务器软件而言,这13个IP,配置在根提示文件(root hints file)中,可能是named.cache或root.ca或root.hints等等之类的文件。

上面就是各种教科书中都会讲到的DNS查询过程,但实际上,没有这么麻烦,因为各个层面都是有缓存的。

实际DNS查询的过程,是这样的:

举个例子,比如用户在浏览器中输入这个域名:123.abc.qq.com.cn

1、浏览器会先看自身有没有对这个域名的缓存,如果有,就直接返回,如果没有,就去问操作系统,操作系统也会去看自己的缓存,如果有,就直接返回,如果没有,再去hosts文件看,也没有,才会去问LDNS。

2、LDNS会去先看看自己有没有123.abc.qq.com.cn的A记录,要有就直接返回,要没有,就去看有没有abc.qq.com.cn的NS记录,如果有,就去问它要答案,如果没有,就去看有无qq.com.cn的NS的记录,如果有,就去问它,没有就去看有无com.cn的DNS,还没有就去看有无cn的DNS,如果连cn的NS记录都没有,才去问根。

所以,有了缓存以后,教科书上那种从根问起的情况,实际上很少发生。

只有在各处都没有缓存的时候,我们才会问根。

基础知识

1.域名系统

img

img

2.域名服务器

img

域名解析过程

1.在浏览器中输入www.qq.com域名,会优先访问浏览器缓存,如果未命中则访问OS缓存,则访问本地hosts文件

2.如果hosts里没有这个域名的映射,则查找本地DNS解析器缓存,是否有这个网址映射关系,如果有,直接返回,完成域名解析。

3.如果hosts与本地DNS解析器缓存都没有相应的网址映射关系,首先会找TCP/IP参数中设置的首选DNS服务器,在此我们叫它本地DNS服务器,

此服务器收到查询时,如果要查询的域名,包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析,此解析具有权威性。

4.如果要查询的域名,不由本地DNS服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析,此解析不具有权威性。

5.如果本地DNS服务器本地区域文件与缓存解析都失效,则根据本地DNS服务器的设置(是否设置转发器)进行查询,

如果未用转发模式,本地DNS就把请求发至 “根DNS服务器”,“根DNS服务器”收到请求后会判断这个域名(.com)是谁来授权管理,并会返回一个负责该顶级域名服务器的一个IP。

本地DNS服务器收到IP信息后,将会联系负责.com域的这台服务器。这台负责.com域的服务器收到请求后,如果自己无法解析,

它就会找一个管理.com域的下一级DNS服务器地址(qq.com)给本地DNS服务器。当本地DNS服务器收到这个地址后,就会找qq.com域服务器,重复上面的动作,进行查询,直至找到www.qq.com主机。

6.如果用的是转发模式,此DNS服务器就会把请求转发至上一级DNS服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根DNS或把转请求转至上上级,以此循环。

不管是本地DNS服务器用是是转发,还是根提示,最后都是把结果返回给本地DNS服务器,由此DNS服务器再返回给客户机。

递归查询与迭代查询

一、主机向本地域名服务器的查询一般都是采用递归查询。

​ 所谓递归查询就是:如果主机所询问的本地域名服务器不知道被查询的域名的IP地址,那么本地域名服务器就以DNS客户的身份,

​ 向其它根域名服务器继续发出查询请求报文(即替主机继续查询),而不是让主机自己进行下一步查询。

​ 因此,递归查询返回的查询结果或者是所要查询的IP地址,或者是报错,表示无法查询到所需的IP地址。

二、本地域名服务器向根域名服务器的查询的迭代查询。

​ 迭代查询的特点:当根域名服务器收到本地域名服务器发出的迭代查询请求报文时,要么给出所要查询的IP地址,要么告诉本地服务器:“你下一步应当向哪一个域名服务器进行查询”。

​ 然后让本地服务器进行后续的查询。根域名服务器通常是把自己知道的顶级域名服务器的IP地址告诉本地域名服务器,让本地域名服务器再向顶级域名服务器查询。

​ 顶级域名服务器在收到本地域名服务器的查询请求后,要么给出所要查询的IP地址,要么告诉本地服务器下一步应当向哪一个权限域名服务器进行查询。

​ 最后,知道了所要解析的IP地址或报错,然后把这个结果返回给发起查询的主机

img

img

img

递归:客户端只发一次请求,要求对方给出最终结果。

迭代:客户端发出一次请求,对方如果没有授权回答,它就会返回一个能解答这个查询的其它名称服务器列表,

​ 客户端会再向返回的列表中发出请求,直到找到最终负责所查域名的名称服务器,从它得到最终结果。

授权回答:向dns服务器查询一个域名,刚好这个域名是本服务器负责,返回的结果就是授权回答。

从递归和迭代查询可以看出:

客户端-本地dns服务端:这部分属于递归查询。

本地dns服务端—外网:这部分属于迭代查询。

递归查询时,返回的结果只有两种:查询成功或查询失败.

迭代查询,又称作重指引,返回的是最佳的查询点或者主机地址.

DNS缓存机制

关于DNS缓存的机制,有一篇非常详细的文章What really happens when you navigate to a URL

简单来说,一条域名的DNS记录会在本地有两种缓存:浏览器缓存和操作系统(OS)缓存。在浏览器中访问的时候,会优先访问浏览器缓存,

如果未命中则访问OS缓存,则访问本地hosts文件,若未命中最后再访问DNS服务器(一般是ISP提供),然后DNS服务器会递归式的查找域名记录,然后返回。

DNS记录会有一个ttl值(time to live),单位是秒,意思是这个记录最大有效期是多少。经过实验,OS缓存会参考ttl值,但是不完全等于ttl值,

而浏览器DNS缓存的时间跟ttl值无关,每种浏览器都使用一个固定值。

这里有一篇文章,做过详细的测试Why Web Browser DNS Caching Can Be A Bad Thing

Windows访问DNS后会把记录保存一段短暂的时间,

可通过ipconfig /displaydns 查看windows的DNS缓存、通过ipconfig /flushdns来清除。

工具和命令

相关的工具和命令: dig,nslookup,host等.其中以dig命令的功能最为强大和灵活.

dig命令典型应用形如:

dig @server name type

@server: 指定域名服务器

**name:**指定查询请求资源的域名

**type:**指定查询类型,如A、CNAME、SRV、MX、SIG等,如果不指定type,默认为A

查询某个域名解析的全过程:(此时为迭代查询)

1
$ dig @8.8.8.8  163.com +trace

参考资料:

DNS递归查询与迭代查询 - 皈依之路 - 博客园 (cnblogs.com)

http://blog.csdn.net/wyq_tc25/article/details/51679520

http://blog.csdn.net/wytheonly/article/details/37925067

http://www.cnblogs.com/Juntaran/p/5827110.html

http://magic3.blog.51cto.com/1146917/1354084

http://blog.csdn.net/realmeh/article/details/22663807

Author

white crow

Posted on

2022-01-06

Updated on

2024-03-25

Licensed under