关于DNS解析试题分析和查询方式讲解

2023-05-06 19:16:41 浏览数 (1)

题目来源:2010-408_计算机学科专业基础综合

链接:https://www.nowcoder.com/questionTerminal/236f48f9fe404600904563e0d852396f

如果本地域名服务无缓存,当采用递归方法解析另一网络某主机域名时,用户主机 、本地域名服务器发送的域名请求消息数分别为() 

A.1条,1条

B.1条,多条

C.多条,1条

D.多条,多条

我在下面给出的回答是:

确实选A,选择B的可能没有注意到题目说的是使用递归查询。在实际中,客户机向本地域名服务器查询是递归查询,本地域名服务器向其他域名服务器是迭代查询,但是这里题目要求就是递归查询。递归查询是:客户机发送一条查询请求到本地域名服务器,发现缓存中没有主机名和IP地址对的信息,那么本地域名服务器就往上继续查询,发送一个查询报文,如果在某一级域名服务器找到了主机名和IP地址对信息,就直接返回。如果找不到,那么这个域名服务器又会作为客户机去请求上一级域名服务器,直至根域名服务器,根名称服务器收到DNS请求后,把所查询得到的所请求的DNS域名中发送给顶级域名服务器,让顶级域名服务器去往下级域名服务器请求查找,如果找到了就原路返回。某域名服务器-->...->顶级域名服务器-->根域名服务器-->下一级域名服务器-->...-->本地域名服务器-->客户机。 所以在递归查询中,主机发送的请求为1次,本地域名服务器发送的请求也为1次。

大致过程如下图:

扩展阅读:https://jocent.me/2017/06/18/dns-protocol-principle.html

接下来来分析一下:

递归查询和迭代查询的区别 (1)递归查询 递归查询是一种DNS 服务器的查询模式,在该模式下DNS 服务器接收到客户机请求,必须使用一个准确的查询结果回复客户机。如果DNS 服务器本地没有存储查询DNS 信息,那么本地服务器就会成为DNS中的一台客户机,并向上级域名服务器发出查询请求,这种过程将持续到找到具有相关信息的域名服务器为止,然后将返回的查询结果提交给客户机。

过程中如果没有找到查询结果,重复递归上述操作直至根域名服务器,根域名服务器收到DNS请求后,把所查询得到的所请求的DNS域名中发送给顶级域名服务器,让顶级域名服务器去往下级域名服务器请求查找,如果找到了就原路返回。某域名服务器-->...->顶级域名服务器-->根域名服务器-->下一级域名服务器-->...-->本地域名服务器-->客户机。如果没有找到就报错,表示无法查询到相关信息。 (2)迭代查询 DNS 服务器另外一种查询方式为迭代查询,DNS 服务器会向客户机提供其他能够解析查询请求的DNS 服务器地址,当客户机发送查询请求时,DNS 服务器并不直接回复查询结果,而是告诉客户机另一台DNS 服务器地址,客户机再向这台DNS 服务器提交请求,依次循环直到返回查询的结果为止。

这两种查询中,递归是优于迭代的,因为迭代只有客户机和域名服务器之间的操作,而递归是除了客户机和域名服务器之间的操作,还涉及域名服务器之间的操作。

根服务器–最高层次的域名服务器,最重要的域名服务器。所有的根域名服务器都知道所有的顶级域名服务器的域名和IP地址

在以前,当本地域名服务器无法解析域名时,不是逐级查询,这样是很盲目的。而是马上就自顶向下,求助于根域名服务器,如果是递归的查询,则根域名服务器会发报文到顶级域名服务器,如果是二级域名,顶级域名服务器还要去发报文查找二级域名的映射。直到权限域名服务器,因为映射关系存储在权限域名服务器中。找到往上返回,直到根,根在返回给本地域名服务器。这样的设计已经被抛弃了,作为高贵的根服务器,居然被本地域名服务器驱使,这是管理学上的猴子爬到你的背上了! 改进这点,引入了迭代式查询,即根只告诉你去找谁,不帮你找。比如根告诉你怎么去找到顶级域名,如果顶级域名是你的权限域名服务器,那么直接告诉你答案即可。否则顶级域名服务器也是告诉你怎么去找二级,不是帮你找到为止。

从技术上讲,任何DNS查询既可以是迭代的也可以是递归的。

现在在实践中,查询通常遵循下图的模式,从请求主机到本地DNS服务器的查询是递归的,其余的查询是迭代的。

DNS缓存原理:当DNS服务器接受一个DNS应答时,DNS服务器能将该应答中的信息缓存在本地存储器中。并非只有本地域名服务器才会有缓存,任何一个DNS服务器都会有缓存。如果在某次查询中这个DNS服务器已经缓存了某主机名和IP地址对的映射信息,那么另一个对相同主机名的查询到达该DNS服务器时,该服务器就能够直接提供所需要的IP地址,而不必再辗转查询了。

可以想象,大量常用的主机名和IP地址对的信息存在本地DNS服务器中,有助于提升DNS系统效率。需要注意的是,为保持高速缓存中的内容正确,在DNS服务器中的主机名与IP地址间的映射并不是永久的,在一段时间(常设置为2天)后,DNS服务器将丢弃缓存中一直没有使用过的信息。

从理论上讲,如果全世界只是用一台域名服务器,其上运行一个包括所有主机名及其IP地址映射的数据库能够完成DNS的任务。然而这种简单的结构将引发严重的系统扩展性问题,例如致命的单点故障、通信容量拥塞、访问数据库时延和难以集中维护庞大的信息等,从而导致整个因特网应用系统瘫痪。因此,DNS采用了分布式的设计方案:DNS运行划分为过个层,每层采用客户/服务器方式工作,从而形成一个联机分布式数据库系统。DNS在本地域名服务器中进行大多数名字解析,仅少量解析需要通过更高级的域名服务器完成,使系统具有很高的工作效率。即使本地域名服务器有故障,也不会影响系统其他区域的工作。值得一提的是,DNS分布式解决方案带来了对抗攻击的健壮性,至今为止还没有出现因恶意攻击而导致DNS无法提供服务的事件。因此,这种分布式方案不仅改善了DNS可靠性,而且使IP地址能够缓存在一个“附近的”DNS服务器中,这有助于减少DNS的网络流量和DNS的平均时延。

DNS同时占用UDP和TCP端口53是公认的,DNS在进行区域传输或者响应报文超过512字节的时候使用TCP协议,其它时候则使用UDP协议。

为什么既使用TCP又使用UDP?  DNS报文分为请求报文和响应报文,如果响应报文是超过512字节的,那么就使用TCP,不大于512字节就使用UDP,这个是根据响应报文的长度来决定使用TCP还是UDP的。

DNS的规范规定了2种类型的DNS服务器,一个叫主DNS服务器,一个叫辅助DNS服务器。在一个区中主DNS服务器从自己本机的数据文件中读取该区的DNS数据信息,而辅助DNS服务器则从区的主DNS服务器中读取该区的DNS数据信息。当一个辅助DNS服务器启动时,它需要与主DNS服务器通信,并加载数据信息,这就叫做区传送(zone transfer)。再通俗一点来讲,就是将一个区域文件复制到多个DNS服务器的过程被称为区域传输。它是通过从主服务器上将区域文件的信息复制到辅助服务器来实现的,当主服务器的区域有变化时,该变化会通过区域传输机制复制到该区域的辅助服务器上。主服务器是区域传输的来源服务器,它既可以是主要区域,又可以是辅助区域。

区域传送时使用TCP,主要有一下两点考虑:  1.辅域名服务器会定时(一般时3小时)向主域名服务器进行查询以便了解数据是否有变动。如有变动,则会执行一次区域传送,进行数据同步。区域传送将使用TCP而不是UDP,因为数据同步传送的数据量比一个请求和应答的数据量要多得多。  2.TCP是一种可靠的连接,保证了数据的准确性。

域名解析时使用UDP协议:  客户端向DNS服务器查询域名,一般响应报文都不超过512字节,用UDP传输即可。不用经过TCP三次握手,这样DNS服务器负载更低,响应更快。虽然从理论上说,客户端也可以指定向DNS服务器查询的时候使用TCP,但事实上,很多DNS服务器进行配置的时候,仅支持UDP查询包。

更多详细解析见这里:全面了解移动端DNS域名劫持等杂症:原理、根源、HttpDNS解决方案等

0 人点赞