DNS 缓存链
DNS 不是只有一个缓存,而是一条从浏览器到递归解析器、再到上游转发器的多层缓存链;任意一层都可能保留旧答案,因此「清了 Windows 缓存还不行」很正常。
#type / concept
#status / growing
#tech / network
#protocol / dns
[!info] related notes
- 所属 MOC: DNS 知识地图
- 缓存时长: TTL
- 负/失败缓存: 负缓存与失败缓存
- 过期仍可用: Serve Stale
- 解析流程: 一次完整的递归解析
DNS 缓存链
一句话定义
DNS 不是只有一个缓存,而是一条缓存链:每一层都可能保存答案并直接复用,任意一层保留旧数据都会让最终结果「看起来没更新」。
核心机制 / 工作原理
典型缓存链(自近及远):
浏览器缓存
↓
操作系统 DNS 缓存
↓
代理客户端缓存(如 Mihomo/Clash)
↓
家庭路由器缓存
↓
递归解析器缓存
↓
上游转发器缓存
每一层都按 TTL 或自身策略缓存。最末端才是权威服务器(它返回的是权威数据,本身通常不「缓存」别人的答案)。
最小例子 / 最小场景
你改了 anyrouter.top 的 A 记录指向新 IP:
- 远端 Oracle 浏览器很快拿到新 IP(它的解析路径缓存刚好过期)
- 你本地 Chrome 仍连旧 IP(浏览器缓存未过期)
- 清了 Windows 缓存仍不行(Mihomo/路由器/公共 DNS 还缓存着旧值)
边界与易混淆点
- 「清了 Windows DNS 还是不行」不能证明 DNS 没问题:Windows 缓存只是链中一层(见 dns-negative-failure-caching 中关于
Clear-DnsClientCache的范围)。 - 不同层缓存策略不同:浏览器可能缓存更久、代理客户端有自己的 TTL 处理、递归解析器受 TTL + Serve Stale 影响。
- 排障要逐层定位「哪一层给了旧答案」(见 dns-systematic-diagnosis 第一至第四层)。
- 缓存延长错误结果,但通常不是根因——根因往往是「解析路径本身就返回不同答案」(见 why-same-domain-different-ip、dns-wrong-ip-tls-handshake-failure-debug)。