← 返回题目列表

DNS 负缓存是什么?NXDOMAIN 为什么也会被缓存?

中等 第 21 / 27 题 更新于 2026/08/02
DNS缓存NXDOMAIN

简化版

DNS 负缓存是指递归解析器会缓存“查不到”的结果,例如 NXDOMAIN 或没有某类记录的响应。

这样可以避免大量客户端反复查询不存在的域名,减轻权威 DNS 压力。负缓存的时间通常由权威区 SOA 记录中的相关 TTL 控制。

工程上要注意:如果刚创建一个新子域,但之前有人查过并缓存了 NXDOMAIN,短时间内可能仍解析不到。

详细版

负缓存常见结果:

  • NXDOMAIN:域名不存在。
  • NOERROR/NODATA:域名存在,但请求的记录类型不存在。

示例:

dig not-exist.example.com
status: NXDOMAIN

递归解析器可能会缓存这个不存在结果。

如果 5 分钟内你刚好创建了 not-exist.example.com,部分用户仍可能被旧的负缓存影响。

这就是为什么上线新域名前,要提前规划记录,避免先被错误访问产生负缓存。

完整版教学

1. 先说明为什么不存在也要缓存

DNS 缓存不只缓存成功答案。

如果不存在的域名每次都要递归查到权威 DNS,会浪费大量资源。

例如程序拼错域名:

apii.example.com

如果有 10000 个客户端反复查询,权威 DNS 压力会很大。

负缓存的核心价值是把“确定不存在”的结果也临时记住,减少重复查询。

2. NXDOMAIN 和 NODATA 的区别

负响应不只有一种。

响应含义示例
NXDOMAIN域名不存在no-such.example.com
NOERROR/NODATA域名存在但该类型记录不存在AAAA 但只有 A
SERVFAIL查询失败权威不可达或验证失败

严格来说,SERVFAIL 通常不应像 NXDOMAIN 那样长期缓存。

面试中要能区分“名字不存在”和“记录类型不存在”。

3. 负缓存 TTL 从哪里来

负缓存 TTL 通常与权威区的 SOA 记录有关。

示例:

example.com. 3600 IN SOA ns1.example.com. admin.example.com. (
  2026080201 3600 600 604800 300 )

最后的 300 常被用于负缓存相关 TTL。

不同实现还会结合 SOA 本身 TTL 和协议规则计算。

你不一定要背细节,但要知道负缓存不是无限期的。

4. 负缓存对上线有什么影响

假设你准备上线:

new-api.example.com

但记录还没创建前,测试脚本已经大量查询过这个域名。

递归 DNS 缓存了 NXDOMAIN。

你后来创建 A 记录后,部分递归解析器在负缓存过期前仍返回不存在。

这会造成“我已经配置了,为什么有些地方还解析不到”的现象。

5. 如何降低负缓存影响

工程上可以:

  • 提前创建即将上线的 DNS 记录。
  • 上线前避免公开访问未配置域名。
  • 合理设置 SOA negative TTL。
  • 变更前用多个递归 DNS 测试。
  • 对关键域名做灰度和监控。

但已经产生的负缓存不能强制让全网立即消失。

你只能等待缓存过期,或者让客户端换用未缓存该负响应的解析器。

6. 和普通 TTL 的区别

普通 TTL 控制成功记录缓存多久。

负缓存控制失败答案缓存多久。

成功记录:api.example.com -> 1.2.3.4
负响应:missing.example.com -> NXDOMAIN

两者都影响 DNS 变更生效时间。

只是负缓存更容易被忽略,因为大家常以为“没查到就不会缓存”。

7. 常见误区与追问

  • 误区:DNS 只缓存成功解析结果。 NXDOMAIN 等负响应也可能被缓存。
  • 误区:创建记录后全网立刻可见。 如果之前有负缓存,需要等它过期。
  • 误区:NXDOMAIN 和 NODATA 是同一回事。 前者是名字不存在,后者是名字存在但类型记录不存在。
  • 追问:负缓存 TTL 从哪里来? 通常来自权威区 SOA 记录相关字段和 TTL 规则。
  • 追问:SERVFAIL 会长期负缓存吗? 通常不应长期缓存,因为它表示查询失败而不是名字不存在。
  • 追问:上线新域名如何避免负缓存? 提前创建记录,避免先访问未配置域名。

8. 加强记忆

负缓存记成“查不到也会记一会儿”。

DNS 变更里,成功记录 TTL 和失败结果 TTL 都会影响生效体验。