为了便于管理,互联网上的域名采用树状分层结构,分层结构的每一个节点都有一个域名,通常根节点的标号为空。DNS要求每个节点其下的子节点应具有不同的标号,因此这种树状结构保证了域名的唯一性。
利用这种层次结构,地址映射就可以分布到所有DNS服务器上了。当客户主机对某个域名发起请求时,该请求首先被发往本地DNS服务器上,本地DNS服务器随后将该请求转发到DNS层次结构中去,实现地址映射。在这种机制下,会涉及客户主机与DNS服务器以及各级解析服务器之间多重通信,这里我们通常采用的查询方式是递归查询和迭代查询。
递归查询,是指接受查询请求的DNS服务器必须对请求进行处理并予以响应。当客户主机请求目标域名的IP地址时,本地DNS服务器将该查询请求转发到上级服务器,上级服务器再将该查询转发到更高级的服务器,直到查询被解析或出错,响应则逆向转发至客户主机。
迭代查询,是指如果客户主机没有要求递归查询,则按照迭代方式映射。迭代过程的每一次查询请求都由客户机发出,对查询的每一次响应也直接返回给客户主机,如果没有解析到IP地址,将返回一个逻辑上更接近DNS服务器的IP地址,客户主机根据这个IP地址继续查询,直到返回最终结果或解析出错。
理论上DNS解析既可以是递归也可以是迭代,但在实际应用上,往往采用递归和迭代相结合的方式进行DNS的查询。
当客户主机发起解析请求时,往往采用递归查询方式请求本地DNS服务器,本地DNS服务器如果记录有该域名的结果,直接将结果返回给客户主机。如果没有结果,本地DNS服务器就会进行全球迭代查询,查询的过程大致是这样的:
本地DNS服务器请求根域名服务器,得到顶级域名服务器IP地址;本地DNS服务器请求顶级域名服务器,得到域名授权的权威解析服务器地址;本地DNS服务器请求权威解析服务器地址,得到域名与IP的映射关系。
本地DNS服务器得到域名的IP地址后,完成递归查询,将结果转发给客户主机。客户主机对域名绑定的IP地址发起请求,整个DNS查询流程结束。
DNS解析的流程比较复杂,每一次都要经过本地DNS服务器和各级域名服务器共同协作,才能将最终结果告知客户主机,如果每次都经过如此复杂的过程,将会给DNS系统造成非常大的压力,并且带来额外的时延,因此DNS系统中引入了缓存机制。DNS缓存原理非常简单,当DNS服务器收到一个DNS回答时,会将映射信息缓存到本地存储器上保存一段时间(TTL值)。当收到下一次查询请求时,DNS服务器首先会检查本地缓存,如果本地缓存中存在结果,就会直接从缓存中取出信息回答客户主机的请求;如果缓存中没有请求的结果,DNS服务器再发出进一步的查询。
相关推荐: