前面我们曾经提到了一些有关递归查询的内容,但说的很少,也很笼统,本节将会从原理和实例两方面入手分析DNS的递归以及迭代查询。
在此之前,我们需要了解一些背景知识,以便于更好的理解今天的主题内容。
在互联网中,一个域名的顺利解析离不开两类域名服务器,只有由这两类域名服务器可以提供“权威性”的域名解析。
第一类就是国际域名管理机构,也就InterNIC,主要负责国际域名的注册和解析,第二类就是国内域名注册管理机构,在中国就是CNNIC了,主要负责国内域名注册和解析,当然,尽管分为国际和国内,但两者一主一辅,相互同步信息,毕竟最终的目的是在全球任何一个有网络的地方都可以顺利访问任何一个有效合法的域名,其间的联系就可见一斑了。
有的朋友可能会有这个疑问,域名服务器不是有很多吗?为什么说只有2类呢?是的,ISP何其多?当我们输入某一网址(或域名),系统将这个域名发送至需要将其当前已配置的DNS服务器,以便转换为IP地址进行访问,通常会是当地的公共DNS服务器(内网环境可能直接提交到防火墙或路由器上做进一步转发处理)。公网DNS服务器收到此请求后,并非立刻处理,比如转发至上一级的DNS服务器(在第一节讲过DNS有着很严格的逻辑层次关系),而是首先会查看自己的DNS缓存,如果有这个域名对应的IP,则直接返回给用户,系统收到这个IP后交给浏览器做进一步处理。在这个轮回的过程中,客户端所得到的DNS的回复就是“非权威的性”的,也就是说这个结果并不是来自这个域名所直接授权的DNS服务器,而是该记录的副本。简单的说,“非权威性”的应答是从别的DNS服务器上复制过来的,与之对应的,就是“权威性”应答则是由域名所在的服务器作出的应答,听起来似乎不易理解,我们来看一个例子。
我所在地是深圳,这里的公共DNS服务器是202.96.134.133,我们来检测一下。
如下图:
这里用到了nslookup命令,用来查询当前本机解析域名所依赖的DNS服务器,从上图中文名可以得知当前默认的DNS解析服务器是ns.szptt.net.cn,对应的IP地址为202.96.134.133,也就是说在这台机子上运行的网络程序,如果需要用到DNS域名解析的,都会将请求到这个服务器上,寻求解析。
当然,如果你是在内网,或是其他类型的局域网,在解析时候可能无法顺利得到上图的结果,多半是代理或防火墙的缘故。建议ADSL用户可以自测一下,加深印象。现在,我们来解析一个网站的别名记录,以此来了解一下何为“非授权记录”
以网易为例吧。如下图:
依照上图步骤就完成了一次CNAME记录的查询,通过这次小测试,希望大家注意一下几点:
1、查询的命令不仅这一种,我们还可以用命令nslookup -qt=cname www.163.com ,返回的结果是一样的。
2、查询的对象需要是一个完整的URL地址,而并非域名,如果想查询对象写出163.com,则默认值返回163.com这个域的ns记录。
2、查询的对象需要是一个完整的URL地址,而并非域名,如果想查询对象写出163.com,则默认值返回163.com这个域的ns记录。
如下图:
163.com的子域名还有很多,不同的子域名可能对应不用的NS服务器,这样做的目的是可以更快的相应客户请求,这就用到的服务器的均衡负载技术了。所以网易的NS服务器也肯定不只这一个。可以用命令来证实,如下图:
从上图可知,网易的NS服务器至少有2台。
以上所有的信息都是“非权威性”的回应,换句话说,这些记录都保存在深圳的这台DNS服务器上,刚才查询的所有结果均来源于此,自然都是副本信息。
那如何才能找到最原始的解析记录呢?要想揭开这个疑难,我们需要对DNS的查询原理有一定的认识。下面是是DNS查询的大致步骤:
1> 首先,客户端提出域名解析请求(无论以何种形式或方法),并将该请求发或转发给本地的DNS服务器。
2> 接着,本地DNS服务器收到请求后就去查询自己的缓存,如果有该条记录,则会将查询的结果返回给客户端。(也就是我们看到的““非权威性”的应答”)。
请注意,下面就开始递归查询了:
反之,如果DNS服务器本地没有搜索到相应的记录,则会把请求转发到根DNS(13台根DNS服务器的IP信息默认均存储在DNS服务器中,当需要时就会去有选择性的连接)。
3> 然后,根DNS服务器收到请求后会判断这个域名是谁来授权管理,并会返回一个负责该域名子域的DNS服务器地址。比如,查询ent.163.com的IP,根DNS服务器就会在负责.com顶级域名的DNS服务器中选一个(并非随机,而是根据空间、地址、管辖区域等条件进行筛选),返回给本地DNS服务器。可以说根域对顶级域名有绝对管理权,自然也知道他们的全部信息,因为在DNS系统中,上一级对下一级有管理权限,毫无疑问,根DNS是最高一级了。
2> 接着,本地DNS服务器收到请求后就去查询自己的缓存,如果有该条记录,则会将查询的结果返回给客户端。(也就是我们看到的““非权威性”的应答”)。
请注意,下面就开始递归查询了:
反之,如果DNS服务器本地没有搜索到相应的记录,则会把请求转发到根DNS(13台根DNS服务器的IP信息默认均存储在DNS服务器中,当需要时就会去有选择性的连接)。
3> 然后,根DNS服务器收到请求后会判断这个域名是谁来授权管理,并会返回一个负责该域名子域的DNS服务器地址。比如,查询ent.163.com的IP,根DNS服务器就会在负责.com顶级域名的DNS服务器中选一个(并非随机,而是根据空间、地址、管辖区域等条件进行筛选),返回给本地DNS服务器。可以说根域对顶级域名有绝对管理权,自然也知道他们的全部信息,因为在DNS系统中,上一级对下一级有管理权限,毫无疑问,根DNS是最高一级了。
4> 本地DNS服务器收到这个地址后,就开始联系对方并将此请求发给他。负责.com域名的某台服务器收到此请求后,如果自己无法解析,就会返回一个管理.com的下一级的DNS服务器地址给本地DNS服务器,也就是负责管理163.com的DNS。
5> 当本地DNS服务器收到这个地址后,就会重复上面的动作,继续往下联系。
6> 不断重复这样的轮回过程,直到有一台DNS服务器可以顺利解析出这个地址为止。在这个过程中,客户端一直处理等待状态,他不需要做任何事,也做不了什么。
7> 直到本地DNS服务器获得IP时,才会把这个IP返回给客户端,到此在本地的DNS服务器取得IP地址后,递归查询就算完成了。本地DNS服务器同时会将这条记录写入自己的缓存,以备后用。
到此,整个解析过程完成。
客户端拿到这个地址后,就可以顺利往下进行了。但假设客户端请求的域名根本不存在,解析自然不成功,DNS服务器会返回此域名不可达,在客户端的体现就是网页无法浏览或网络程序无法连接等等。