首页 > 代码库 > 【基础服务】简单理解DNS的递归、迭代查询 - DNS(一)
【基础服务】简单理解DNS的递归、迭代查询 - DNS(一)
DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。DNS协议运行在UDP协议之上,使用端口号53。在RFC文档中RFC 2181对DNS有规范说明,RFC 2136对DNS的动态更新进行说明,RFC 2308对DNS查询的反向缓存进行说明。
简单理解DNS的递归、迭代查询过程:
客户端发出查询www.163.com 域名对应IP地址的请求,下图是在dns服务端使用tcpdump抓取的通迅过程。
客户端(192.168.198.1)服务端(192.168.198.190)
1、客户端发一个dns查询请求到dns服务器
2、190收到请求后先查询本地缓存,若是没缓存有记录,则直接返回给客户机,若没有,服务端向根服务器发出dns查询请求。
3、根会返回负责.com的服务器190,190又向这个IP发起查询,直到找出www.163.com对应的IP地址。(www.163.com是一个CNAME,com服务器会返回lxdns.com给190,直到找出163所对应的A记录)
4、190把查询出来的结果返回给客户端。
递归:客户端只发一次请求,要求对方给出最终结果。
迭代:客户端发出一次请求,对方如果没有授权回答,它就会返回一个能解答这个查询的其它名称服务器列表,客户端会再向返回的列表中发出请求,直到找到最终负责所查域名的名称服务器,从它得到最终结果。
授权回答:向dns服务器查询一个域名,刚好这个域名是本服务器负责,返回的结果就是授权回答。
环境如下:
客户端-----本地dns服务端----外网
从递归和迭代查询可以看出:
客户端-本地dns服务端:这部分属于递归查询。
本地dns服务端---外网:这部分属于迭代查询。
一般情况下,dns client发送的请求,都是属于递归查询请求。
回到客户机查询163.com的场景,看下图:这个是客户机发出的请求,他的flags标中的RD位是1,即这个是递归查询请求,要求dns服务器(190)把最终的结果返回给我。
再看DNS的named.conf配置:
190这台dns服务器named.conf配置文件中的recursion设成yes,表示这台服务器接收递归的dns查询请求。
Dig出来的结果中的flags行,有个ra标志,这个表示这台服务器允许递归。
上面说过:
本地dns服务端---外网:这部分属于迭代查询。
OK,看190这台机器的查询请求数据包,可以看到190这台机发出去的dns查询请求,他的RD位都为0:
RD位的解析如下:
如果named.conf设置:recursion no; 重启named服务。
Flags里的ra已没有了,说明这台服务器不允许我这个IP地址递归。
并提示递归请求,但不可用。recursion requested but not available
查这台服务器负责的域名,返回有结果,并且flags里有个aa,这个表示返回的是权威答案。
客户端使用迭代查询:
向根服务器发一个迭代查询
dig www.baidu.com +norecurse @199.7.91.13
+norecurse 表示发出去的dns请求是迭代查询,里面的rd标志位为0
由于根服务器没有授权回答,所以它返回能解答该查询的其他名字服务器列表。如下图:
注:根服务器flags没有ra,所以这台根服务器关闭递归查询。
本文出自 “尽管错,让我错到死!” 博客,请务必保留此出处http://hxw168.blog.51cto.com/8718136/1409219