Keyboard shortcuts

Press or to navigate between chapters

Press ? to show this help

Press Esc to hide this help

DNS 查询与缓存

复习

  • DNS 的名字空间:域名是一棵分层管理的树
  • 套接字:应用通过套接字收发数据
  • 端口:DNS 常用 53 号端口

TL;DR

  • 解析器代表应用去查询域名对应的地址
  • 查询会沿域名树逐级进行:根、顶级域、权威服务器
  • 缓存让重复查询不必每次从头来
  • TTL 决定一条解析结果能被缓存多久

正文

  知道了域名是一棵树,那具体怎么“找到答案”?

一层层问过去

  当你访问一个新域名时,背后大致会经历这样的过程:

  1. 先看看本地有没有缓存的答案,有就直接用
  2. 没有,就交给递归解析器(通常由网络服务商提供)
  3. 解析器从开始问:“.com 该找谁?”
  4. 根告诉它 .com 的服务器地址,它再去问 .com:“example.com 该找谁?”
  5. .com 再指向 example.com权威服务器
  6. 权威服务器终于给出这个域名对应的 IP 地址

  一路像问路一样,从一个知道一部分的节点,问到下一个更了解情况的节点,直到拿到最终答案。

缓存:别每次都从头问

  如果每次都从根问起,网络负担会非常重。所以 DNS 大量使用缓存

  • 浏览器缓存
  • 操作系统缓存
  • 递归解析器的缓存

  一旦某个域名被解析过,结果就会被存下来。下次再有人问,直接返回缓存,不必再跑一趟完整的查询。这正是“时间局部性”在 DNS 上的体现:刚问过的域名,很可能马上又被问。

TTL:缓存能留多久

  缓存不能永远留着,否则服务器换了地址,用户还按旧地址访问就会失败。所以每条解析结果都带一个 TTL(生存时间),规定它能被缓存多久。

  • TTL 太长:减少了查询、更快,但服务器变更后,旧结果可能长时间不更新
  • TTL 太短:更新及时,但查询频繁、负载变大

  又是一个熟悉的权衡:新鲜度与效率之间,总要取一个平衡。

  有了地址,应用就可以真正去“取东西”了。网络世界里最常见的应用协议,就是 HTTP。

思考题 1

  DNS 缓存为什么能显著加快后续访问?

思考题 2

  TTL 设置得太长或太短,各有什么利弊?

小结

知识点

  • 解析器代表应用逐级查询域名
  • 查询沿域名树从根到权威服务器推进
  • 多级缓存避免重复查询
  • TTL 决定解析结果的缓存时长

参考资料

  1. Wikipedia(zh):域名系统:解析过程与缓存机制
  2. Wikipedia(zh):生存时间:DNS 记录的缓存有效期

思考题答案(仅供参考)

思考题 1

  因为解析结果可以在浏览器、操作系统和递归解析器等多处缓存。同一个域名再次被访问时,往往直接命中缓存,省去了从根逐级查询的往返过程,延迟大幅降低,也减轻了 DNS 系统的负载。

思考题 2

  TTL 太长,能减少查询、提升性能,但服务器地址变更后旧记录会长时间残留,可能导致访问失败;TTL 太短,更新及时,却会让查询更频繁、整体负载更大。需要根据记录的稳定程度来取舍。

协议

  本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

封面图

设计师 | 南国微雪