缓存不是权威数据本身
DNS 缓存是对已获得解析信息的暂存与复用机制。权威服务器管理某个区域的数据,递归解析器则可把查询所得答案和委派信息保留下来,服务后续请求。缓存中的副本并不因被很多人使用,就成为该区域的权威来源。缓存还不只记录“域名对应哪个地址”,不同记录类型及不存在的结果都有各自的含义。
终端的系统解析组件和浏览器也可能在自己的解析路径中保留结果。是否采用独立缓存、保留多久,受实现和配置影响;不能假定所有请求都经过完全相同的层级。浏览器保存解析结果,与它缓存网页、图片等 HTTP 内容也是两件事,清除网页文件不必然清除域名解析状态。
参考:[1]
用一次记录变更追踪有效期
TTL 以秒表示资源记录在再次咨询来源前可以复用的时间,缓存通常需要随时间递减这一数值。它是上限而非最低保留承诺,记录可能因容量或管理策略提前被清除。TTL 为零的记录只能用于当前事务,不应按普通有效记录继续缓存。
假设递归解析器在第 0 秒取得某地址记录,TTL 为 300 秒,第 60 秒权威端把地址从 A 改成 B。在没有提前刷新等额外行为的普通缓存路径中,第 100 秒的客户端仍可能收到 A 及约 200 秒的剩余 TTL。若下游继续缓存,它应依据收到的剩余时间,而不是又把期限重置为原始的 300 秒。
这说明修改权威记录不是向全球缓存广播删除命令。用户清除本机缓存后重新查询,上游解析器仍可能返回有效期内的 A;另一个较晚查询的解析器则可能已取得 B。所谓更新传播时间,不能笼统理解为一只全球共用的倒计时。
不存在与解析失败要分开
负缓存减少对不存在数据的反复询问。NXDOMAIN 表示查询的名称不存在,NODATA 表示名称下没有所请求类型的数据,二者不能混为一谈。例如没有 IPv6 地址记录,并不说明同名的 IPv4 地址记录也不存在。
RFC 2308 规定,相关权威否定回答应携带区域的 SOA 记录,其负缓存 TTL 由 SOA 自身 TTL 与 SOA.MINIMUM 字段的较小值确定。缓存转答时还要递减该期限。于是刚创建的域名或记录,可能暂时仍受到先前否定缓存影响,这与正面答案迟迟不更新是两种不同现象。
超时、服务器失败或 DNSSEC 验证失败,则不能作为名称不存在的证明。2023 年的 RFC 9520 要求缓存解析失败,以抑制无效的重复上游查询,期限至少 1 秒、不得超过 5 分钟。这个失败缓存上限并不是所有 NXDOMAIN 或正常资源记录共同的 TTL。
过期数据的受控例外
普通有效期结束后,解析器应重新取得数据;但不能据此断言所有实现必定立即物理删除每一条记录。RFC 8767 的 serve-stale 机制允许在无法从权威端刷新时,按策略使用保留的过期数据,以缓解服务中断。返回过期记录时,报文中的 TTL 必须大于零,规范建议使用 30 秒。
这是一种在可用性与新鲜度之间的受控取舍,不表示旧记录重新获得了权威认可,也不是可以永远忽略更新。诊断 DNS 缓存问题时,应分清回答来自哪个解析环节、属于正面数据还是否定或失败状态,以及是否启用过期服务;只说“刷新一下缓存”,不足以解释所有持续出现的旧结果。