Skip to main content

2. Introduction (简介)

2. Introduction (简介)

2.1. Overview (概述)

域名 (domain names) 的目标是提供一种命名资源的机制, 使这些名称可以在不同的主机 (hosts)、网络 (networks)、协议族 (protocol families)、互联网 (internets) 和管理组织 (administrative organizations) 中使用。

从用户的角度来看, 域名作为参数传递给本地代理 (local agent), 该代理称为解析器 (resolver), 它检索与域名关联的信息。因此, 用户可能会请求与特定域名关联的主机地址或邮件信息。为了使用户能够请求特定类型的信息, 适当的查询类型 (query type) 与域名一起传递给解析器。对于用户来说, 域树 (domain tree) 是一个单一的信息空间 (information space); 解析器负责向用户隐藏名称服务器 (name servers) 之间数据分布的情况。

从解析器的角度来看, 组成域空间 (domain space) 的数据库分布在各个名称服务器中。域空间的不同部分存储在不同的名称服务器中, 尽管特定的数据项会冗余地 (redundantly) 存储在两个或更多名称服务器中。解析器开始时至少知道一个名称服务器。当解析器处理用户查询时, 它向已知的名称服务器请求信息; 作为回报, 解析器要么接收所需的信息, 要么接收对另一个名称服务器的引用 (referral)。使用这些引用, 解析器了解其他名称服务器的标识和内容。解析器负责处理域空间的分布, 并通过查询其他服务器中的冗余数据库来处理名称服务器故障的影响。

名称服务器管理两种数据。第一种数据保存在称为区域 (zones) 的集合中; 每个区域是域空间特定"修剪过的" (pruned) 子树的完整数据库。这些数据称为权威数据 (authoritative)。名称服务器定期检查以确保其区域是最新的, 如果不是, 则从本地存储的主文件 (master files) 或另一个名称服务器获取更新区域的新副本。第二种数据是由本地解析器获取的缓存数据 (cached data)。这些数据可能不完整, 但在重复访问非本地数据时可以提高检索过程的性能。缓存数据最终会通过超时机制 (timeout mechanism) 被丢弃。

这种功能结构将用户界面 (user interface)、故障恢复 (failure recovery) 和分布的问题隔离在解析器中, 并将数据库更新和刷新问题隔离在名称服务器中。

2.2. Common configurations (常见配置)

主机可以通过多种方式参与域名系统, 具体取决于主机是否运行从域名系统检索信息的程序、响应来自其他主机查询的名称服务器, 或这两种功能的各种组合。最简单且可能是最典型的配置如下所示:

             Local Host                        |  Foreign
|
+---------+ +----------+ | +--------+
| | user queries | |queries | | |
| User |-------------->| |---------|->|Foreign |
| Program | | Resolver | | | Name |
| |<--------------| |<--------|--| Server |
| | user responses| |responses| | |
+---------+ +----------+ | +--------+
| A |
cache additions | | references |
V | |
+----------+ |
| cache | |
+----------+ |

用户程序通过解析器与域名空间交互; 用户查询和用户响应的格式特定于主机及其操作系统。用户查询通常是操作系统调用 (operating system calls), 解析器及其缓存将是主机操作系统的一部分。功能较弱的主机可能选择将解析器实现为子例程 (subroutine), 以链接到需要其服务的每个程序中。解析器通过向外部名称服务器查询和本地缓存获取的信息来回答用户查询。

请注意, 解析器可能必须向几个不同的外部名称服务器发出多个查询才能回答特定的用户查询, 因此用户查询的解析可能涉及多次网络访问和任意长的时间。对外部名称服务器的查询和相应的响应具有本备忘录中描述的标准格式, 并且可能是数据报 (datagrams)。

根据其能力, 名称服务器可以是专用机器上的独立程序, 也可以是大型分时主机上的一个或多个进程。简单的配置可能是:

             Local Host                        |  Foreign
|
+---------+ |
/ /| |
+---------+ | +----------+ | +--------+
| | | | |responses| | |
| | | | Name |---------|->|Foreign |
| Master |-------------->| Server | | |Resolver|
| files | | | |<--------|--| |
| |/ | | queries | +--------+
+---------+ +----------+ |

在这里, 主名称服务器 (primary name server) 通过从其本地文件系统读取主文件来获取有关一个或多个区域的信息, 并回答来自外部解析器的有关这些区域的查询。

DNS 要求所有区域必须由多个名称服务器冗余支持。指定的辅助服务器 (secondary servers) 可以使用 DNS 的区域传输协议 (zone transfer protocol) 从主服务器获取区域并检查更新。此配置如下所示:

             Local Host                        |  Foreign
|
+---------+ |
/ /| |
+---------+ | +----------+ | +--------+
| | | | |responses| | |
| | | | Name |---------|->|Foreign |
| Master |-------------->| Server | | |Resolver|
| files | | | |<--------|--| |
| |/ | | queries | +--------+
+---------+ +----------+ |
A |maintenance | +--------+
| +------------|->| |
| queries | |Foreign |
| | | Name |
+------------------|--| Server |
maintenance responses | +--------+

在此配置中, 名称服务器定期建立与外部名称服务器的虚拟电路 (virtual circuit) 以获取区域的副本或检查现有副本是否未更改。为这些维护活动发送的消息遵循与查询和响应相同的形式, 但消息序列有所不同。

支持域名系统所有方面的主机中的信息流如下所示:

             Local Host                        |  Foreign
|
+---------+ +----------+ | +--------+
| | user queries | |queries | | |
| User |-------------->| |---------|->|Foreign |
| Program | | Resolver | | | Name |
| |<--------------| |<--------|--| Server |
| | user responses| |responses| | |
+---------+ +----------+ | +--------+
| A |
cache additions | | references |
V | |
+----------+ |
| Shared | |
| database | |
+----------+ |
A | |
+---------+ refreshes | | references |
/ /| | V |
+---------+ | +----------+ | +--------+
| | | | |responses| | |
| | | | Name |---------|->|Foreign |
| Master |-------------->| Server | | |Resolver|
| files | | | |<--------|--| |
| |/ | | queries | +--------+
+---------+ +----------+ |
A |maintenance | +--------+
| +------------|->| |
| queries | |Foreign |
| | | Name |
+------------------|--| Server |
maintenance responses | +--------+

共享数据库 (shared database) 为本地名称服务器和解析器保存域空间数据。共享数据库的内容通常是由名称服务器定期刷新操作维护的权威数据和来自先前解析器请求的缓存数据的混合。域数据的结构以及名称服务器和解析器之间同步的必要性暗示了此数据库的一般特征, 但实际格式取决于本地实现者。

信息流也可以定制, 以便一组主机协同工作以优化活动。有时这样做是为了减轻功能较弱的主机的负担, 使它们不必实现完整的解析器。这对于希望最小化所需新网络代码量的 PC 或主机可能是合适的。此方案还可以允许一组主机共享少量缓存, 而不是维护大量单独的缓存, 前提是集中式缓存将具有更高的命中率 (hit ratio)。在任何一种情况下, 解析器都被替换为存根解析器 (stub resolvers), 它们充当位于一个或多个已知执行该服务的名称服务器中的递归服务器 (recursive server) 中的解析器的前端:

               Local Hosts                     |  Foreign
|
+---------+ |
| | responses |
| Stub |<--------------------+ |
| Resolver| | |
| |----------------+ | |
+---------+ recursive | | |
queries | | |
V | |
+---------+ recursive +----------+ | +--------+
| | queries | |queries | | |
| Stub |-------------->| Recursive|---------|->|Foreign |
| Resolver| | Server | | | Name |
| |<--------------| |<--------|--| Server |
+---------+ responses | |responses| | |
+----------+ | +--------+
| Central | |
| cache | |
+----------+ |

无论如何, 请注意, 只要可能, 域组件始终会为了可靠性而被复制。

2.3. Conventions (约定)

域名系统有几个处理低级但基本问题的约定。虽然实现者可以在其自己的系统内自由违反这些约定, 但他必须在从其他主机观察到的所有行为中遵守这些约定。

2.3.1. Preferred name syntax (首选名称语法)

DNS 规范尝试在构造域名的规则中尽可能通用。其想法是任何现有对象的名称都可以用最少的更改表示为域名。

然而, 在为对象分配域名时, 谨慎的用户将选择一个同时满足域名系统规则和对象的任何现有规则的名称, 无论这些规则是已发布的还是由现有程序暗示的。

例如, 在命名邮件域时, 用户应同时满足本备忘录的规则和 RFC-822 中的规则。在创建新主机名时, 应遵循 HOSTS.TXT 的旧规则。这样可以避免在旧软件转换为使用域名时出现问题。

以下语法将导致使用域名的许多应用程序 (例如, 邮件 (mail)、TELNET) 出现更少的问题。

<domain> ::= <subdomain> | " "

<subdomain> ::= <label> | <subdomain> "." <label>

<label> ::= <letter> [ [ <ldh-str> ] <let-dig> ]

<ldh-str> ::= <let-dig-hyp> | <let-dig-hyp> <ldh-str>

<let-dig-hyp> ::= <let-dig> | "-"

<let-dig> ::= <letter> | <digit>

<letter> ::= any one of the 52 alphabetic characters A through Z in
upper case and a through z in lower case

<digit> ::= any one of the ten digits 0 through 9

请注意, 虽然域名中允许大写和小写字母, 但不重视大小写。也就是说, 拼写相同但大小写不同的两个名称应被视为相同。

标签必须遵循 ARPANET 主机名的规则。它们必须以字母开头, 以字母或数字结尾, 并且内部字符只能是字母、数字和连字符 (hyphen)。长度也有一些限制。标签必须为 63 个字符或更少。

例如, 以下字符串标识 Internet 中的主机:

A.ISI.EDU XX.LCS.MIT.EDU SRI-NIC.ARPA

2.3.2. Data Transmission Order (数据传输顺序)

本文档中描述的头部和数据的传输顺序在八位字节 (octet) 级别上得到解决。每当图表显示一组八位字节时, 这些八位字节的传输顺序是它们以英语阅读的正常顺序。例如, 在下图中, 八位字节按编号顺序传输。

 0                   1
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 1 | 2 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 3 | 4 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 5 | 6 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

每当一个八位字节表示一个数值时, 图表中最左边的位是高位或最高有效位 (most significant bit)。也就是说, 标记为 0 的位是最高有效位。例如, 下图表示值 170 (十进制)。

 0 1 2 3 4 5 6 7
+-+-+-+-+-+-+-+-+
|1 0 1 0 1 0 1 0|
+-+-+-+-+-+-+-+-+

类似地, 每当多八位字节字段表示一个数值时, 整个字段的最左边的位是最高有效位。当传输多八位字节数量时, 首先传输最高有效八位字节。

2.3.3. Character Case (字符大小写)

对于 DNS 中作为官方协议一部分的所有部分, 字符串 (例如, 标签、域名等) 之间的所有比较都以不区分大小写 (case-insensitive) 的方式进行。目前, 此规则在整个域名系统中毫无例外地执行。但是, 未来超出当前使用范围的添加可能需要在名称中使用完整的二进制八位字节功能, 因此应避免尝试以 7 位 ASCII 存储域名或使用特殊字节终止标签等。

当数据进入域名系统时, 应尽可能保留其原始大小写。在某些情况下无法做到这一点。例如, 如果两个 RR 存储在数据库中, 一个在 x.y, 一个在 X.Y, 它们实际上存储在数据库中的同一位置, 因此只会保留一种大小写。基本规则是, 只有在数据用于定义数据库中的结构时才能丢弃大小写, 并且以不区分大小写的方式比较时两个名称相同。

必须最小化大小写敏感数据的丢失。因此, 虽然 x.y 和 X.Y 的数据都可以存储在单个位置 x.y 或 X.Y 下, 但 a.x 和 B.X 的数据永远不会存储在 A.x、A.X、b.x 或 b.X 下。一般来说, 这保留了域名第一个标签的大小写, 但强制内部节点标签的标准化。

在向域数据库输入数据的系统管理员如果其系统区分大小写, 应注意以大小写一致的方式表示他们向域名系统提供的数据。域名系统中的数据分发系统将确保保留一致的表示。

2.3.4. Size limits (大小限制)

DNS 中的各种对象和参数都有大小限制。它们在下面列出。有些可以轻易更改, 有些则更基本。

对象限制
labels (标签)63 个八位字节或更少
names (名称)255 个八位字节或更少
TTL带符号 32 位数的正值
UDP messages (UDP 消息)512 个八位字节或更少