本节书摘来自异步社区《DNS与BIND(第5版)》一书中的第1章,第1.3节,作者: 【美】Joseph Davies 更多章节内容可以访问云栖社区“异步社区”公众号查看。
1.3 DNS简述
域名系统是一个分布式数据库。这种结构允许对整体数据库的各个部分进行本地控制,并且在各个部分中的数据通过客户端/服务器(client/server)模式变得对整个网络都可用。通过复制和缓存等机制,DNS拥有了健壮性和充足的性能。
被称为名称服务器(nameserver)的程序构成了DNS客户端/服务器机制的服务器一端。名称服务器包含了数据库中某些部分的信息,并使得这些信息对被称为解析器(resolver)的客户端可用。解析器通常只是一组库例程(library routine),这些库例程产生查询请求并将请求通过网络发送给名称服务器。
如图1-1所示,DNS数据库的结构类似于UNIX文件系统的结构。整个数据库(或者文件系统)被描绘成一棵倒置的树,root节点在树的顶端。树中的每个节点都有一个文本标签,用来标识该节点同父节点的相对关系。这大致上类似于文件系统中的“相对路径(relative pathname)”,例如bin。空标签(null label)或“ ”被保留给root节点使用。在本书中,root节点被写成一个点号(.)。而在UNIX的文件系统中,根目录则被写成一个斜杠(/)。

整棵树上的各个节点也是其所对应的新子树的根。每棵子树都代表了整个数据库的一部分:对于UNIX文件系统而言代表着一个目录(directory),而对于域名系统而言则代表着一个域(domain)。每个域或目录又可以被进一步划分为额外的部分,在DNS中这被称作子域(subdomain),而在文件系统中这被称作子目录(subdirectory)。像子目录一样,子域在图中被描绘成它们父域的孩子。
和每个目录一样,每个域都有一个唯一的名称。一个域的域名标识了它在数据库中的位置,就像一个目录的绝对路径名(absolute pathname)标识了它在文件系统中的位置一样。在DNS中,域名是从该域的root节点开始,一直回溯到整棵树的root节点的标签序列,以点号(.)分隔路径中的各个节点标签。在UNIX文件系统中,一个目录的绝对路径是从树的根节点开始标记,一直走到叶子为止,使用斜杠“/”来分隔各个名称(同DNS的方向正好相反,见图1-2)。
在DNS中,每个域都可以被分解成若干个子域,这些子域可以被分派给不同的组织。比方说,一个名叫EDUCAUSE的组织管理着edu(educational)域,但是却委托加州大学伯克利分校管理berkeley.edu子域(如图1-3所示)。这就好像挂载(mount)一个远程文件系统一样。文件系统中的某些目录,实际上可能是位于其他主机上的文件系统,因为它们挂载自远程主机。例如(如图1-3所示),主机winken的管理员负责管理本地主机上以usr/nfs/winken目录出现的文件系统。
要将berkeley.edu授权给加州大学伯克利分校,需要创建一个新的区域(zone),就是在域命名空间中划分出一段可以自治的区域。berkeley.edu现在已经从edu中独立出来,它包括了所有以berkeley.edu结尾的域名。从另一方面来说,edu区域仅仅包括以edu结尾的域名,但又不包括像berkeley.edu这样已经被授权出去的域名。berkeley.edu可以被进一步划分出子域,例如cs.berkeley.edu。与此同时,如果berkeley.edu的管理员将部分子域的管理权委托给其他组织,那么这些子域也可以成为独立的区域。如果cs.berkeley.edu是一个独立的区域,那么berkeley.edu区域中将不包括以cs.berkeley.edu结尾的域名(见图1-4)。

域名被当做DNS数据库的索引来使用。可以把域名同DNS中的数据对应起来。在文件系统中,目录包含文件和子目录。同样,域也包含主机和子域。域中所包含的主机和子域的域名,就位于该域所属的命名空间的子树中。
在网络上的每台主机都有一个域名,它指向该主机的相关信息(见图1-5)。这些信息中可能包含IP地址、邮件路由信息等。此外,主机也可以拥有一个或多个域名别名(domain name aliases),这些域名别名是从某个域名(别名)指向另一个域名(正式的或规范的域名)的指针。在图1-5中,“mailhub.nv...”就是别名,而它的规范名称是“rincon.ba.ca...”。

为什么要采用如此复杂的结构呢?这是为了解决HOSTS.TXT文件所存在的问题。例如,采用层次结构的域名是为了消除名称冲突的问题。每个域都有一个唯一的域名,因而管理这个域的组织可以自由地命名该域中的主机和子域。无论管理者为他们的主机或者子域选择什么样的名称,都不会和其他组织的域名相冲突,因为这些名称会有唯一的域名附加在结尾。例如,管理hic.com的组织,可以把一台主机命名为puella(如图1-6所示),因为这个组织知道这台主机将会以hic.com结尾,从而成为一个唯一的域名。