3.3.4 域名解析

3.3.4 域名解析

下面简单介绍域名解析的概念以及域名服务器是如何工作的。

1.域名解析

将域名映射为相应的IP地址或将IP地址映射为域名,称为域名解析。其中由域名查找对应的IP地址称为正解,而由IP地址映射出域名称为反解。

完成这项解析工作的软件叫解析程序或解析器。解析器通常以函数库的方式嵌在操作系统中,负责接收各类应用程序的DNS查询请求,并向域名服务器发送查询请求。

DNS以客户/服务器模式进行工作。DNS包含两类格式相同的报文:查询和响应。DNS客户向DNS服务器发送查询报文请求DNS服务,DNS服务器向客户回传响应报文。当某一个应用进程需要把主机名解析为IP地址时,该应用进程就调用解析器,并将该名字作为参数传递给它。此时,该应用进程成为DNS的客户。然后解析器向本地域名服务器发送请求报文,其中包含了要解析的名字。之后,本地域名服务器查找该名字,把对应的IP地址放在回答报文中返回。有了IP地址以后,应用进程就可以与目标主机进行通信。如果本地域名服务器无法解析,那么它将暂时成为DNS中的另一个客户,向其他域名服务器发出查询请求,直至有域名服务器能够做出解析为止。

例如,假设某个用户使用文件传输的客户端接入远程的文件传输服务器。用户知道服务器的域名,但要与其建立连接,还需要知道其IP地址。这里从域名到IP地址的转换经历了如图3-20所示的6个步骤。

①将域名传送到文件传输客户端;

②文件传输客户端将这个域名传给DNS客户端;

③该DNS客户向DNS服务器发送一个包含域名的请求;

④该DNS客户最终会收到一份回答报文,其中含有对应该域名的IP地址;

⑤DNS客户向文件传输客户端返回IP地址;

⑥文件传输客户端利用该IP地址与文件传输服务器建立连接。

图3-20 域名到IP地址的转换示意图

解析器与域名服务器之间以及域名服务器相互之间存在两种工作方式:递归式查询和迭代式查询。

(1)递归查询

DNS客户把查询请求转发给DNS服务器。若服务器有所需要的数据,它就发送解答;如果服务器没有所需要的数据,则服务器以DNS客户的身份向其他的域名服务器查询。当最终数据被找到时,解答就沿查询链返回,直到到达发出请求的客户。这种方式称为递归查询。一般由DNS客户端向本地域名服务器提出的查询请求都是递归式的查询方式。在这个过程中解析器只需接触一次域名服务器系统,就可得到所需的节点地址。

假设主机a.xyz.com打算发送邮件给主机b.123.org,域名为a.xyz.com的主机就必须知道主机b.123.org的IP地址。图3-21给出了这个查询过程。

①主机a.xyz.com先向其本地域名服务器dns.xyz.com发送查询报文,查询报文含有需转换的主机名b.123.org;

②本地域名服务器将该报文转发到根域名服务器;

③根域名服务器将报文转发到顶级域名服务器dns.org;

④顶级域名服务器将报文转发到权限域名服务器dns.123.org。

权限域名服务器dns.123.org中保存了b.123.org的IP地址。当查找到解析结果后,所需的IP地址经过顶级域名服务器dns.org、根域名服务器、本地域名服务器(⑤~⑧步)最终传送到主机a.xyz.com上。

图3-21 递归查询

(2)迭代查询

DNS客户把查询请求转发给DNS服务器,若该服务器能找到所需数据,它就发送解答。若不能,就返回它认为可以解析这个查询的服务器IP地址,告诉DNS客户下一步应当向哪一个域名服务器进行查询。客户就向第2个服务器重复查询。若找到的服务器能够解决这个问题,就用IP地址回答这个查询;否则,就向客户返回一个新的服务器的IP地址。客户必须向第3个服务器重复查询。这种查询方式称为迭代查询。一般本地域名服务器向其他域名服务器的查询通常采用迭代查询。图3-22所示的例子中包含了迭代查询的过程。

图3-22 迭代查询

①主机a.xyz.com先向其本地域名服务器dns.xyz.com发送查询请求;

②本地域名服务器采用迭代查询,将该报文转发到根域名服务器;

③根域名服务器向本地域名服务器返回顶级域名服务器dns.org的IP地址;

④本地域名服务器向顶级域名服务器dns.org进行查询;

⑤顶级域名服务器dns.org用权限域名服务器dns.123.org的IP地址进行响应;

⑥本地域名服务器向权限域名服务器dns.123.org发送查询报文;

⑦权限域名服务器dns.123.org告诉本地域名服务器所查询的主机的IP地址;

⑧本地域名服务器最后把查询结果告诉主机a.xyz.com。

本地域名服务器经过三次迭代查询后,最终从权限域名服务器dns.123.org得到了主机b.123.org的IP地址,并把结果返回给主机a.xyz.com。

需要注意的是,图3-22所示的例子既包含了递归查询,也包含了迭代查询。从a.xyz.com到dns.xyz.com发出的查询是递归查询。而②~⑦步的查询是迭代查询,因为所有的回答都是直接返回给本地域名服务器的。在实际应用中,查询通常遵循图3-22中的模式,即从请求主机到本地域名服务器的查询是递归的,其余的查询是迭代的。

2.DNS缓存

迭代或递归式的域名解析过程往往需要发送多次报文请求才能找到所要查询的IP地址,导致查询效率并不高。

为了改善查询的时延性能、减轻根域名服务器的负荷并减少Internet上的DNS查询报文数量,DNS采用了高速缓存的机制。每个域名服务器都维护一个高速缓存,存放最近查询过并获取的域名和IP地址映射记录,以便下一次有DNS客户端查询相同数据时直接从缓存中调用所需数据。

例如,主机a.xyz.com向dns.xyz.com查询了主机名b.123.org的IP地址。假定几个小时后,另外一台主机c.xyz.com也向dns.xyz.com查询相同的主机名。由于有了缓存,本地域名服务器可以立即返回b.123.org的IP地址,而不必查询其他域名服务器。本地域名服务器也可以缓存顶级域名服务器的IP地址,因而本地域名服务器可以绕过查询链中的根域名服务器直接向顶级域名服务器发送查询请求报文。

高速缓存加速了解析过程,但仍然是有问题的。若服务器放入高速缓存的映射信息已有很长的时间,则很可能已经过时。为解决这个问题,域名服务器通常为每项缓存内容设置计时器并处理过期的缓存。授权服务器会将叫作生存时间(TTL,Time to Live)的一块信息添加在映射上。TTL定义了缓存信息在接收信息的服务器中存在的时间(以秒计)。数据保存到缓存后,TTL就会开始递减,等TTL变为0时,域名服务器就会将此数据从缓存中删除。在此之后,必须重新到授权管理该域名的域名服务器获取映射信息。

高速缓存不仅存在于本地域名服务器中,许多主机通常也会维护自己最近使用的域名映射信息,并且只在从缓存中找不到映射信息时才向域名服务器发送查询请求。