现在到了 DNS 真正巧妙的部分。如果你想找到 erdos 的 IP 地址,那么 DNS 会说,去问管理它的人,他们会告诉你。
事实上,DNS 是一个巨大的分布式数据库。它通过所谓的名称服务器来实现,这些服务器提供关于给定域或一组域的信息。对于每个区域,至少有两个,最多几个名称服务器,它们保存关于该区域中主机的全部权威信息。要获得 erdos 的 IP 地址,你所要做的就是联系 groucho.edu 区域的名称服务器,它将返回所需的数据。
说起来容易做起来难,你可能会想。那么我如何知道如何联系格劳乔·马克斯大学的名称服务器呢?万一你的计算机没有配备地址解析的神谕,DNS 也提供了这个功能。当你的应用程序想要查找关于 erdos 的信息时,它会联系一个本地名称服务器,该服务器会为其执行所谓的迭代查询。它首先向根域的名称服务器发送查询,询问 erdos.maths.groucho.edu 的地址。根名称服务器识别到这个名称不属于它的授权区域,而是属于 edu 域之下的区域。因此,它告诉你联系一个 edu 区域名称服务器以获取更多信息,并附上所有 edu 名称服务器及其地址的列表。你的本地名称服务器然后将继续查询其中一个,例如 a.isi.edu。以类似于根名称服务器的方式,a.isi.edu 知道 groucho.edu 的人运行自己的区域,并将你指向他们的服务器。本地名称服务器然后将向其中一个服务器提交其对 erdos 的查询,该服务器最终将识别出该名称属于其区域,并返回相应的 IP 地址。
现在,这看起来像是为查找一个微不足道的 IP 地址产生了大量的流量,但与如果我们仍然停留在 HOSTS.TXT 时必须传输的数据量相比,这实际上只是微不足道的。但是这个方案仍然有改进的空间。
为了提高未来查询的响应时间,名称服务器将把获得的信息存储在其本地缓存中。因此,下次本地网络上的任何人想要查找 groucho.edu 域中主机的地址时,你的名称服务器将不必再次经历整个过程,而是直接访问 groucho.edu 名称服务器。
当然,名称服务器不会永远保留这些信息,而是在一段时间后将其丢弃。这个过期时间间隔称为生存时间,或 TTL。DNS 数据库中的每个数据都由负责区域的管理员分配了这样的 TTL。