8.1.4 域名解析

我们知道,在互联网上的机器可以有一个主机名,同时也有IP地址。那么,它们之间有什么关系呢?主机名是一种符号化的标识主机的方式,它便于人描述、记忆和搜索主机,而IP地址是一种数字标识方式,它在IP层传输时能够高效地标识主机。因此,这两种描述方式分别面向用户和面向传输,缺一不可。

如果应用者通过域名标识了一台主机,在进行数据传输的时候,需要将域名翻译成对应的IP地址,这就是域名解析(domain name resolution)。域名解析实际是一个IP地址查询的过程。从概念上讲,域名解析是自上而下进行的,从根服务器开始直到末端的服务器。但是实际域名解析时可以采用两种方式。

第一种是递归解析(recursive resolution)。客户机向域名服务器发送域名解析请求。域名服务器检查名字是否处于自己有权管理的子域内。如果是,就根据自己的数据库把名字转换为IP地址,并将结果附加到查询中,将结果发送回客户机。如果名字服务器不能完全解析名字,则服务器与能解析该名字的服务器联系,并将回答返回到客户。以下动画能够反映递归解析的原理。

第二种是迭代解析(iterative resolution)。该解析方式与递归解析方式在解析自己管理的子域内的域名时采用了相同的机制,但是如果名字服务器不能完全解析名字,则向客户指名应该联系的下一个解析名字的服务器,由客户自己与下一个名字服务器联系。如果下一个名字服务器也不能完全解析客户请求的名字,也采用类似的机制告诉客户再下一个名字服务器,依次类推,直到客户获得完全的名字解析结果。以下动画能够反映迭代解析的原理。

为了减轻域名服务器的负担,域名解析可以采取递归和迭代解析相结合的方式,如下图所示。

 

从上面的介绍我们可以看到,实际采用的解析方式与概念上的解析是不同的。采用以上的解析方式可以获得较好的性能,原因是:

大多数的名字转换时本地名字,即与查询的机器在同一个名字空间划分中。如果每次都从顶级向下查询,效率不高;

顶级域名服务器的负荷可能会过载;

顶级域名服务器如果出现故障,整个名字的解析就无法进行。

此外,域名解析还使用了名字的高速缓存机制来优化查询的开销,如下图所示。每个域名服务器都维护着一个高速缓存,存放最近解析过的名字以及相关的信息的记录。当客户请求域名服务器解析名字时,服务器首先检查它是否被授权管理该名字。若未授权,则查看高速缓存,检查该名字是否最近被解析过。如果能够从高速缓存中获得相应的解析结果,服务器就能直接返回解析的IP地址,而不必进行真正的解析。这样就大大地提高了解析效率,降低了名字解析的开销。

为了保持高速缓存内容的正确性,域名服务器对每项高速缓存的内容设置一个合理的生存时间TTL。当超过了这个时间后,域名服务器将清除这项高速缓存的内容,下一次对该域名的解析将进行真正的解析操作,并且域名服务器将缓存新的解析结果。这样,就能提高域名解析的准确性。

另外,域名解析的高速缓存并不局限于本地域名服务器,而且主机也同样采用了域名的高速缓存机制。