2. 规则 (Rules)
当迭代式缓存 DNS 解析器收到 NXDOMAIN 响应时, 它 SHOULD 将该响应存入缓存, 随后位于该节点及其下方的所有名称和资源记录集 (Resource Record Set, RRset) SHOULD 被视为不可到达. 对这些名称的后续查询 SHOULD 得到 NXDOMAIN 响应.
但是, 如果解析器在 NXDOMAIN cut 之下已经缓存了数据, 它 MAY 继续将这些数据作为回复发送 (直到这些缓存数据的 TTL 过期), 因为这可以在收到查询时避免额外处理. 第 6 节对此提供了更多信息.
另一个例外是, 验证型解析器 MAY 决定仅在 NXDOMAIN 响应已通过 DNSSEC 验证时, 才实现 "NXDOMAIN cut" 行为 (本节第一段所述). 理由见第 7 节.
某个子树不存在这一事实并非永久有效: [RFC2308] 第 3 节已经描述了 NXDOMAIN 响应可以被缓存的时间, 即"否定 TTL (negative TTL)".
如果由于已缓存不存在性而产生的 NXDOMAIN 响应来自 DNSSEC 签名区域, 则它会伴随 NSEC 或 NSEC3 记录, 用于认证该名称不存在. 对原始 NXDOMAIN 名称的后代名称而言, 同一组 NSEC 或 NSEC3 记录可以证明该后代名称不存在. 如果触发查询设置了 DNSSEC OK (DO) 位, 则迭代式缓存解析器 MUST 在对该触发查询的响应中返回这些 NSEC 或 NSEC3 记录.
警告: 如果存在 CNAME (或 DNAME) 链, 则不存在的名称是该链的最后一个名称 ([RFC6604]), 而不是 QNAME. 缓存中保存的 NXDOMAIN 针对的是被否定名称, 并不总是针对 QNAME.
作为这些规则后果的示例, 考虑解析器针对不存在域 'foo.example' 的两次连续查询: 第一次查询 'foo.example' (结果为 NXDOMAIN), 第二次查询 'bar.foo.example' (结果同样为 NXDOMAIN). 今天许多解析器会转发这两个查询. 然而, 按照本文档中的规则 ("NXDOMAIN cut"), 解析器会缓存第一个 NXDOMAIN 响应作为不存在性的标志, 然后立即为第二个查询返回 NXDOMAIN 响应, 而不会将其发送给权威服务器.
如果第一个请求是针对 'bar.foo.example', 第二个请求是针对 'baz.foo.example', 则第一个 NXDOMAIN 响应不会说明任何关于 'baz.foo.example' 的信息; 因此, 第二个查询会像未使用 "NXDOMAIN cut" 优化之前那样被发送出去 (见附录 A).