1. 引言和背景 (Introduction and Background)
DNS 协议 [RFC1035] 将响应码 3 定义为 "Name Error", 即 "NXDOMAIN" [RFC2308], 表示被查询的域名在 DNS 中不存在. 由于域名被表示为标签树 ([RFC1034] 第 3.1 节), 某个节点不存在就意味着以该节点为根的整个子树都不存在.
DNS 迭代解析算法正是以这种方式解释 NXDOMAIN 信号. 如果它遇到来自权威服务器的 NXDOMAIN 响应码, 就会立即停止迭代, 并将 NXDOMAIN 响应返回给查询方.
然而, 在今天已知的大多数现有解析器中, 某个域的已缓存不存在性并不被视为"证明"其下不可能存在子域. 这是因为 [RFC1034] 存在歧义, 未能区分空非终端 (Empty Non-Terminal, ENT) 名称 ([RFC7719]) 和不存在名称 (第 3.1 节). 对于提供不存在性证明的 DNSSEC 的发展来说, 这种区分变得尤其重要. [RFC4035] 第 3.1.3.2 节描述了具备安全感知能力的权威名称服务器如何进行区分, 但现有 RFC 尚未描述递归名称服务器的行为.
本文档规定, 对某个域名返回的 NXDOMAIN 响应意味着被查询名称之下也不存在任何子域; 进一步说, DNS 解析器应以这种方式解释已缓存的不存在性. 由于域名按树结构组织, 这是树结构的一个简单结果: 某个节点不存在, 就意味着以该节点为根的整个子树不存在.
1.1. 术语 (Terminology)
本文档中的关键词 "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY" 和 "OPTIONAL" 应按 [RFC2119] 中的描述解释.
"QNAME": 定义于 [RFC1034] 和 [RFC1035] 第 4.1.2 节, 但由于 [RFC2308] 给出了不同定义, 这里重复原始定义: QNAME 是问题部分 (question section) 中的域名.
"被否定名称 (Denied name)": 其存在性被 RCODE 为 NXDOMAIN 的响应否定的域名. 在大多数情况下它就是 QNAME, 但由于 [RFC6604], 并不总是如此.
其他术语定义于 [RFC1034], [RFC1035], 以及较新的 [RFC7719] 中, NXDOMAIN 本身也是如此.
从概念上说, 域名空间以树结构定义. DNS 解析器/缓存的实现 MAY 使用树或其他数据结构. 由于缓存是域名空间中数据的一个子集, 按树结构对其进行推理并用这些术语描述会容易得多, 例如上方/下方名称、后代名称、子树等. 实际上, [RFC1034] 中的 DNS 算法描述甚至假定缓存是树结构, 因而已有明确先例: 见其第 4.3.2 节, 其中写道 "The following algorithm assumes that the RRs are organized in several tree structures, one for each zone, and another for the cache..." 因此, 在本文档中, 每当我们谈到树或树操作时, 指的都是模型, 而不是实际实现.