2. 简介
2. 简介
2.1. 概述
域名 (domain names) 的目标是提供一种资源命名机制,使得这些名称可以在不同的主机、网络、协议族、互联网和管理组织中使用。
从用户的角度来看,域名作为传递给本地代理 (称为解析器 resolver) 的参数非常有用,解析器检索与域名相关的信息。因此,用户可能会请求与特定域名相关联的主机地址或邮件信息。为了使用户能够请求特定类型的信息,会将适当的查询类型 (query type) 与域名一起传递给解析器。对用户而言,域树 (domain tree) 是一个单一的信息空间;解析器负责向用户隐藏数据在名称服务器之间的分布情况。
从解析器的角度来看,构成域空间 (domain space) 的数据库分布在各个名称服务器 (name servers) 中。域空间的不同部分存储在不同的名称服务器中,但特定的数据项会在两个或多个名称服务器中冗余存储。解析器从至少一个名称服务器的知识开始。当解析器处理用户查询时,它向已知的名称服务器请求信息;作为回报,解析器要么收到所需的信息,要么收到对另一个名称服务器的引用 (referral)。通过这些引用,解析器了解其他名称服务器的标识和内容。解析器负责处理域空间的分布,并通过查询其他服务器中的冗余数据库来处理名称服务器故障的影响。
名称服务器管理两种数据。第一种数据保存在称为区域 (zones) 的集合中;每个区域是域空间特定"修剪"子树的完整数据库。这些数据称为权威数据 (authoritative data)。名称服务器定期检查以确保其区域是最新的,如果不是,则从本地存储的主文件或另一个名称服务器获取更新区域的新副本。第二种数据是缓存数据 (cached data),由本地解析器获取。这些数据可能不完整,但在重复访问非本地数据时可以提高检索过程的性能。缓存数据最终会通过超时机制被丢弃。
这种功能结构将用户界面、故障恢复和分布问题隔离在解析器中,并将数据库更新和刷新问题隔离在名称服务器中。
2.2. 常见配置
主机可以通过多种方式参与域名系统,具体取决于主机是否运行从域系统检索信息的程序、响应其他主机查询的名称服务器,或两种功能的各种组合。最简单且可能最典型的配置如下所示:
Local Host | Foreign
|
+---------+ +----------+ | +--------+
| | user queries | |queries | | |
| User |-------------->| |---------|->|Foreign |
| Program | | Resolver | | | Name |
| |<--------------| |<--------|--| Server |
| | user responses| |responses| | |
+---------+ +----------+ | +--------+
| A |
cache additions | | references |
V | |
+----------+ |
| cache | |
+----------+ |
用户程序通过解析器与域名空间交互;用户查询和用户响应的格式特定于主机及其操作系统。用户查询通常是操作系统调用,解析器及其缓存将是主机操作系统的一部分。功能较弱的主机可能选择将解析器实现为子例程,链接到需要其服务的每个程序。解析器通过对外部名称服务器的查询和本地缓存获取的信息来回答用户查询。
请注意,解析器可能需要向多个不同的外部名称服务器发出多个查询才能回答特定的用户查询,因此用户查询的解析可能涉及多次网络访问和任意长的时间。对外部名称服务器的查询和相应的响应具有本备忘录中描述的标准格式,可以是数据报 (datagrams)。
根据其能力,名称服务器可以是专用机器上的独立程序,也可以是大型分时主机上的一个或多个进程。一个简单的配置可能是:
Local Host | Foreign
|
+---------+ |
/ /| |
+---------+ | +----------+ | +--------+
| | | | |responses| | |
| | | | Name |---------|->|Foreign |
| Master |-------------->| Server | | |Resolver|
| files | | | |<--------|--| |
| |/ | | queries | +--------+
+---------+ +----------+ |
这里,主名称服务器 (primary name server) 通过从本地文件系统读取主文件 (master files) 来获取有关一个或多个区域的信息,并回答来自外部解析器的有关这些区域的查询。
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 | +--------+
在此配置中,名称服务器定期建立与外部名称服务器的虚拟电路,以获取区域副本或检查现有副本是否已更改。为这些维护活动发送的消息遵循与查询和响应相同的格式,但消息序列有所不同。
支持域名系统所有方面的主机中的信息流如下所示:
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或主机来说可能是合适的。此方案还可以允许一组主机共享少量缓存,而不是维护大量单独的缓存,前提是集中式缓存将具有更高的命中率。在任何一种情况下,解析器都被存根解析器 (stub resolvers) 替换,存根解析器充当位于一个或多个已知执行该服务的名称服务器中的递归服务器中的解析器的前端:
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. 约定
域系统有几个处理低级但基本问题的约定。虽然实现者可以在其自己的系统内自由违反这些约定,但他必须在从其他主机观察到的所有行为中遵守这些约定。
2.3.1. 首选名称语法
DNS规范试图在构造域名的规则中尽可能通用。其思想是,任何现有对象的名称都可以用最少的更改表示为域名。
但是,在为对象分配域名时,谨慎的用户将选择一个既满足域系统规则又满足对象的任何现有规则的名称,无论这些规则是已发布的还是由现有程序暗示的。
例如,在命名邮件域时,用户应同时满足本备忘录和RFC-822中的规则。在创建新主机名时,应遵循HOSTS.TXT的旧规则。这避免了在将旧软件转换为使用域名时出现问题。
以下语法将减少使用域名的许多应用程序(例如邮件、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主机名的规则。它们必须以字母开头,以字母或数字结尾,并且内部字符只能是字母、数字和连字符。长度也有一些限制。标签必须为63个字符或更少。
例如,以下字符串标识Internet中的主机:
A.ISI.EDU XX.LCS.MIT.EDU SRI-NIC.ARPA
2.3.2. 数据传输顺序
本文档中描述的标头和数据的传输顺序解析到八位字节级别。每当图表显示一组八位字节时,这些八位字节的传输顺序是按英语阅读的正常顺序。例如,在下图中,八位字节按编号顺序传输。
0 1
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 1 | 2 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 3 | 4 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 5 | 6 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
每当八位字节表示数值时,图表中最左边的位是高位或最高有效位。也就是说,标记为0的位是最高有效位。例如,下图表示值170(十进制)。
0 1 2 3 4 5 6 7
+-+-+-+-+-+-+-+-+
|1 0 1 0 1 0 1 0|
+-+-+-+-+-+-+-+-+
类似地,每当多八位字节字段表示数值时,整个字段的最左边位是最高有效位。当传输多八位字节数量时,首先传输最高有效的八位字节。
2.3.3. 字符大小写
对于DNS中属于官方协议的所有部分,字符串(例如标签、域名等)之间的所有比较都以不区分大小写的方式完成。目前,此规则在整个域系统中无例外地执行。但是,超出当前用法的未来添加可能需要在名称中使用完整的二进制八位字节功能,因此应避免尝试以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. 大小限制
DNS中的各种对象和参数都有大小限制。它们列在下面。有些可以轻松更改,有些则更基本。
| Object | Limit |
|---|---|
| labels | 63个八位字节或更少 |
| names | 255个八位字节或更少 |
| TTL | 带符号32位数字的正值 |
| UDP messages | 512个八位字节或更少 |