用DNS进行名字查找
第一眼看上去,所有这些域和区的麻烦似乎使得名字解析成为一件非常复杂的事情了。毕竟,如果没有中心权威控制什么名字分配给哪台主机的话,那么推知它将是一个多么粗陋的程序啊?!
现在讨论有关DNS的真正精华(自然,坦白,直率)的部分了。如果你想找出erdos的IP地址,那么,DNS会说,去问管理它的人,他们会告诉你。
实际上,DNS是一个巨大的分布式数据库。它是依靠所谓的名字服务器来实现的,名字服务器为一个给定的域或一组域提供信息。对于每一个区,起码有两个、最多有几个的名字服务器,在那个区的主机上掌握着所有的权威信息。为了得到erdos的IP地址,你所要做的只是联系groucho.edu区的名字服务器,名字服务器将返回你所期望的数据。
你可能会想,说起来容易做起来难。那么我怎样知道如何达到Groucho Marx大学的名字服务器呢?如果你的计算机没有配备一个地址解析程序,DNS也能提供这个能力。当你的应用程序想要在erdos上查找信息时,它就会与本地名字服务器联系,该名字服务器会为它处理一个迭代查询。它首先向根域的名字服务器发出一个查询,询问erdos.maths.groucho.edu的地址。根名字服务器注意到这个名字不属于它的管理权限范围内,而是属于edu域下的某个。因此,它告诉你与edu区的名字服务器联系以取得更详细的信息,并且给了所有一张edu的名字服务器及其地址的列表。此时,你的本地名字服务器将继续执行并查询那些edu的名字服务器之一,例如a.isi.edu。和根名字服务器同样的方式,a.isi.edu知道groucho.edu运行于他们自己的区里,并且使你指向他们的服务器。现在,本地名字服务器将自己的查询发送到这些服务器之一上,这将最终认 可这个属于它的区的名字,并且返回相应的IP地址。
现在,看上去为了查找一个小小的IP地址为产生许多的通信量,但是,如果我们仍然使用HOSTS.TXT的话,所产生的数据传送量要比上述方法大的多。但是这个方案还有需要改进的地方。
为了改善将来查询的响应时间,名字服务器将在其本地缓冲中存储所获得的信息。所以当下次你的本地网络上有任何人想要查找在groucho.edu域上主机的地址时,你的名字服务器就不用再次经历整个过程,而是会直接到groucho.edu名字服务器上。[4]
当然,名字服务器并不会永远保留这个信息的,而是会在一定时间后放弃的。这个到期间隔时间称为存活期(time to live),或TTL。DNS数据库中的每一数据都有相应责任区的管理员指定的TTL。
域名服务器
拥有一个区内所有主机信息的名字服务器被称为该区授权的(authoritative),并且有时称之为主名字服务器(master name servers)。对该区内主机的任何查询都将最终绕回到这些主名字服务器之一上。
为了提供与一个区一致的描述,它的主服务器必须很好地同步。这是通过使他们其中之一成为主要(最初、原始)的(primary)服务器来达到的,它从数据文件中装入区信息,并且使别的服务器成为次要(第二位)的(secondary)服务器,并从主要服务器中周期性地传入区数据。
有几个名字服务器的一个原因是为了分散工作负荷,其它的原因是为了有容余备份。当一个名字服务器机器毫无准备地出了故障,如崩溃了或失去了网络连接,所有的查询都将回送到其它的服务器上。当然,这个方案并不会保护你免受服务器故障而产生对所有DNS请求的错误应答,例如,由于服务器程序本身的软件错误。
当然,你也可以运行一个没有为任何域授权的名字服务器。[5] 不过这类服务器也是有用的,因为它还是可以为运行于本地网络上的应用程序管理DNS查询的,并缓冲所得信息。因此,它被称为只缓冲(caching-only)服务器。