DNS——域名系统
域名系统
在理论上,所有程序通过使用它们存储的计算机网络地址(IP),就可以访问Web主页、邮箱和其他资源,但是这些地址很难记。而且浏览一个公司在128.111.24.41上的Web主页,意味着如果该公司将主页移到了另一台机器上,且该机器具有了不同的IP地址时,则必须将该机器的IP地址通知到每个人。
因此,人们引入了可读性好的高层名字,以便将机器名字与机器地址分离开。在这种方式下,无论真正使用的IP地址是什么,人们熟知的公司Web服务器为www.baidu.com。然而,因为网络本身只能理解数字形式的地址,所以需要某种机制将名字转换为网络地址。
我们回到早期的ARPANET,那时只有一个简单的文件,名叫hosts.txt,它列出了所有的计算机名字和它们的IP地址。每天晚上,多有主机都从一个维护此文件的站点将该文件取回,然后在本地进行更新。对于一个拥有几百台大型分时机器的网络而言,这种方法工作得相当好。
然而,当几百万台PC连接到Internet以后,使用网络的每个人都意识到这种方法将不能继续有效工作了。一方面,这个文件变得非常庞大。然而,更重要的是,除非集中管理机器名字,否则主机名冲突的现象将会频繁发生;而且在一个巨大的国际性网络中,由于负载和延迟,要实现这种集中式的管理难以想象。为了解决这些问题,1983年人们发明了域名系统(DNS,Domain Name System)。
DNS的本质是发明了一种层次的、基于域的命名方案,并用一个分布式数据库系统加以实现。DNS的主要用途是将主机名映射成IP地址,但它也可以用于其他用途。
简要地说,DNS的使用方法如下所述:为了将一个名字映射成IP地址,应用程序调用一个名为解析器(resolver)的库程序,并将名字作为参数传递给此程序。解析器向本地DNS服务器发送一个包含该名字的请求报文;本地DNS服务器查询该名字,并且返回一个包含该名字对应IP地址的响应报文给解析器,然后解析器再将IP地址返回给调用方。查询报文与响应报文都作为UDP数据包发送。有了IP地址以后,应用程序就可以与目标主机建立一个TCP连接,或者给它发送UDP数据包。
DNS命名空间
对于Internet,命名层次结构的顶级有一个专门组织负责管理——ICANN(Internet Corporation for Assigned Names and Numbers,Internet名字与数字地址分配机构)。该组织创建于1998年。从概念上讲,Internet被划分为超过250个顶级域名(top-level domains),其中每个域涵盖了许多主机。这些域又被进一步划分为子域,这些子域可被再次划分,以此类推。所有这些域可以表示为一棵树,如下图所示。树的叶子代表没有子域的域(当然要包含主机)。一个叶结点域可能包含一台主机,或者代表一个公司,该公司包含数以千计的主机。
域名资源记录
无论是只有一台主机的域还是顶级域,每个域都有一组与它相关联的资源记录(resource record)。这些记录组成了DNS数据库。对于一台主机来说,最常见的资源记录就是它的IP地址,但除此以外还存在着许多其他种类的资源记录。当解析器把一个域名传递给DNS时,它能获得的DNS返回结果就是与该域名相关联的资源记录。因此,DNS的基本功能是将域名映射到资源记录。
一条资源记录是一个五元组:Domain_name Time_to_live Class Type Value
Domain_name(域名)指出了这条记录适用于哪个域。通常每个域有许多条记录,并且数据库的每份副本保存了多个域的信息。因此 Domain_name 是匹配查询条件的主要搜索关键字。数据库中资源记录的顺序则无关紧要。
Time_to_live(生存期)指明了该条记录的稳定程度。极为稳定的信息会被分配到一个很大的值,比如86400(一天时间的秒数);而非常不稳定的信息则会被分配到一个较小的值,比如60(一分钟的秒数)。
Class(类别):对于Internet信息,它总是IN。
Type(类型):DNS记录有许多类型。
Value字段的语义取决于记录类型。
域名解析
查询一个名字和找出其对应地址的过程称为域名解析。当解析器需要查询一个域名,它就把该查询传递给一个本地域名服务器。如果需要寻找的域恰好落在该域名服务器管辖下,则该域名服务器就返回权威资源记录。一个权威记录(authoritative record)由管理该记录的权威部门提供,因此总是正确的。权威记录的权威性是相对缓存记录(cached record)而言的,缓存的记录有可能过时了。
如果被查询域在远端,则如图所示。这个例子勾勒的是最坏的情况,发生在没有任何缓存有用信息的时候。
——摘自《计算机网络》第5版