6.2. DNS 工作原理

DNS 以域层次结构组织主机名。 是一些站点的集合,这些站点在某种意义上是相关的——因为它们构成了一个适当的网络(例如,校园内的所有机器,或者 BITNET 上的所有主机),因为它们都属于某个组织(例如,美国政府),或者仅仅因为它们在地理位置上很接近。 例如,大学通常被归入 edu 域,每个大学或学院使用单独的 子域,其主机都归属于该子域之下。 格劳乔·马克思大学拥有 groucho.edu 域,而数学系的局域网被分配了 maths.groucho.edu。 部门网络上的主机将把此域名附加到它们的主机名上,因此 erdos 将被称为 erdos.maths.groucho.edu。 这被称为完全限定域名 (FQDN),它在全球范围内唯一标识此主机。

图 6-1 显示了命名空间的一部分。 此树根目录处的条目,用单个点表示,非常恰当地称为根域,它包含所有其他域。 为了表明主机名是完全限定域名,而不是相对于某些(隐式)本地域的名称,有时会在其末尾写一个点。 此点表示名称的最后一个组件是根域。

图 6-1. 域命名空间的一部分

根据域在名称层次结构中的位置,域可以称为顶级域、二级域或三级域。 还会出现更多级别的细分,但很少见。 此列表详细列出了您可能经常看到的几个顶级域

描述
edu

(主要是美国)教育机构,如大学。

com

商业组织和公司。

org

非商业组织。 私有 UUCP 网络通常在此域中。

net

网络上的网关和其他管理主机。

mil

美国军事机构。

gov

美国政府机构。

uucp

官方上,所有以前用作没有域的 UUCP 名称的站点名称都已移至此域。

从历史上看,这些域中的前四个被分配给了美国,但最近的政策变化意味着这些域,被称为全球顶级域 (gTLD),现在被认为是全球性的。 目前正在进行谈判以扩大 gTLD 的范围,这可能会在未来增加选择。

在美国境外,每个国家/地区通常使用自己的顶级域,该域名以 ISO-3166 中定义的两位字母国家/地区代码命名。 例如,芬兰使用 fi 域; 法国使用 fr,德国使用 de,澳大利亚使用 au。 在此顶级域之下,每个国家/地区的 NIC 都可以自由地以他们想要的任何方式组织主机名。 澳大利亚具有类似于国际顶级域的二级域,名为 com.auedu.au。 其他国家/地区(如德国)不使用这个额外的级别,但名称稍长,直接指向运行特定域的组织。 看到像 ftp.informatik.uni-erlangen.de 这样的主机名并不少见。 这可以归因于德国效率。

当然,这些国家/地区域并不意味着该域下的主机实际上位于该国家/地区; 它仅表示该主机已在该国家/地区的 NIC 注册。 一家瑞典制造商可能在澳大利亚设有分支机构,但仍将其所有主机注册在 se 顶级域下。

以域名层次结构组织命名空间很好地解决了名称唯一性的问题; 使用 DNS,主机名只需在其域内唯一即可,从而使其名称与全球所有其他主机不同。 此外,完全限定名称易于记忆。 就其本身而言,这些已经是将大型域拆分为多个子域的非常好的理由。

DNS 为您做的远不止这些。 它还允许您将子域的权限委派给其管理员。 例如,格劳乔计算中心的维护人员可能会为每个部门创建一个子域; 我们已经在上面遇到了 mathphysics 子域。 当他们发现物理系的网路太大且混乱,无法从外部管理时(毕竟,众所周知物理学家是一群不守规矩的人),他们可以简单地将 physics.groucho.edu 域的控制权移交给该网络的管理员。 这些管理员可以自由使用他们喜欢的任何主机名,并以他们想要的任何方式从他们的网络中分配 IP 地址,而不会受到外部干扰。

为此,命名空间被划分为区域,每个区域都以域为根。 请注意区域之间的细微差别:域 groucho.edu 包含格劳乔·马克思大学的所有主机,而区域 groucho.edu 仅包含由计算中心直接管理的主机; 例如,数学系的主机。 物理系的主机属于不同的区域,即 physics.groucho.edu。 在图 6-1 中,区域的开始用域名右侧的小圆圈标记。

6.2.1. 使用 DNS 进行名称查找

乍一看,所有这些域和区域的繁琐操作似乎使名称解析变得非常复杂。 毕竟,如果没有中央机构控制将哪些名称分配给哪些主机,那么一个不起眼的应用程序又该如何知道呢?

现在到了 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 名称服务器。[1]

当然,名称服务器不会永远保留此信息; 它会在一段时间后丢弃它。 过期时间间隔称为生存时间或 TTL。 DNS 数据库中的每个数据都由负责区域的管理员分配了这样的 TTL。

6.2.2. 名称服务器的类型

对于区域内主机保存所有信息的名称服务器称为该区域的权威服务器,有时也称为主名称服务器。 对该区域内主机的任何查询都将最终到达这些主名称服务器之一。

主服务器必须相当同步。 因此,区域的网络管理员必须将其中一个设为服务器,该服务器从数据文件加载其区域信息,并将其他服务器设为辅助服务器,这些服务器定期从主服务器传输区域数据。

拥有多个名称服务器可以分担工作负载; 它还提供备份。 当一台名称服务器机器以良性方式发生故障时,例如崩溃或失去网络连接,所有查询都将回退到其他服务器。 当然,此方案不能保护您免受服务器故障的影响,这些故障会对所有 DNS 请求产生错误的回复,例如服务器程序本身中的软件错误。

您还可以运行一个对任何域都不具有权威性的名称服务器。[2] 这很有用,因为名称服务器仍然能够为本地网络上运行的应用程序执行 DNS 查询并缓存信息。 因此,它被称为仅缓存服务器。

6.2.3. DNS 数据库

我们已经看到,DNS 不仅处理主机的 IP 地址,还交换有关名称服务器的信息。 实际上,DNS 数据库可能具有许多不同类型的条目。

来自 DNS 数据库的单条信息称为资源记录 (RR)。 每条记录都有一种类型与之关联,描述它代表的数据种类,以及一个类,指定它适用的网络类型。 后者适应了不同寻址方案的需求,例如 IP 地址(IN 类)、Hesiod 地址(MIT 的 Kerberos 系统使用)以及更多。 原型资源记录类型是 A 记录,它将完全限定域名与 IP 地址关联起来。

一个主机可能以多个名称而闻名。 例如,您可能有一个服务器同时提供 FTP 和万维网服务器,您为其提供两个名称:ftp.machine.orgwww.machine.org。 但是,这些名称之一必须被标识为官方或规范主机名,而其他名称只是指向官方主机名的别名。 区别在于规范主机名是具有关联 A 记录的主机名,而其他主机名只有指向规范主机名的 CNAME 类型的记录。

我们不会在这里介绍所有记录类型,但我们将给您一个简短的示例。 示例 6-4 显示了加载到 physics.groucho.edu 区域的名称服务器中的域数据库的一部分。

示例 6-4. 物理系的 named.hosts 文件摘录

; Authoritative Information on physics.groucho.edu.
@  IN  SOA niels.physics.groucho.edu. janet.niels.physics.groucho.edu. {
                  1999090200       ; serial no
                  360000           ; refresh
                  3600             ; retry
                  3600000          ; expire
                  3600             ; default ttl
                }
;
; Name servers
              IN    NS       niels
              IN    NS       gauss.maths.groucho.edu.
gauss.maths.groucho.edu. IN A 149.76.4.23
;
; Theoretical Physics (subnet 12)
niels         IN    A        149.76.12.1
              IN    A        149.76.1.12
name server    IN    CNAME    niels
otto          IN    A        149.76.12.2
quark         IN    A        149.76.12.4
down          IN    A        149.76.12.5
strange       IN    A        149.76.12.6
...
; Collider Lab. (subnet 14)
boson         IN    A        149.76.14.1
muon          IN    A        149.76.14.7
bogon         IN    A        149.76.14.12
...

除了 A 和 CNAME 记录外,您还可以看到文件顶部的特殊记录,该记录跨越多行。 这是 SOA 资源记录,表示授权起始,其中包含有关服务器对其具有权威性的区域的常规信息。 SOA 记录包括,例如,所有记录的默认生存时间。

请注意,示例文件中所有未以点结尾的名称都应相对于 physics.groucho.edu 域进行解释。 @) 用在SOA记录中使用的特殊名称指的是域名本身。

我们之前已经看到,groucho.edu 域的名称服务器必须以某种方式了解 physics 区域,以便它们可以将查询指向其名称服务器。 这通常通过一对记录来实现:给出服务器 FQDN 的 NS 记录,以及将地址与该名称关联的 A 记录。 由于这些记录是将命名空间结合在一起的要素,因此它们通常被称为粘合记录。 它们是父区域实际保存有关下级区域中主机的信息的唯一记录实例。 指向 physics.groucho.edu 的名称服务器的粘合记录显示在示例 6-5 中。

示例 6-5. GMU 的 named.hosts 文件摘录

 ; Zone data for the groucho.edu zone.
 @  IN  SOA vax12.gcc.groucho.edu. joe.vax12.gcc.groucho.edu. {
                      1999070100       ; serial no
                      360000           ; refresh
                      3600             ; retry
                      3600000          ; expire
                      3600             ; default ttl
               }
 ....
 ;
 ; Glue records for the physics.groucho.edu zone
 physics        IN     NS        niels.physics.groucho.edu.
                IN     NS        gauss.maths.groucho.edu.
 niels.physics  IN     A         149.76.12.1
 gauss.maths    IN     A         149.76.4.23
 ...

6.2.4. 反向查找

查找属于主机的 IP 地址当然是域名系统最常见的用途,但有时您会想要查找与地址对应的规范主机名。 查找此主机名称为反向映射,并且被多个网络服务用于验证客户端的身份。 当使用单个hosts文件时,反向查找只需在文件中搜索拥有相关 IP 地址的主机即可。 使用 DNS,穷尽搜索命名空间是不可能的。 相反,创建了一个特殊的域 in-addr.arpa,其中包含所有主机的 IP 地址,采用反向点分四组表示法。 例如,IP 地址 149.76.12.4 对应于名称 4.12.76.149.in-addr.arpa。 将这些名称链接到其规范主机名的资源记录类型是 PTR。

创建授权区域通常意味着其管理员可以完全控制他们如何将地址分配给名称。 由于他们通常拥有一个或多个 IP 网络或子网,因此 DNS 区域和 IP 网络之间存在一对多映射。 例如,物理系包含子网 149.76.8.0149.76.12.0149.76.14.0

因此,必须与 physics 区域一起创建 in-addr.arpa 域中的新区域,并将其委派给该部门的网络管理员:8.76.149.in-addr.arpa12.76.149.in-addr.arpa14.76.149.in-addr.arpa。 否则,在对撞机实验室安装新主机将需要他们联系其父域,以将新地址输入到其 in-addr.arpa 区域文件中。

子网 12 的区域数据库显示在示例 6-6 中。 其父区域数据库中相应的粘合记录显示在示例 6-7 中。

示例 6-6. 子网 12 的 named.rev 文件摘录

 ; the 12.76.149.in-addr.arpa domain.
 @  IN  SOA  niels.physics.groucho.edu. janet.niels.physics.groucho.edu. {
                      1999090200 360000 3600 3600000 3600
            }
 2        IN     PTR       otto.physics.groucho.edu.
 4        IN     PTR       quark.physics.groucho.edu.
 5        IN     PTR       down.physics.groucho.edu.
 6        IN     PTR       strange.physics.groucho.edu.

示例 6-7. 网络 149.76 的 named.rev 文件摘录

 ; the 76.149.in-addr.arpa domain.
 @  IN  SOA vax12.gcc.groucho.edu. joe.vax12.gcc.groucho.edu. {
                      1999070100 360000 3600 3600000 3600
                  }
 ...
 ; subnet 4: Mathematics Dept.
 1.4        IN     PTR      sophus.maths.groucho.edu.
 17.4       IN     PTR      erdos.maths.groucho.edu.
 23.4       IN     PTR      gauss.maths.groucho.edu.
 ...
 ; subnet 12: Physics Dept, separate zone
 12         IN     NS       niels.physics.groucho.edu.
            IN     NS       gauss.maths.groucho.edu.
 niels.physics.groucho.edu. IN  A 149.76.12.1
 gauss.maths.groucho.edu. IN  A   149.76.4.23
 ...

in-addr.arpa 系统区域只能创建为 IP 网络的超集。 甚至更严格的限制是这些网络的网络掩码必须在字节边界上。 格劳乔·马克思大学的所有子网的网络掩码均为 255.255.255.0,因此可以为每个子网创建一个 in-addr.arpa 区域。 但是,如果网络掩码改为 255.255.255.128,则不可能为子网 149.76.12.128 创建区域,因为无法告诉 DNS 12.76.149.in-addr.arpa 域已拆分为两个授权区域,主机名分别从 1127128255

注释

[1]

如果信息没有被缓存,那么 DNS 将会像任何其他方法一样低效,因为每次查询都会涉及根名称服务器。

[2]

嗯,几乎是这样。 名称服务器必须至少为 localhost 提供名称服务,并为 127.0.0.1 提供反向查找。