DNS 及其运行机制
什么是 DNS?
域名系统 (DNS - Domain Name System) 是 Internet 电话簿。人们通过例如 baidu.com
或 qq.com
等域名在线访问信息。Web 浏览器通过 Internet 协议 (IP) 地址进行交互。DNS 将域名转换为 IP 地址,以便浏览器能够加载 Internet 资源。
连接到 Internet 的每个设备都有一个唯一 IP 地址,其他计算机可使用该 IP 地址查找此设备。DNS 服务器使人们无需存储例如 192.168.1.1
(IPv4 中)等 IP 地址或更复杂的较新字母数字 IP 地址,例如 2400:cb00:2048:1::c629:d7a2
(IPv6 中)。
DNS 如何工作?
DNS 解析过程涉及将主机名(例如 www.example.com
)转换为计算机友好的 IP 地址(例如 192.168.1.1
)。Internet 上的每个设备都被分配了一个 IP 地址,必须有该地址才能找到相应的 Internet 设备 - 就像使用街道地址来查找特定住所一样。当用户想要加载网页时,用户在 Web 浏览器中键入的内容(example.com
)与查找 example.com
网页所需的机器友好地址之间必须进行转换。
为理解 DNS 解析过程,务必了解 DNS 查询必须经过的不同硬件组件。对于 Web 浏览器,DNS 查找在「幕后」进行,除了初始请求外,不需要从用户的计算机进行任何交互。
DNS 服务器类别
所有 DNS 服务器都属于以下四个类别之一:递归解析器、根域名服务器、TLD 域名服务器和权威性域名服务器。在典型 DNS 查找中(当没有正在进行的高速缓存时),这四个 DNS 服务器协同工作来完成将指定域的 IP 地址提供给客户端的任务(客户端通常是一个存根解析器 - 内置于操作系统的简单解析器)。
- DNS 解析器(DNS recursor) - 该解析器可被视为被要求去图书馆的某个地方查找特定图书的图书馆员。DNS 解析器是一种服务器,旨在通过 Web 浏览器等应用程序接收客户端计算机的查询。然后,解析器一般负责发出其他请求,以便满足客户端的 DNS 查询。
- 根域名服务器(Root nameserver) - 根域名服务器是将人类可读的主机名转换(解析)为 IP 地址的第一步。可将其视为指向不同书架的图书馆中的索引 - 一般其作为对其他更具体位置的引用。
- TLD 域名服务器(TLD nameserver) - 顶级域服务器(TLD)可被视为图书馆中的特定书架。此域名服务器是搜索特定 IP 地址的下一步,其托管主机名的最后一部分(在
example.com
中,TLD 服务器为 「com」)。 - 权威性域名服务器(Authoritative nameserver ) - 可将这个最终域名服务器视为书架上的字典,其中特定名称可被转换成其定义。权威性域名服务器是域名服务器查询中的最后一站。如果权威性域名服务器能够访问请求的记录,则其会将已请求主机名的 IP 地址返回到发出初始请求的 DNS 解析器(图书管理员)。
DNS 查找 IP 地址步骤
DNS服务器根据域名的层级,进行分级查询。
需要明确的是,每一级域名都有自己的NS(Name Server的缩写)记录,NS记录指向该级域名的域名服务器。
- 用户在 Web 浏览器中键入
example.com
,查询传输到 Internet 中,并被 DNS 递归解析器接收。 - 接着,解析器向 DNS 根域名服务器(.)发起查询请求。
- 然后,根服务器返回其域信息的顶级域(TLD)DNS 服务器(例如 .com 或 .net)的 NS 记录和 A 记录给该解析器。例如:在访问
example.com
时,我们的请求指向 .com TLD 服务器。 - 然后,解析器向 .com TLD 服务器发出请求。
- TLD 服务器随后返回域名
example.com
的权威性域名服务器 NS 记录和 A 记录。 - 最后,递归解析器将查询发送到域的域名服务器。
example.com
的 IP 地址从权威性域名服务器返回到解析器。- 然后 DNS 解析器使用最初请求的域的 IP 地址响应 Web 浏览器。
DNS 查找经过这 8 个步骤返回
example.com
的 IP 地址后,浏览器便能发出对该网页的请求。
- 浏览器向该 IP 地址发出 HTTP 请求。
- 位于该 IP 的服务器返回将在浏览器中呈现的网页(第 10 步)。
什么是 DNS 递归解析器?
递归解析器(也称为 DNS 解析器)是 DNS 查询中的第一站。递归解析器作为客户端与 DNS 域名服务器的中间人。从 Web 客户端收到 DNS 查询后,递归解析器将使用缓存的数据进行响应,或者将向根域名服务器发送请求,接着向 TLD 域名服务器发送另一个请求,然后向权威性域名服务器发送最后一个请求。收到来自包含已请求 IP 地址的权威性域名服务器的响应后,递归解析器将向客户端发送响应。
在此过程中,递归解析器将缓存从权威性域名服务器收到的信息。当一个客户端请求的域名 IP 地址是另一个客户端最近请求的 IP 地址时,解析器可绕过与域名服务器进行通信的过程,并仅从第二个客户端的缓存中为第一个客户端提供所请求的记录。
大多数 Internet 用户使用他们 ISP 提供的递归解析器,但还有其他可用选择;例如 Cloudflare 的 1.1.1.1、阿里的 223.5.5.5/223.6.6.6、百度的 180.76.76.76。
什么是 DNS 根域名服务器?
每个递归解析器都知道 13 个 DNS 根域名服务器,它们是递归解析器搜寻 DNS 记录的第一站。根服务器接受包含域名的递归解析器的查询,根域名服务器根据该域的扩展名(.com、.net、.org 等),通过将递归解析器定向到 TLD 域名服务器进行响应。根域名服务器由一家名为 Internet 名称与数字地址分配机构(ICANN)的非营利组织进行监督。
DNS 根服务器的结构
域名系统 (DNS) 的管理通过使用不同的受管理分区或区域的层次结构构造,其根区域位于该层次结构的最顶部。根服务器是在根区域中运行的 DNS 域名服务器。这些服务器可以直接回答针对根区域内存储或缓存的记录的查询,还可以将其他请求引向相应的顶级域 (TLD) 服务器。TLD 服务器是 DNS 层次结构中比根服务器低一级的 DNS 服务器组,它们是解析 DNS 查询的必要部分。
www.baidu.com
真正的域名是www.baidu.com.root
,简写为www.baidu.com.
。因为,根域名.root
对于所有域名都是一样的,所以平时是省略的。在未缓存的 DNS 查询期间,每当用户在浏览器中输入网址,该操作都会触发 DNS 查找,并且所有 DNS 查找都从根区域开始。查找到达根区域后,将沿 DNS 系统的层次结构向下移动,首先到达 TLD 服务器,然后到达特定域(可能还有子域)的服务器,直到最终到达权威性名服务器,以查到正确的域名,其中包含要搜索的网站的数字 IP 地址。然后,该 IP 地址被返回给客户端。有趣的是,尽管需要许多步骤,但此过程仍可以非常快速地进行。
根服务器是 Internet 基础设施的重要组成部分;没有它们,Web 浏览器和许多其他 Internet 工具将无法工作。有 13 个不同的 IP 地址为 DNS 根区域提供服务,并且全球有数百个冗余根服务器来处理对根区域的请求。
为什么只有 13 个 DNS 根服务器地址?
一个普遍的误解是,世界上只有 13 台根服务器。实际上根服务器有许多,但只有 13 个 IP 地址用于查询不同的根服务器网络。DNS 原始架构的限制要求根区域中最多只能有 13 个服务器地址。在 Internet 面世之初,这 13 个 IP 地址的每一个都只有一台服务器,其中大多数位于美国。
如今,这 13 个 IP 地址中的每一个都有多个服务器,这些服务器使用 Anycast 路由基于负荷和距离分发请求。目前,地球上每座有人生活的大陆上都分布着 1300 多台 DNS 根服务器。
谁对 DNS 根服务器拥有权限?
根区域的最终权限属于国家电信和信息管理局 (NTIA),后者是美国商务部的一部分。NTIA 将根区域的管理委托给 Internet 名称与数字地址分配机构 (ICANN)。
ICANN 为根区域中 13 个 IP 地址之一操作服务器,并将其他 12 个 IP 地址的操作委托给包括 NASA、马里兰大学和 Verisign(唯一运营两个根 IP 地址的组织)在内的多个组织。
解析器如何找到 DNS 根服务器?
由于 DNS 根区域位于 DNS 层次结构的顶部,因此递归解析器无法在 DNS 查找中被引导到这些位置。因此,每个 DNS 解析器都在其软件中内置了 13 个 IP 根服务器地址的列表。每次发起 DNS 查找时,递归器的第一个通信就是与这 13 个 IP 地址之一进行的。
如果 DNS 根服务器不可用怎么办?
由于使用了 Anycast 路由并具备高冗余性,根服务器非常可靠。但是在极少数情况下,根服务器将必须更新其 IP 地址。在这种情况下,递归解析器可以继续使用根区域中的其他 12 个 IP 地址执行 DNS 查找,直到它们的软件更新为所有 13 台服务器的正确地址为止。由于所有根服务器都能够将 DNS 请求转发到 TLD 服务器,因此当一台根服务器关闭时,不会影响 Internet 正常运行。
什么是 TLD 域名服务器?
TLD 域名服务器维护共享通用域扩展名的所有域名的信息,例如 .com、.net 或 url 中最后一个点之后的任何内容。例如,.com TLD 域名服务器包含以「.com」结尾的每个网站的信息。如果用户正在搜索 google.com,则在收到来自根域名服务器的响应后,递归解析器将向 .com TLD 域名服务器发送查询,后者将通过针对该域的 权威性域名服务器 进行响应。
TLD 域名服务器的管理由 Internet 编号分配机构(IANA)加以处理,其为 ICANN 的一个分支机构。IANA 将 TLD 服务器分为两个主要组:
- 通用顶级域:这些是非特定国家/地区的域,一些最知名的通用 TLD 包括 .com、.org、.net、.edu 和 .gov。
- 国家/地区代码顶级域:这些包括特定于某个国家/地区或州的任何域。例如,uk、.us、.ru 和 .jp 等。
对于基础设施域实际上存在第三个类别,但该类别几乎从不使用。此类别是为 .arpa 域创建的,该域是在创建新式 DNS 时使用的过渡域;其当今主要是具有历史意义。
什么是权威性域名服务器?
当递归解析器收到来自 TLD 域名服务器的响应时,该响应会将解析器定向到权威性域名服务器。权威性域名服务器通常是解析器查找 IP 地址过程中的最后一步。权威名称服务器包含特定于其服务域名的信息(例如,google.com)权威性域名服务器包含特定于其所服务的域名的信息(例如 google.com),并且它可为递归解析器提供在 DNS A 记录中找到的服务器的 IP 地址,或者如果该域具有 CNAME 记录(别名),它将为递归解析器提供一个别名域,这时递归解析器将必须执行全新 DNS 查找,以便从权威性域名服务器获取记录(通常为包含 IP 地址的 A 记录)。例如在查询对象为子域 foo.example.com
或 blog.cloudflare.com
的情况下,将向权威性域名服务器之后的序列添加一个附加域名服务器,其负责存储该子域的 CNAME 记录。
DNS 查询的类型
典型 DNS 查找中会出现三种类型的查询。通过组合使用这些查询,优化的 DNS 解析过程可缩短传输距离。在理想情况下,可以使用缓存的记录数据,从而使 DNS 域名服务器能够返回非递归查询。
- 递归查询 - 在递归查询中,DNS 客户端要求 DNS 服务器(一般为 DNS 递归解析器)将使用所请求的资源记录响应客户端,或者如果解析器无法找到该记录,则返回错误消息。
- 迭代查询 - 在这种情况下,DNS 客户端将允许 DNS 服务器返回其能够给出的最佳应答。如果所查询的 DNS 服务器与查询名称不匹配,则其将返回对较低级别域名空间具有权威性的 DNS 服务器的引用。然后,DNS 客户端将对引用地址进行查询。此过程继续使用查询链中的其他 DNS 服务器,直至发生错误或超时为止。
- 非递归查询 - 当 DNS 解析器客户端查询 DNS 服务器以获取其有权访问的记录时通常会进行此查询,因为其对该记录具有权威性,或者该记录存在于其缓存内。DNS 服务器通常会缓存 DNS 记录,以防止更多带宽消耗和上游服务器上的负载。
DNS 缓存方式
DNS 高速缓存
缓存的目的是将数据临时存储在某个位置,从而提高数据请求的性能和可靠性。DNS 高速缓存涉及将数据存储在更靠近请求客户端的位置,以便能够更早地解析 DNS 查询,并且能够避免在 DNS 查找链中进一步向下的额外查询,从而缩短加载时间并减少带宽 CPU 消耗。DNS 数据可缓存到各种不同的位置上,每个位置均将存储 DNS 记录并保存由生存时间(TTL)决定的一段时间。
浏览器 DNS 缓存
现代 Web 浏览器设计为默认将 DNS 记录缓存一段时间。目的很明显;越靠近 Web 浏览器进行 DNS 缓存,为检查缓存并向 IP 地址发出正确请求而必须采取的处理步骤就越少。发出对 DNS 记录的请求时,浏览器缓存是针对所请求的记录而检查的第一个位置。
在 Chrome 浏览器中,您可以转到 chrome://net-internals/#dns
查看 DNS 缓存的状态。
操作系统(OS)级 DNS 缓存
操作系统级 DNS 解析器是 DNS 查询离开您计算机前的第二站,也是本地最后一站。操作系统内旨在处理此查询的过程通常称为「存根解析器」或 「DNS 客户端」。当存根解析器获取来自某个应用程序的请求时,其首先检查自己的缓存,以便查看是否有此记录。如果没有,则将本地网络外部的 DNS 查询(设置了递归标记)发送到 Internet 服务提供商(ISP)内部的 DNS 递归解析器。
与先前所有步骤一样,当 ISP 内的递归解析器收到 DNS 查询时,其还将查看所请求的主机到 IP 地址转换是否已经存储在其本地持久性层中。
根据其缓存中具有的记录类型,递归解析器还具有其他功能:
- 如果解析器没有 A 记录,但确实有针对权威性域名服务器的 NS 记录,则其将直接查询这些域名服务器,从而绕过 DNS 查询中的几个步骤。此快捷方式可防止从根和 .com 域名服务器(在我们对
example.com
的搜索中)进行查找,并且有助于更快地解析 DNS 查询。 - 如果解析器没有 NS 记录,它会向 TLD 服务器(本例中为 .com)发送查询,从而跳过根服务器。
- 万一解析器没有指向 TLD 服务器的记录,其将查询根服务器。这种情况通常在清除了 DNS 高速缓存后发生。
DNS 分级查询调试例子
dig
工具执行,类似的 DNS 工具还有host
、nslookup
、whois
|
|
从命令dig +trace blog.zzz.run
的运行结果来看总共分为四段。
- 解析器获取根域名
.
的 13 条 NS 记录,即所有根域名服务器。
根据内置的根域名服务器 IP 地址,DNS 解析器向所有这些 IP 地址发出查询请求,询问
blog.zzz.run
的顶级域名服务器run.
的 NS 记录。最先回复的根域名服务器将被缓存,以后只向这台服务器发请求。
|
|
- 通过请求根服务器(Root Server)找到
.run
后缀域名的 4 条 NS 记录
|
|
- DNS 服务器向这些顶级域名服务器(TLD Server)发出查询请求,寻找
blog.zzz.run
中次级域名zzz.run
的 NS 记录
|
|
- 通过这两台 NS 服务器(权威性域名服务器 )查询到有两条 A 记录。并且还显示最先找到这条记录的 NS 服务器是
mcgrory.ns.cloudflare.com
,通过这两个 IP 地址都可以访问到网站。
|
|