理解 DNS 缓存

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: 当我第一次学习 DNS 解析 时,我被这个漫长和复杂的过程惊到了。想象一下你每天要访问多少网站,再想一下你每天要访问多少次。现在想象一下你每次访问时,在另一端的 ISP DNS 服务器必须重复整个递归过程,并查询递归链中的所有域名服务器。

建议阅读原文: Understanding DNS cache

当我第一次学习 DNS 解析 时,我被这个漫长和复杂的过程惊到了。想象一下你每天要访问多少网站,再想一下你每天要访问多少次。现在想象一下你每次访问时,在另一端的 ISP DNS 服务器必须重复整个递归过程,并查询递归链中的所有域名服务器。

以此为背景,想象一下你的手机。当你想跟你一个定期联系的朋友通个电话时,你很容易在最近通话中找到他们的名字并拨打。但是,如果这些信息并没有准备好,你就得打 114 来去获取他们的号码,然后手动拨出。看起来是不是很繁琐?

实际上将域名转化为 IP 地址 需要大量步骤,并且要消耗大量时间。幸运的是,DNS 的设计者考虑到了如何加速 DNS,并实现了缓存。DNS 缓存使得 DNS Server 或者 客户端本地存储 DNS 记录并在以后复用,减少了对新 DNS 请求的查询需求。

域名系统为每一条  DNS 记录实现了存活时间(TTL)。TTL 指定了一条 DNS 记录在 DNS 服务器和客户端可以被缓存的秒数。当缓存中存在该 DNS 记录时,也会保存其存活时长。服务器会持续更新缓存中的 TTL ,以秒为单位倒计时。当它变为 0 时,该记录会从缓存中被删除或者清除。此时,如果缓存过期以后再次收到该记录的请求,DNS 服务器就必须启动解析流程。

要理解缓存,让我们来看下上一篇文章中的例子,解析 www.google.com 。 当你在浏览器里输入 www.google.com 时,浏览器向操作系统询问 IP 地址。操作系统有 stub resolver 或者 DNS client (参考:什么是 DNS Server, resolver 以及 stub resolver),一个操作系统响应所有 DNS 查询的解析器。DNS 解析器会发送 DNS 请求(并开启递归查询标记)给特定的递归解析器(域名服务器)并根据其 TTL 值存储其 DNS 记录到缓存。

Stub Resolver 收到一个应用程序的请求,它会先查看自己的缓存,如果缓存中有该记录,它会将缓存中的信息直接返回给应用程序。如果缓存中没有,则发送 DNS 请求(并开启递归标记)递归解析器(ISPDNS 服务器)。

Recursive Resolver 收到请求,它会先查看缓存中有 www.google.com 的哪些信息。如果缓存中有 A 记录,则把记录发送给 Stub Server。如果没有 A 记录,但是有权威域名服务器的 NS 记录,它将会请求这些权威域名服务器(绕过根服务器和 com gTLD 服务器)。

如果没有权威域名服务器,它会请求 com gTLD 服务器。

如果没有权威名称服务器,就会请求 .com gTLD 服务器(因为他们 TTL 非常高,他们一般是存在于缓存中,并且他们适用于任意 .com 域名)。只有当他们不存在于缓存时, Recursive Resolver 才会向根服务器请求 gTLDs, 这种情况非常少见(通常是指行了 purge 操作)。

为了避免传播过期 DNS 记录,DNS 服务器将会通过矫正一个请求的 TTL ,而不是这条记录原始 TTL 值。例如,假设 一条 www.google.com 记录的 TTL4 个小时,并且它在上午 8 点被 Recursive Resolver 保存于缓存中。如果有一个新用户,在这个解析器,在上午 9 点请求相同的域名,resolver 将会发送一个 3 个小时的 TTL 记录。

现在我们已经覆盖了 DNSOSDNS 服务器的缓存,然后就剩下最后一层缓存:应用程序。所有应用都可以选择缓存 DNS 数据,即使他们不能遵循 DNS 标准。应用依赖操作系统函数 getaddrinfo() 来解析域名(所有操作系统都是用相同的函数名)。该函数返回域名的 IP 地址列表 - 但是他不返回 DNS 记录,所以应用程序没有 TTL 可用。

所以,不同的应用程序缓存数据时间不同。IE10+ 将在其缓存中存储最多 256 个域名,固定时间为 30 分钟256 个域名看起来好像很多,实际上不是的 - 网络上大量网页都会饮用 50 个域名以上,多亏第三方标记和重定向。另一方面,Chrome 将缓存 DNS 信息一分钟,并且存储 1000 条记录。你可以通过访问 chrome://net-internals#dns 查看和清理 ChromeDNS 缓存。

NS 缓存陷阱

人们会经常掉入一个的 DNS 缓存陷阱是权威名称服务器记录。就像我们之前提到的,权威名称服务器在请求响应中作为 NS 记录被指定。NS 记录有 TTL。但并不提供名称服务器的 IP 地址。IP 信息在额外的 A 或者 AAAA 记录响应里。

因此,一个 Recursive Resolver 同时依赖于 NSA 记录来抵达名称服务器。理想情况下,两种记录类型的 TTL 应该相同,但是偶尔有人错误配置 DNS zones,他们会在 DNS 请求传入新的 A 或者 AAAA 记录。新记录覆盖老记录,导致产生差异。

当所有的记录都在缓存里,Recursive Resolver 将会请求其中一台域名服务器的 IP 地址。如果 Recursive Resolver 缓存中只有 NS 记录,没有 A 或者 AAAA 记录,它就必须解析 名称服务器域名,比如 ns1.google.com, 获取其 IP 地址。这样并不好,因为它增加了解析域的时间。并且,如果它有域名服务器的 A 或者 AAAA 记录但是没有 NS 记录,它会强制发起一个 域名 www.google.comDNS 查询。

设置 TTL: 平衡行为

那么,TTL 时间长一些还是短一些会更好的呢?合适的的情况下,使用一个更长的 TTL,因为它会使 resolvers 缓存更久并且 OSS -- 意味着对终端用户而言意味着更好的性能,以及它会减少到你名称服务器的流量,因为请求会更少。无论如何,它也会减少你的变更 DNS,使你更容易因为遭受 DNS劫持攻击,并在你的数据中心不可访问时无法设置离线错误页面。

换句话说,TTL 越短人们就越会花时间在下载页面或资源,并增加你名称服务器的压力。并且使你更快的变更 DNS 配置。


DNS 解析是一个多阶段的由互联网大量服务器参与的过程。协议内建的缓存机制通过缓存并复用信息加速了未来 DNS 请求的过程。DNS 服务器 和/或 客户端在 TTL 上遵循该 DNS 规范,但是像浏览器这样的应用程序不遵循该规范 - 因此他们的缓存可以保存任意时间。

目录
相关文章
|
4月前
|
缓存 NoSQL Java
Redis深度解析:解锁高性能缓存的终极武器,让你的应用飞起来
【8月更文挑战第29天】本文从基本概念入手,通过实战示例、原理解析和高级使用技巧,全面讲解Redis这一高性能键值对数据库。Redis基于内存存储,支持多种数据结构,如字符串、列表和哈希表等,常用于数据库、缓存及消息队列。文中详细介绍了如何在Spring Boot项目中集成Redis,并展示了其工作原理、缓存实现方法及高级特性,如事务、发布/订阅、Lua脚本和集群等,帮助读者从入门到精通Redis,大幅提升应用性能与可扩展性。
87 0
|
18天前
|
存储 缓存 监控
后端开发中的缓存机制:深度解析与最佳实践####
本文深入探讨了后端开发中不可或缺的一环——缓存机制,旨在为读者提供一份详尽的指南,涵盖缓存的基本原理、常见类型(如内存缓存、磁盘缓存、分布式缓存等)、主流技术选型(Redis、Memcached、Ehcache等),以及在实际项目中如何根据业务需求设计并实施高效的缓存策略。不同于常规摘要的概述性质,本摘要直接点明文章将围绕“深度解析”与“最佳实践”两大核心展开,既适合初学者构建基础认知框架,也为有经验的开发者提供优化建议与实战技巧。 ####
|
1月前
|
存储 缓存 网络协议
如何防止DNS缓存中毒攻击(一)
DNS缓存中毒也称为DNS欺骗
48 10
|
1月前
|
缓存 网络协议 安全
如何防止DNS缓存中毒(Ⅱ)
服务器应该配置为尽可能少地依赖与其他DNS服务器的信任关系
43 10
|
1月前
|
缓存 网络协议 安全
如何防止DNS缓存中毒(Ⅱ)
防止DNS缓存中毒的方法包括:减少DNS服务器与其它服务器的信任关系;限制DNS服务器上的服务;使用最新版DNS;加强用户安全教育,如识别可疑网站,仅访问HTTPS网站等。部署SSL证书并选择符合国际Webtrust标准的CA机构,可进一步提高安全性。
44 1
|
1月前
|
存储 缓存 网络协议
如何防止DNS缓存中毒攻击(一)
DNS缓存中毒,即DNS欺骗,是一种通过利用DNS系统的漏洞,将用户流量从合法服务器导向虚假服务器的网络攻击。攻击者通过伪造DNS响应,使缓存服务器存储错误的IP地址,从而实现对合法URL的劫持。这不仅可能导致用户信息泄露,还可能使用户设备遭受恶意软件感染,对金融、医疗等关键领域造成严重影响。据统计,DNS攻击每年造成的平均损失高达223.6万美元,其中23%的攻击源自DNS缓存中毒。
63 0
|
3月前
|
存储 缓存 Java
在Spring Boot中使用缓存的技术解析
通过利用Spring Boot中的缓存支持,开发者可以轻松地实现高效和可扩展的缓存策略,进而提升应用的性能和用户体验。Spring Boot的声明式缓存抽象和对多种缓存技术的支持,使得集成和使用缓存变得前所未有的简单。无论是在开发新应用还是优化现有应用,合理地使用缓存都是提高性能的有效手段。
47 1
|
3月前
|
存储 缓存 Android开发
Android RecyclerView 缓存机制深度解析与面试题
本文首发于公众号“AntDream”,详细解析了 `RecyclerView` 的缓存机制,包括多级缓存的原理与流程,并提供了常见面试题及答案。通过本文,你将深入了解 `RecyclerView` 的高性能秘诀,提升列表和网格的开发技能。
77 8
|
4月前
|
存储 缓存 监控
警惕网络背后的陷阱:揭秘DNS缓存中毒如何悄然改变你的网络走向
【8月更文挑战第26天】DNS缓存中毒是一种网络攻击,通过篡改DNS服务器缓存,将用户重定向到恶意站点。攻击者利用伪造响应、事务ID猜测及中间人攻击等方式实施。这可能导致隐私泄露和恶意软件传播。防范措施包括使用DNSSEC、限制响应来源、定期清理缓存以及加强监控。了解这些有助于保护网络安全。
114 1
|
4月前
|
域名解析 存储 缓存
破解 DNS 缓存的秘密:一个简单实验揭示定时刷新背后的惊人真相!
【8月更文挑战第27天】本文介绍DNS缓存管理的重要性及其实现方法。DNS缓存用于快速响应重复的域名解析请求,但因IP地址变动需定期刷新以确保信息准确。文章提供一个基于Python的示例脚本,模拟DNS缓存刷新过程,包括添加、查询记录以及清除过期项等功能。尽管实际环境中这些任务常由专业DNS服务软件自动处理,但该示例有助于理解DNS缓存的工作机制及其维护策略。
87 0

相关产品

  • 云解析DNS
  • 推荐镜像

    更多