本文概述了域名系统(DNS)查询过程以及 DNS 服务器解析查询的方式。 它还介绍了 DNS 服务器如何使用递归和迭代来解析查询。
DNS 查询的工作原理
当 DNS 客户端需要查找名称时,它会查询 DNS 服务器来解析名称。 客户端发送的每个查询消息都包含三条信息,并指定要回答的服务器的问题:
- 指定的 DNS 域名,声明为完全限定的域名(FQDN)。
- 可以通过指定类型或特定查询操作类型来指定资源记录 (RR) 的查询类型。
- 适用于 DNS 域名的特定类别。 对于运行 Windows作系统的 DNS 服务器,此类应始终指定为 Internet (IN) 类。
例如,指定的名称可以是计算机的 FQDN,例如host-a.example.contoso.com.,并指定查询类型以根据该名称查找地址(A) RR。 将 DNS 查询视为客户端,询问服务器两部分的问题,例如“你是否有名为 hostname.example.contoso.com.”的计算机的任何 A 资源记录?”当客户端从服务器收到答案时,它会读取并解释应答的 A RR,并学习它按名称请求的计算机的 IP 地址。
下表介绍了常见的 DNS 查询类型和相应的 ID。
| 类型 | ID |
|---|---|
| A | 1 |
| AAAA | 28 |
| SOA | 6 |
| SRV | 33 |
DNS 查询以许多不同的方式解析。 客户端有时可以使用从上一个查询获取的缓存信息在本地回答查询。 DNS 服务器可以使用自己的资源记录信息缓存来应答查询。 DNS 服务器还可以代表客户端查询其他 DNS 服务器。 此过程称为递归。 服务器解析名称,然后将答案发送回客户端。
此外,客户端本身还可以尝试联系其他 DNS 服务器来解析名称。 当客户端这样做时,它会根据服务器的引荐答案使用单独的查询。 此过程称为迭代。
通常,DNS 查询过程分为两部分:
- 名称查询从客户端计算机开始,并传递给解析程序 DNS 客户端服务进行解析。
- 当无法在本地解析查询时,可以根据需要查询 DNS 服务器来解析名称。
本文更详细地介绍了每个过程。
迭代的工作原理
迭代是 DNS 客户端和服务器之间在以下条件生效时使用的名称解析类型:
- 客户端请求使用递归,但在 DNS 服务器上禁用递归。
- 在查询 DNS 服务器时,客户端不会请求使用递归。
来自客户端的迭代请求告知 DNS 服务器,客户端期望 DNS 服务器能够立即提供的最佳答案,而无需联系其他 DNS 服务器。
使用迭代时,DNS 服务器会根据有关要查询的名称数据的命名空间的特定知识来回答客户端。 例如,如果 Intranet 上的 DNS 服务器从本地客户端 www.contoso.com收到查询,则它可能会从其名称缓存中返回答案。 如果查询的名称当前未存储在服务器的名称缓存中,则服务器可能会通过提供引荐做出响应。 引荐是包含其他 DNS 服务器的 NS 和 A 记录的列表,这些服务器与客户端查询的名称更接近。
使用迭代时,DNS 服务器可以进一步帮助名称查询解析,而无需向客户端提供自己的最佳答案。 对于大多数迭代查询,如果客户端的主 DNS 服务器无法解析查询,则客户端使用其本地配置的 DNS 服务器列表来联系整个 DNS 命名空间中的其他名称服务器。
Windows DNS 客户端服务不执行递归。
缓存工作原理
当 DNS 服务器使用递归或迭代处理客户端查询时,它们发现并获取有关 DNS 命名空间的重要信息存储。 然后,服务器将缓存此信息。
缓存提供了一种方法,可以加快 DNS 解析的性能,以便查询热门名称的后续查询,同时大幅减少网络上与 DNS 相关的查询流量。
当 DNS 服务器代表客户端进行递归查询时,它们会暂时缓存资源记录。 缓存的资源记录包含从 DNS 服务器获取的信息。 这些服务器是 DNS 域名的权威服务器。 在进行迭代查询时会了解此信息。 这些查询有助于完全回答代表客户端执行的递归查询。 稍后,当其他客户端放置与缓存记录匹配的资源记录信息的新查询时,DNS 服务器可以使用缓存的信息来回答这些查询。
缓存信息后,生存时间 (TTL) 值将应用于所有缓存的资源记录。 只要缓存的资源记录的 TTL 未过期,DNS 服务器就可以继续缓存。 从与这些记录匹配的客户端接收查询时,它可以再次使用缓存的资源记录进行响应。 在大多数区域配置中,资源记录使用的缓存 TTL 值分配区域开始 (SOA) 资源记录中设置的最小值(默认)TTL。 默认情况下,最小 TTL 为 3,600 秒(一小时),但可以调整,或者根据需要在每个资源记录处设置单个缓存 TTL。
Note
默认情况下,DNS 服务器服务使用根提示文件, cache.dns该文件存储在 <systemroot>\System32\Dns 服务器计算机上的文件夹中。 此文件包含 DNS 命名空间根服务器的 NS 和 A 资源记录(Internet 根服务器或 Intranet 根服务器)。 启动 DNS 服务器服务后,将查询根服务器列表,以获取所有根服务器的当前列表。 查询的结果用于更新根提示文件。 在服务运行期间,该操作会定期执行。 管理员对根提示进行更改时,这些更改将写回到根提示文件。
DNS 客户端服务解析器
在本地计算机上的程序使用 DNS 域名时,请求会被传递给 DNS 客户端服务,服务首先检查本地缓存的信息以进行解析。 如果可以解析查询名称,则会应答查询,并完成该过程。
下图显示了 DNS 客户端向 DNS 客户端服务查询名称解析的简单示例。
显示 DNS 客户端向 DNS 客户端服务查询名称解析的一个简单示例的图。
本地解析程序缓存可以包含从两个可能的源获取的名称信息:
如果在本地配置了 Hosts 文件,则启动 DNS 客户端服务时,将从该文件加载到缓存中的任何主机名到地址映射。
在先前 DNS 查询的应答响应中获取的资源记录将添加到缓存中,并保留一段时间,由生存时间 (TTL) 决定。
如果查询与缓存中的条目不匹配,则解析过程会继续客户端查询 DNS 服务器以解析名称。
下图显示了用于检查 DNS 查询缓存的 DNS 客户端服务。
显示 DNS 客户端服务如何在缓存中检查 DNS 查询的图表。
使用多个 DNS 服务器 IP 配置 DNS 客户端会增加 DNS 基础结构的容错能力。 添加多个 DNS 服务器 IP 可确保如果主 DNS 服务器、网络链接或支持基础结构失败,仍可以解析 DNS 名称。
名称故障可能会导致应用程序或组件挂起、资源中断,从而导致因等待依赖项超时而直接或间接引发运行故障。 有关所有可能方案的详细讨论,请参阅 DNS 客户端解析超时 。
出于这些原因,建议使用多个 DNS 服务器配置任何 Windows 客户端。 但是,Windows 客户端解析过程因配置的 DNS 服务器数而异。
DNS 服务器查询过程
当 DNS 服务器收到查询时,它会首先检查它是否可以权威地回答查询。 DNS 服务器使用服务器上本地配置的区域中包含的资源记录信息进行检查。
如果查询的名称与本地区域信息中的相应 RR 匹配,则服务器会权威地回答,使用此信息解析查询的名称。
如果查询的名称不存在任何区域信息,则服务器会检查它是否可以使用以前查询的本地缓存信息解析名称。 如果在此处找到匹配项,则服务器会回答此信息。 同样,如果首选服务器可以使用从缓存到请求客户端的正匹配响应进行应答,则查询已完成。
如果查询的名称在其首选服务器上找不到匹配的答案,则查询过程可以使用递归完全解析名称,从其缓存或区域信息中找到匹配的答案。 此过程涉及来自其他 DNS 服务器的帮助,以帮助解析名称。 默认情况下,DNS 客户端服务要求服务器在返回答案之前使用递归过程来代表客户端完全解析名称。
为了使 DNS 服务器能够正确进行递归,它首先需要一些有关 DNS 域命名空间中其他 DNS 服务器的有用联系信息。 此信息以根提示的形式提供。 根提示是初步资源记录的列表。 DNS 服务使用这些记录来查找对 DNS 域命名空间树根目录具有权威性的其他 DNS 服务器。 根服务器对于 DNS 域命名空间树中的域根域和顶级域具有权威性。
通过使用根提示查找根服务器,DNS 服务器能够完成递归的使用。 从理论上讲,此过程使任何 DNS 服务器能够查找命名空间树中任何级别使用的任何其他 DNS 域名的权威服务器。
以下步骤描述了查询 DNS 服务器的过程:
如果查询是完全限定的域名(FQDN),这意味着它以终止点(
.)结尾,则将查询提交到 DNS 服务器。 例如:www.contoso.com.如果查询是一个不合格的多标签查询,这意味着它不会以终止点结尾(
.),则 DNS 客户端会将其提交到具有终止点的 DNS 服务器(.)。 例如:www.contoso.com.若不合格的是单个标签查询例如
www。 然后,根据 NIC 上的 DNS 设置,行为会有所不同。如果有 DNS 后缀搜索列表,则 DNS 客户端服务会按顺序从第一个到最后一个追加到单个标签查询,并将带有终止点(
.)的查询提交到 DNS 服务器。 这个过程是一个重复的过程,直到用完所有 DNS 后缀搜索列表。如果未配置 DNS 后缀搜索列表,则 DNS 客户端服务会将主 DNS 后缀追加到带有终止点(
.)的单个标签查询,并提交到 DNS 服务器。当 DNS 客户端配置为执行名称分配时,它会解除主 DNS 后缀,并在主 DNS 后缀失败时发送另一个带有终止点(
.)的查询。 例如,如果解析www.test.contoso.com失败,客户端将退回到www.contoso.com如果在适配器上配置了特定连接的 DNS 后缀,则查询会被加上一个结束点(
.)并提交到 DNS 服务器。
在所有情况下,响应都存储在 DNS 客户端缓存中,无论响应是正还是负。
以程图说明了查询 DNS 服务器的描述过程。
DNS 递归
请考虑使用递归过程在客户端查询单个 DNS 服务器时查找名称 host-b.example.contoso.com. 。 首次启动 DNS 服务器和客户端时,将发生此过程,并且没有可用于帮助解析名称查询的本地缓存信息。 它假定客户端查询的名称是针对服务器根据其配置区域不具备本地知识的域名。
首先,首选服务器会分析全名,并确定它需要顶级域 com 权威的服务器的位置。 然后,它使用对 DNS 服务器的迭代查询 com 来获取对 contoso.com 服务器的引用。 接下来,一个引用答案从contoso.com服务器发送到example.contoso.com的 DNS 服务器。
最后,会与 example.contoso.com. 服务器联系。 由于此服务器包含已查询的名称作为其配置的区域的一部分,因此它会以权威方式响应发起递归的原始服务器。 当原始服务器收到响应时,它会检查答案是否具有权威性。 如果是,服务器会将此答案转发回请求客户端,完成递归查询过程。
尽管递归查询过程在执行时可能占用大量资源,但它对 DNS 服务器具有一些性能优势。 例如,在递归过程中,执行递归查找的 DNS 服务器获取有关 DNS 域命名空间的信息。 服务器会缓存信息,这些信息可以再次用于帮助加快对使用或匹配的后续查询的应答速度。 随着时间推移,此缓存的信息可能会增大,占用大量服务器内存资源。 每当重新启动 DNS 服务时,将清除缓存。
DNS 查询自适应超时
DNS 查询自适应超时功能使 DNS 查询的超时能够根据以前的查询所需的时间进行调整,从而减少大多数查询的超时时间。 对于高延迟链接(如卫星链接),还可以增加超时。 Windows 应用商店应用可以针对每个网络接口优化 DNS 超时的配置。
第一个超时基于网络的过去性能在 25 毫秒与 1000 毫秒之间进行调整,而不是在等待 1000 毫秒之后使 DNS 查询超时。
DNS 服务器无响应缓存
非响应 DNS 服务器会缓存并定期重试。 这种停用使 DNS 客户端能够一致地使用最佳可用服务器,并花费更少的时间等待无响应的 DNS 服务器。
下图显示了使用本节中的过程在每个适配器上查询每个服务器的 DNS 客户端示例。
DNS 客户端服务按以下顺序查询 DNS 服务器:
DNS 客户端服务将名称查询发送到首选适配器的 DNS 服务器列表中的第一个 DNS 服务器,并等待一秒以获取响应。
如果 DNS 客户端服务在第一秒内未收到来自第一个 DNS 服务器的响应,则会将名称查询发送到仍在考虑的所有适配器上的第一个 DNS 服务器,并等待两秒的响应。
如果 DNS 客户端服务在两秒内未收到来自任何 DNS 服务器的响应,则会将查询发送到仍在考虑的所有适配器上的所有 DNS 服务器。 然后,DNS 客户端服务再等待两秒来响应。
如果 DNS 客户端服务仍然未收到来自任何 DNS 服务器的响应,则会将名称查询发送到仍在考虑的所有适配器上的所有 DNS 服务器,并等待四秒的响应。
如果 DNS 客户端服务未收到来自任何 DNS 服务器的响应,则 DNS 客户端会将查询发送到仍在考虑的所有适配器上的所有 DNS 服务器,并等待 8 秒的响应。
如果 DNS 客户端服务在八秒内未收到来自任何服务器的响应,则 DNS 客户端服务会超时响应。如果 DNS 客户端服务未收到来自特定适配器上任何 DNS 服务器的响应,则会在该适配器上在接下来的 30 秒内将这些服务器的所有查询超时。
如果 DNS 客户端服务在任何时候从服务器收到否定响应,则会在此次搜索中取消考虑该适配器上的每个服务器。 例如,如果备用适配器 A 上的第一台服务器在步骤 2 中给出负响应,则 DNS 客户端服务不会查询备用适配器 A 列表中的任何其他服务器。
如果 DNS 客户端服务收到正响应,它将停止查询名称,将响应添加到缓存,并将响应返回到客户端。
DNS 客户端服务跟踪哪些服务器更快地应答名称查询,并根据服务器回复名称查询的速度在列表中向上或向下移动。
备用查询响应
上述 DNS 查询说明假定进程以返回给客户端的正响应结束。 但是,查询也可以返回其他答案。 以下是最常见的查询答案:
- 权威答案
- 积极答案
- 推荐回答
- 负面答案
权威答案是来自 DNS 服务器的正响应,该服务器具有对查询名称的直接授权。 此答案包括 DNS 消息中设置的颁发机构位,以指示其真实性。
正响应可以包含查询的 RR 或 RR 列表(也称为 RR 集),该列表符合查询消息中指定的 DNS 域名和记录类型。
引用答案包含查询中未按名称或类型指定的其他 RR。 如果不支持递归过程,则此类型的答案将返回到客户端。 记录旨在充当客户端可用于使用迭代继续查询的有用参考答案。 引用答案包含更多数据,例如查询的类型以外的 RR。 例如,如果 DNS服务器在此区域中找不到查询主机名 www 的任何A记录,却查找到www的CNAME记录,则可以在响应客户端时包含该信息。 如果客户端能够使用迭代,那么它可以根据引荐信息进行更多查询,以尝试完全解析域名。
来自服务器的负响应可以指示两个可能的结果之一:
- 权威服务器在 DNS 命名空间中找不到查询的名称。
- 权威服务器找到了查询的名称,但对于该名称不存在指定类型的记录。
解析程序处理查询并将结果返回到请求程序。 响应可以是正或负。 此外,解析程序会缓存响应以供将来使用。
如果查询的结果答案太长,无法在单个 UDP 消息数据包中发送和解析,则 DNS 服务器可以通过 TCP 端口 53 启动故障转移响应,以在 TCP 连接的会话中完全应答客户端。
当 DNS 客户端仅限于将名称解析为特定 DNS 服务器(例如 Intranet 上的 DNS 服务器)时,会在 DNS 服务器上禁用递归的使用。 当 DNS 服务器无法解析外部 DNS 名称时,也可能禁用递归。 在这种情况下,客户端应故障转移到另一个 DNS 服务器进行名称解析。 如果在 DNS 服务器上禁用递归,则不能在同一服务器上使用转发器。
默认情况下,DNS 服务器在执行递归查询和联系其他 DNS 服务器时使用多个默认计时。 这些默认值包括:
- 递归重试间隔为 3 秒。 此间隔是 DNS 服务在重试递归查找期间进行的查询之前等待的时间长度。
- 递归超时间隔为 8 秒。 此间隔是 DNS 服务在重试的递归查找失败之前等待的时间长度。
在大多数情况下,这些参数不需要调整。 但是,如果对慢速广域网(WAN)链接使用递归查找,则可以通过对设置进行轻微调整来提高服务器性能和查询完成。
相关内容
若要了解有关反向查找过程的详细信息,请参阅 反向查找。