DNS 缓存是域名系统(Domain Name System)中一项极其重要的性能优化机制。简单来说,它会把已经查询过的域名与对应 IP 地址的映射关系,暂时保存在某个位置,以便下一次查询同一个域名时,无需再次向远端 DNS 服务器发出请求,直接返回本地缓存的结果。


一、为什么需要 DNS 缓存?

如果没有缓存,每次访问 www.baidu.com 都要从根域开始层层递归查询(根域 → .com 域 → 百度权威域),耗时可能达到数十毫秒甚至上百毫秒。而有了缓存:

  • 速度提升:本地读取缓存只需几毫秒,网页打开更快。

  • 减少网络负担:避免大量重复的 DNS 查询报文在网络中传输。

  • 降低权威服务器压力:使 DNS 系统能够支撑全球数十亿台设备的访问。


二、缓存存储在哪里?(层级)

缓存层级 位置 作用范围
浏览器 DNS 缓存 浏览器进程内存 仅对当前浏览器实例有效,关闭浏览器通常清空
操作系统 DNS 缓存 操作系统(Windows、Linux、macOS) 对该主机上所有应用有效
本地 DNS 服务器缓存 路由器、企业网关或 ISP 的递归解析器 对同一网络下的所有用户有效

最常见的排查场景:清理 操作系统 DNS 缓存


三、缓存的控制参数:TTL

TTL(Time To Live,生存时间)是由域名的权威 DNS 服务器设定的一个时间值(单位:秒),表示这条记录可以被缓存多久。

例如:example.com 的 A 记录的 TTL = 600 秒,意味着:

  • 递归服务器或操作系统拿到结果后,会在接下来的 600 秒内直接使用缓存结果。

  • 600 秒后,缓存过期,必须重新查询。

TTL 的权衡

  • 短 TTL(如 30~300 秒):适合经常变动的 IP(如灾备切换、负载均衡),但增加 DNS 查询量。

  • 长 TTL(如 86400 秒 = 24 小时):大幅减少查询,适合稳定的域名,但域名更改后需要漫长等待。


四、不同操作系统如何操作 DNS 缓存?

操作系统 查看缓存 清除缓存
Windows ipconfig /displaydns ipconfig /flushdns
macOS (较新) sudo dscacheutil -statistics sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder
Linux 默认无本地缓存,部分系统用 systemd-resolve --statistics sudo systemd-resolve --flush-caches

五、缓存的安全隐患:DNS 缓存投毒

攻击者可以向递归 DNS 服务器注入伪造的响应,让正常域名被缓存为恶意 IP,从而将用户诱导到钓鱼网站。

经典案例:2008 年 Kaminsky 漏洞攻击,攻击者通过猜测 TXID(事务 ID)快速污染缓存。

防御措施

  • 使用 DNSSEC(域名系统安全扩展),对 DNS 响应进行数字签名。

  • 递归服务器采用随机源端口 + 随机 TXID,增加猜测难度。


六、如何验证 DNS 缓存生效?

  1. 首次查询:dig www.baidu.com → 看到 Query time: 43 msec

  2. 再次查询(5 秒内):dig www.baidu.com → 看到 Query time: 0 msec,说明命中了本地递归服务器的缓存。

也可以用 dig +trace 强制绕过缓存,观察完整查询过程。


七、总结:一张图理解 DNS 缓存流程

用户访问 baidu.com
       ↓
浏览器缓存 → 有记录 → 直接返回 IP
       ↓ 无
操作系统缓存 → 有记录 → 返回 IP
       ↓ 无
本地 DNS 服务器缓存 → 有记录 → 返回 IP
       ↓ 无
递归查询权威 DNS 服务器 → 获取结果并缓存(按 TTL)

一句话记住:DNS 缓存就像把查过的电话号码写在便签上,下次直接用,不用再翻电话本。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐