程序员肖邦的博客 享受编程和技术所带来的快乐

关于DNS系统中缓存的知识点

2018-12-11
肖邦

有句话说的好,有 DNS 的地方就有缓存,这句话也充分说明了 DNS 缓存的重要性,无处不在。其实缓存这个东西,本身是一把双刃剑,在提高系统性能的同时,也可能会带来很多问题和困扰。

DNS缓存

首先我们要知道平时跟 DNS 打交道时,DNS 的整个工作流程是怎样的?

浏览器输入网址 -> 本机缓存 -> LocalDNS -> 权威 DNS -> 返回 IP 地址

其中,浏览器、操作系统、LocalDNS 都会有一定的缓存机制。这里总结下各种缓存的相关事项。

操作系统的缓存

  • Linux 操作系统默认是没有缓存的
  • IOS 设备上每 24 小时刷新一次 DNS 缓存。
  • MAC 系统会严格遵循 DNS 协议中的 TTL。
  • Windows DNS 缓存的默认值是 MaxCacheTTL,它的默认值是86400s,也就是一天

浏览器

  • 浏览器的缓存时间与 TTL 没有关系,每种浏览器都有各自固定的缓存时间
  • Chrome 对每个域名会默认缓存 60s。通过 chrome://net-internals/#dns 可以查看。
  • IE 将 DNS 缓存 30min。
  • Firefox 有 DNS 缓存功能,默认缓存时间只有 60s
  • safari 浏览器缓存时间大约为 10s
  • 浏览器对 DNS 解析结果的处理,如果一个域名的 DNS 解析结果会有多个记录的话,浏览器是如何处理的呢?Chrome 浏览器会优先向第一个 IP 发起 HTTP 请求,如果不通,再向后面的 IP 发起 HTTP 请求

运营商 LocalDNS 的缓存

运营商 LocalDNS 在接收到用户请求时,如果本地没有缓存记录或缓存过期,就会递归向权威服务器获取,获取到资源记录后返回给用户,并将本条资源记录存储到本地缓存,并会随着时间的推移,TTL 值会不断变小,直到过期前用户请求的数据都是从缓存中直接返回的。

一般运营商为了提高系统的性能,避免频繁去递归权威服务器,因此通常运营商都会增大权威 DNS 设置的 TTL 值,从而减少递归次数。比如常见的会将 TTL=60 设置为 600。

运营商的缓存机制一方面能够缓解 LocalDNS 频繁查询产生的性能开销,但另一方面会导致权威 DNS 更新资源记录时,用户不能够及时通过 LocalDNS 获取到最新数据。虽然 DNS 可能不会经常变动,可对于大公司来说,变动 DNS 记录确是家常便饭,如故障临时切换、CDN 流量动态调度等操作,LocalDNS 缓存对这些操作来说影响面都是很大的,且是很难控制的,因为缓存控制权都在本地运营商手中。


Comments

Content