很多人在访问网站时都会遇到这样一种情况:域名刚改过解析,别人已经能正常访问了,自己这边却还是跳到旧服务器,甚至直接打不开。这时候,常常会有人建议“清一下 DNS 缓存”。但 DNS 缓存到底是什么?浏览器 DNS 缓存和系统 DNS 缓存又有什么区别?为什么有时候清了浏览器缓存还不行?要真正理解这些问题,就需要从 DNS 解析过程本身讲起。
当我们在浏览器地址栏输入一个域名并按下回车时,计算机并不是立刻就去问公网 DNS 服务器“这个域名对应哪个 IP”,而是会经历一整套由近到远的查找流程。这样做的目的只有一个:提高访问速度、减少不必要的网络请求。在这个流程中,DNS 缓存扮演了非常重要的角色,而缓存并不只存在于一个地方,而是分布在多个层级,其中最容易被普通用户感知的,就是浏览器 DNS 缓存和系统 DNS 缓存。
先从浏览器 DNS 缓存说起。现代浏览器为了提升网页加载速度,都会在内部维护一份 DNS 缓存。当你第一次通过浏览器访问某个域名时,浏览器会发起 DNS 查询,最终得到一个 IP 地址。这个结果不会只用一次,而是会被暂时存储在浏览器内部的缓存中。在接下来的一段时间内,只要你再次访问同一个域名,浏览器就可以直接从自己的缓存里取出 IP 地址,而不必再向操作系统或外部 DNS 服务器查询。
这种缓存机制对于提升体验非常明显。少了一次 DNS 查询,网页就能更快开始建立连接,尤其是在访问频繁的网站时效果更明显。不过,浏览器 DNS 缓存也有它的局限性。首先,不同浏览器之间的缓存是相互独立的。你在 Chrome 里访问过的域名缓存,并不会自动同步到 Edge、Firefox 或其他浏览器中。其次,浏览器缓存的生命周期通常比较短,而且实现方式各不相同。有的浏览器会严格遵循 DNS 返回记录中的 TTL 值,有的则会设置一个内部的上限或下限。
更重要的一点是,浏览器 DNS 缓存只对该浏览器自身有效。如果你使用的是命令行工具,比如 ping、curl,或者某些桌面软件,它们并不会读取浏览器的 DNS 缓存,而是直接依赖操作系统层面的解析结果。这也解释了为什么有时候“浏览器能打开,但 ping 不通”,或者“命令行能解析,但浏览器访问异常”。
接下来再看系统 DNS 缓存。系统 DNS 缓存是操作系统级别的缓存,作用范围比浏览器更广。无论是浏览器、即时通讯软件、更新程序,还是后台服务,只要它们调用的是系统提供的 DNS 解析接口,最终都会受到系统 DNS 缓存的影响。
在 Windows 系统中,DNS Client 服务会负责维护一张 DNS 缓存表。每当系统成功解析一个域名,结果就会被记录下来,并在 TTL 有效期内重复使用。Linux 和 macOS 虽然实现方式不同,但本质类似,都是在本地保存一份解析结果,以减少对外部 DNS 服务器的依赖。
系统 DNS 缓存的优点同样明显。一方面可以显著减少 DNS 查询次数,提升整体网络响应速度;另一方面,在网络不稳定或 DNS 服务器偶尔不可用的情况下,缓存还能保证一部分域名仍然可以正常访问。但与此同时,它也是导致“解析已改但访问不变”问题的常见原因之一。
很多新手会有一个误区,以为 DNS 解析只要在域名控制台改完,立刻就能在所有地方生效。实际上,从权威 DNS 服务器到各级递归 DNS,再到本地系统缓存,整个传播过程是分层的。即便公网 DNS 已经返回了新的 IP,只要本地系统 DNS 缓存中还保留着旧记录,系统就会优先使用缓存结果,而不会主动去重新查询。
浏览器 DNS 缓存和系统 DNS 缓存之间并不是完全对等的关系。通常情况下,浏览器会先查自己的缓存,如果命中,就直接使用;如果未命中,才会向操作系统发起 DNS 查询请求。操作系统在收到请求后,又会先查系统 DNS 缓存,如果命中,直接返回结果;如果未命中,才会继续向配置的 DNS 服务器查询。也就是说,浏览器缓存是在系统缓存之上的一层“子缓存”。
正因为这种层级结构,才会出现一些看似奇怪但其实合理的现象。比如,你清空了系统 DNS 缓存,却发现浏览器访问还是走的旧 IP,这是因为浏览器内部的 DNS 缓存还没有过期;反过来,你只重启了浏览器,发现问题解决了,其实是浏览器缓存被清空,而系统缓存本身并没有变化。
在实际使用中,什么时候需要关注浏览器 DNS 缓存,什么时候需要关注系统 DNS 缓存,取决于问题表现。如果只有某一个浏览器访问异常,而换一个浏览器立刻正常,通常优先怀疑浏览器自身的 DNS 缓存或浏览器扩展的影响。如果所有浏览器、软件访问同一个域名都异常,但换一台电脑就没问题,那么系统 DNS 缓存或本地 DNS 配置就是重点排查对象。
对于站长和运维人员来说,理解这两级缓存尤为重要。比如在网站迁移服务器、切换 CDN、修改解析记录时,经常会遇到“我这边已经切好了,但客户那边还在访问旧站点”的情况。很多时候,并不是 DNS 配置错误,而是客户本地的系统 DNS 缓存尚未刷新。这种情况下,与其反复检查服务器配置,不如引导用户刷新 DNS 缓存,或者耐心等待 TTL 过期。
需要注意的是,DNS 缓存并不总是完全按照 TTL 行事。不同操作系统、不同浏览器在实现上都有细微差别,有时会存在最小缓存时间或最大缓存时间的限制。这也是为什么即便 TTL 设置得很短,仍然可能有少量用户在较长时间内访问到旧 IP。
从安全角度来看,DNS 缓存同样是一把双刃剑。合理的缓存可以提升性能,但如果缓存被污染或劫持,也会导致用户被引导到错误的服务器。因此,操作系统和浏览器都会对 DNS 缓存的来源和有效性做一定校验,并提供刷新或清空缓存的能力,以便在出现异常时进行修复。
总结来看,浏览器 DNS 缓存更偏向于提升单个浏览器的访问效率,作用范围小、更新快,但独立性强;系统 DNS 缓存则是整个系统的基础设施,影响面更广,稳定性更高,但一旦出现问题,表现也会更“顽固”。只有把这两者的作用范围和优先级理清楚,才能在遇到解析相关问题时,快速判断问题出在哪一层,而不是盲目操作。
CN
EN