在 DNS 查询中,有两种主要的查询方式:递归查询和迭代查询。它们的工作方式和关系如下:
-
递归查询 (Recursive Query):
- 当一个客户端(例如你的电脑或手机)向 DNS 服务器(通常是你的本地 DNS 服务器或 ISP 的 DNS 服务器)发送请求时,如果该服务器没有所需的信息,那么它有责任自己去其他 DNS 服务器中查找这些信息。
- 服务器会代表客户端执行所有必要的进一步查询,直到它获得答案。然后,它将答案返回给客户端。这种查询方式称为递归查询,因为服务器必须递归地完成客户端的查询。
- 这种查询方式简化了客户端的工作,但为服务器增加了更多的工作。
-
迭代查询 (Iterative Query):
- 当一个 DNS 服务器(例如本地 DNS 服务器)向其他 DNS 服务器(例如根域服务器或 TLD 服务器)发送查询时,它可能执行一个迭代查询。
- 在迭代查询中,被查询的服务器提供关于如何获得答案的最佳信息,但并不实际为查询者提供最终答案。例如,当本地 DNS 服务器查询根服务器以获取
example.com
的 IP 地址时,根服务器可能只告诉它去查询一个特定的.com
TLD 服务器。 - 之后,本地 DNS 服务器再继续查询
.com
TLD 服务器,然后可能被告知去查询example.com
的权威 DNS 服务器。这个过程一直持续,直到本地 DNS 服务器得到最终的答案。 - 这种查询方式意味着每一步都需要请求者(在这种情况下是本地 DNS 服务器)进行下一步的查询,而不是被查询的服务器自己去做。
通常,当一个终端用户的设备开始 DNS 查询时,首先是递归查询,因为它查询的本地 DNS 服务器或 ISP 的 DNS 服务器,期望得到一个完整的答案。但在 DNS 解析过程中,涉及的其他服务器间的查询是迭代的。
想象你在浏览器中键入 www.example.com。
递归查询:
你的电脑(也可以说是你的浏览器)首先会检查它的本地缓存,看是否有 www.example.com 的 DNS 记录。如果没有,它会向配置的 DNS 服务器发送请求,这通常是你的互联网服务提供商(ISP)的 DNS 服务器或者其他公共 DNS 服务,如 Google 的 8.8.8.8。
你的电脑期望这个服务器给它一个完整的答案,即 www.example.com 的 IP 地址。这种期望得到完整答案的查询称为递归查询。
迭代查询:
假设你的 ISP 的 DNS 服务器没有 www.example.com 的缓存记录。此时,它需要在 DNS 系统中查找答案。
首先,它会查询一个根 DNS 服务器。根服务器不知道 www.example.com 的 IP,但它知道哪个 TLD(顶级域)服务器负责 .com 域。于是,它告诉你的 ISP 的 DNS 服务器:“我不知道 www.example.com 的 IP,但你可以去询问这个特定的 .com TLD 服务器。” 这就是迭代查询。
接下来,你的 ISP 的 DNS 服务器会向指定的 .com TLD 服务器发送查询。.com 服务器也许也不知道 www.example.com 的具体 IP,但它知道 example.com 的权威 DNS 服务器地址,于是它再次进行迭代查询,告诉你的 ISP 的 DNS 服务器去询问 example.com 的权威服务器。
最后,你的 ISP 的 DNS 服务器查询 example.com 的权威服务器,这次它得到了 www.example.com 的 IP 地址。
返回答案:
有了答案后,你的 ISP 的 DNS 服务器将 IP 地址返回给你的电脑(浏览器),完成了递归查询的请求。