当 DNS 客户端需要查询程序中使用的名称时,它会查询 DNS 服务器来解析该名称。客户端发送的每条查询消息都包括三条信息,指定服务器回答的问题:
例如,指定的名称可为计算机的 FQDN,如 host-a.example.microsoft.com,并且指定的查询类型用于通过该名称搜索地址 (A) 资源记录。将 DNS 查询看作客户端向服务器询问由两部分组成的问题,如“您是否拥有名为‘hostname.example.microsoft.com’的计算机的 A 资源记录?”当客户端收到来自服务器的应答时,它将读取并解释应答的 A 资源记录,获取根据名称询问的计算机的 IP 地址。
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 域名具有绝对控制权的服务器。
例如,当客户端查询单个 DNS 服务器时,考虑使用递归过程来定位名称 host-b.example.microsoft.com。在 DNS 服务器和客户端首次启动,并且没有本地缓存信息可帮助解析名称查询时,就会进行上述过程。根据其配置的区域,它假定由客户端查询的名称是域名,该服务器在本地不包含有关该域名的信息。
首先,首选服务器分析全名并确定对于顶级域“com”具有绝对控制权的服务器的位置。随后,对“com”DNS 服务器使用迭代查询,以获取“microsoft.com”服务器的参考信息。随后,参考应答从“microsoft.com”服务器传送到“example.microsoft.com”的 DNS 服务器。
最后,与服务器 example.microsoft.com 建立联系。因为该服务器包括作为其配置区域一部分的查询名称,所以它向启动递归的源服务器作出权威性地应答。当源服务器接收到表明已获得对请求查询的权威性应答的响应时,它将此应答转发给发出请求的客户端,这样递归查询过程就完成了。
尽管执行上述递归查询过程可能需要占用大量资源,但对于 DNS 服务器来说它仍然具有一些性能上的优势。例如,在递归过程中,执行递归查询的 DNS 服务器可获得有关 DNS 域命名空间的信息。该信息由服务器缓存起来并可再次使用,以便提高使用此信息或与之匹配的后续查询的应答速度。随着时间的推移,这些缓存信息会不断增加并占据大量的服务器内存资源,尽管每次 DNS 服务重新启动时这一信息将被清除。
以前对 DNS 查询的讨论,都假定此过程在结束时会向客户端返回一个肯定的响应。然而,查询也可返回其他应答。最常见的应答有:
权威性应答是返回至客户端的肯定应答,并随 DNS 消息中设置的“授权机构”位一同发送,消息指出此应答是从带直接授权机构的服务器获取的。
肯定应答可由查询的 RR 或 RR 列表(也称作 RRset)组成,它与查询的 DNS 域名和查询消息中指定的记录类型相符。
参考性应答包括查询中名称或类型未指定的其他资源记录。如果不支持递归过程,则这类应答将返回至客户端。这些记录的作用是为了提供一些有用的参考性应答,客户端可使用参考性应答继续进行递归查询。
参考性应答包含其他的数据,如不属于查询类型的资源记录 (RR)。例如,如果查询主机名称为“www”并且在这个区域未找到该名称的 A RR,而是找到了“www”的 CNAME RR,则 DNS 服务器在响应客户端时可包含该信息。
如果客户端能够使用迭代过程,则它可使用这些参考性信息为自己进行其他查询,以便完全解析此名称。
来自服务器的否定应答可以表明:当服务器试图处理并且权威性地彻底解析查询的时候,遇到两种可能的结果之一:
以肯定或否定响应的形式,解析程序将查询结果传回请求程序并把响应消息缓存起来。
注意
迭代是在以下条件生效时 DNS 客户端和服务器之间使用的名称解析类型:
来自客户端的迭代请求告知 DNS 服务器:客户端希望直接从 DNS 服务器那里得到最好的应答,无需联系其他 DNS 服务器。
使用迭代时,DNS 服务器根据它自身对与查询的名称数据有关的命名空间的特定知识应答客户端。例如,如果 Intranet 上的 DNS 服务器接收到来自本地客户端“www.microsoft.com”的查询,则可能会返回来自其名称缓存的应答。如果查询的名称当前未存储在服务器的名称缓存中,则服务器可能会通过提供参考信息对客户端作出响应,即提供一张与客户端所查询的名称比较接近的其他 DNS 服务器的 NS 和 A 资源记录列表。
在形成参考性信息的时候,假定 DNS 客户端负责向其他配置的 DNS 服务器继续进行递归查询,以便解析该名称。例如,在大多数情况下,DNS 客户端可能会将其搜索扩展到 Internet 上的根域服务器,以定位对于“com”域具有绝对控制权的 DNS 服务器。一旦联系上 Internet 根服务器,它就会从指向“microsoft.com”域的实际 Internet DNS 服务器的这些 DNS 服务器中获得进一步的递归响应。当客户端收到这些 DNS 服务器的记录时,可以向 Internet 上的外部 Microsoft DNS 服务器发送其他迭代查询,它们可以提供肯定和权威性的应答。
使用迭代时,除了向客户端提供自己最好的应答外,DNS 服务器还可在名称查询解析中提供进一步的帮助。对于大部分迭代查询,如果它的主 DNS 不能辩识该查询,那么客户端使用本地配置的 DNS 服务器列表,在整个 DNS 命名空间中联系其他名称服务器。
DNS 服务器采用递归或迭代来处理客户端查询时,它们将发现并获得大量有关 DNS 命名空间的重要信息。然后这些信息由服务器缓存。
缓存为 DNS 解析流行名称的后续查询提供了加速性能的方法,同时大大减少了网络上与 DNS 相关的查询通信量。
当 DNS 服务器代表客户端进行递归查询时,它们将暂时缓存资源记录 (RR)。缓存的 RR 包含从 DNS 服务器获得的信息,对于在进行迭代查询以便搜索和充分应答代表客户端所执行的递归查询过程中所获知的 DNS 域名而言,此信息具有绝对的权威性。稍后,当其他客户端发出新的查询,请求与缓存的 RR 匹配的 RR 信息时,DNS 服务器可以使用缓存的 RR 信息来应答它们。
当信息缓存时,生存时间 (TTL) 值适用于所有缓存的 RR。只要缓存 RR 的 TTL 没有到期,DNS 服务器就可继续缓存并再次使用 RR 来应答与这些 RR 相匹配的客户端提出的查询。将大部分区域配置中 RR 所用的缓存 TTL 值指定为“最小的(默认)TTL”,它被设置为用于区域的起始授权机构 (SOA) 资源记录。在默认情况下,最小的 TTL 为 3,600 秒(1 小时),但是可以进行调整,也就是说如果需要可以在每个 RR 上分别设置各自的缓存 TTL。
注意