负缓存与失败缓存
DNS 不只缓存成功结果,也缓存「不存在」(NXDOMAIN / NODATA)和部分失败的短暂结果(如 SERVFAIL、DNSSEC 验证失败),以避免反复冲击权威服务器。
#type / concept
#status / growing
#tech / network
#protocol / dns
[!info] related notes
- 所属 MOC: DNS 知识地图
- 正常缓存: TTL / DNS 缓存链
- 过期仍可用: Serve Stale
- 排障: 系统化 DNS 诊断流程
负缓存与失败缓存
一句话定义
DNS 不仅会缓存成功答案,还会缓存**「不存在」和部分失败**的短暂结果,以减少无效重复查询对权威服务器的冲击。
核心机制 / 工作原理
正缓存(回顾)
anyrouter.top → 155.102.x.x
负缓存
- NXDOMAIN:整个域名不存在。例如查
no-such-name.example且确认其父域没有该名。 - NODATA:名称存在,但没有请求的类型记录。例如
example.com存在,但查example.com AAAA时没有 AAAA 记录。
负结果的缓存时长由权威 SOA 记录里的相关字段控制(如 NXDOMAIN TTL、minimum)。
失败缓存
现代规范(如 RFC 2308、相关最佳实践)要求解析器对部分解析失败做短暂缓存,包括:
- 某些 SERVFAIL(递归解析器自身或上游出错)
- DNSSEC 验证失败(签名不对)
避免客户端不断重试,把已经出问题的权威冲垮。
最小例子 / 最小场景
你刚修好权威 DNS 配置,但部分递归解析器仍报 SERVFAIL——很可能它们在短暂缓存「验证失败/上游错」,要等这个小窗口过去才恢复。
边界与易混淆点
- 「刚修好权威 ≠ 所有递归立刻恢复」:负/失败缓存会让旧错误延续一小段时间(这也解释了为什么排障时常要等几分钟再复测)。
- 负缓存让「域名刚注册/刚加记录却查不到」可能只是 NXDOMAIN 还在缓存——需等负缓存过期或换未缓存的解析器验证。
- Windows 的
Clear-DnsClientCache只清本机系统缓存,不清递归解析器/上游的负缓存(见 dns-caching-hierarchy)。 - 失败缓存是「可用性保护」,不应被当作永久错误;诊断时要区分「真错误」与「缓存中的旧错误」(见 dns-systematic-diagnosis)。