【基础服务】简单理解DNS的递归、迭代查询 - DNS(一)
2014-05-10 16:11
330 查看
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
简单理解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
相关文章推荐
- DNS系列教程(十)图例详解DNS递归和迭代查询原理及过程 (2)
- 图、例详解DNS递归和迭代查询原理及过程
- 使用Oracle数据库实现树形结构表的子-父级迭代(递归)查询和删除,通过级联菜单简单举例
- DNS递归与迭代查询次数计算
- 一起学DNS系列(十)图、例详解DNS递归和迭代查询原理及过程 (1)
- 一起学DNS系列(十)图、例详解DNS递归和迭代查询原理及过程 (2)
- DNS服务器基本服务(正向、反向解析)、别名、递归、迭代、增量传输、完全传输
- 一起学DNS系列(十)图、例详解DNS递归和迭代查询原理及过程 (2)
- 一起学DNS系列(十)图、例详解DNS递归和迭代查询原理及过程 (1)
- 一起学DNS系列(十)图、例详解DNS递归和迭代查询原理及过程 (1)
- DNS递归和迭代查询原理
- 使用os.popen/commands.getoutput查询指定端口号的服务 分类: python 小练习 open()文件读写 python基础学习 2013-09-17 17:49 798人阅读 评论(0) 收藏
- 架构设计中服务层的简单理解
- BIND服务基础及DNS Master服务器配置步骤
- C#基础之LINQ查询语句的简单使用(一)
- Git的简单理解及基础操作命令详解
- PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询二:SQL解析为parsetree
- Java基础:java实现非递归二分查询
- 对xep-0030 服务发现的一点理解,目录查询
- 市长信箱邮件查询服务: 使用SpringBoot搭建基础