迭代DNS查询和递归DNS查询的区别
作者:Sarath Pillai
日期:2013月1月12日
原文:https://www.slashroot.in/difference-between-iterative-and-recursive-dns-query
翻译:tommwq
译文:http://tommwq.tech/blog/2021/05/06/349
DNS是最关键的基础设施,它对所有人都是公开可用的。实际上可以这么说,如果DNS发生故障,足以摧毁万维网。
我曾经在文章中阐述了DNS的工作原理。然而,仅用一篇或数篇文章,无法总结全部的相关话题。所以我会继续发表关于DNS主题的文章。分开发表是为了让读者更容易理解。
在这篇文章中,我们将介绍不同的DNS查询类型。客户端使用不同类型的查询,从DNS服务器获取不同类型的信息。
1 DNS查询有哪些不同类型?
DNS查询可以根据请求被处理的方式进行分类。通常查询可以分为以下几类:
- 递归查询。
- 迭代查询或非递归查询。
- 反向查询。
1.1 什么是递归查询?
在递归查询中,接收客户端请求的DNS服务器将完成全部的工作,然后返回结果。在工作过程中,DNS服务器可能代表客户端,向internet上的其他DNS服务器查询,以获得答案。
让我们通过以下步骤了解递归查询的整个过程。
假设你想浏览www.example.com网站,并且/etc/resolve.conf文件包含以下条目:
[root@myvm ~]# cat /etc/resolv.conf nameserver 172.16.200.30 nameserver 172.16.200.31
这份resolve conf文件表是DNS服务器是172.16.200.30和172.16.200.31。无论你使用什么应用程序,操作系统都将向这两个DNS服务器发送查询请求。
步骤1:你在浏览器中输入www.example.com。操作系统向DNS服务器172.16.200.30发送请求,查询A记录。
步骤2:DNS服务器172.16.200.30在接收到查询后,检查本地缓存表,查找域名www.example.com的IP地址(A记录),没有找到。
步骤3:因为DNS服务器172.16.200.30上没有查询到信息,这个DNS服务器发送请求到一台根服务器查询答案。这里的一个重要事实在于,根服务器只支持迭代查询。
步骤4:DNS根服务器返回一组DNS服务器地址,这些服务器负责处理.com顶级域名。
步骤5:我们的DNS服务器172.16.200.30将从根服务器返回的列表中选择一个顶级域名服务器继续查询www.example.com的IP地址。
步骤6:与根服务器类似,顶级域名服务器的也是迭代的。它返回给172.16.200.30另一组DNS服务器地址列表。这些DNS服务器(权威authoritative域名服务器)负责查询域名www.example.com。
步骤7:现在我们的DNS服务器将从权威域名服务器列表中选择一个IP,向其查询www.example.com的A记录。权威域名服务器查询后,回复如下的A记录:
www.example.com = <XXX:XX:XX:XX>(某个IP地址)
步骤8:DNS服务器172.16.200.30把IP、域名对(以及其他可用资源)返回给我们。现在浏览器将向给定的IP发送请求,获取网页www.example.com。
下面图表可能会使概念更清楚。 递归DNS查询 如上图所示,DNS服务器172.16.200.30代表我们向其他DNS服务器进行查询。
注:上面解释的递归查询场景之所以会发生,是因为我们的DNS服务器172.16.200.30被配置为递归DNS服务器。你也可以禁用DNS服务器的递归查询功能。
1.2 递归查询时如何选择要查询的下一个DNS服务器?
在上面的例子中你已经看到,DNS服务器172.16.200.30需要多次从一个服务器列表中选择一个服务器进行查询。
例如有13台根服务器(我们常说一共有13台根服务器。13是全部服务器地址的数量。实际上在世界各地一共有数百台服务器。这13个根服务器地址是anycaste地址),要从那个根服务器查询信息呢?
几乎所有的DNS服务器都使用某种算法从列表中进行选择,以便以便分配负载,降低响应时间。
最著名的DNS服务器软件BIND使用一种称为RTT度量(Round Trip Time metric)的技术。使用这种技术,服务器跟踪每个根服务器的往返时间,并选择RTT较低的那个。
2 什么是迭代查询或非递归查询?
在开始解释迭代查询之前,需要注意的一点是,所有DNS服务器都必须支持迭代(非递归)查询。
在迭代查询中,名字服务器不会去获取完整的答案,而是返回其他可能直到答案的DNS服务器地址。在前面的示例中,DNS服务器172.16.200.30代表我们取查询信息,并为我们提供最终结果。
但是如果我们的DNS服务器不是递归的(这意味着它是迭代的),如果答案在它的记录中,它会告诉我们答案。否则它会告诉我们根服务器的地址(它本身不会查询根服务器或其他服务器)。
现在,操作系统中解析程序的任务是查询根服务器、.COM顶级域名服务器和权威名字服务器,以获得答案。
让我们来看看所涉及的步骤。
步骤1:你在浏览器中输入www.example.com。操作系统的解析程序向DNS服务器172.16.200.30发送请求,查询A记录。
步骤2: DNS服务器172.16.200.30在接收到查询后,查看缓存表,查找www.example.com的IP地址(A记录)。但没有找到。
步骤3:现在,我们的DNS服务器不再查询根服务器,而是把根服务器列表返回给我们。操作系统的解析程序将查询根服务器,寻求答案。
接下来的步骤同上文一样。迭代查询的唯一区别是:
- 如果DNS服务器没有答案,它将不会向其他服务器查询答案,而是返回DNS根服务器的地址。
- 如果DNS服务器有答案,它将返回答案(这在迭代查询和递归查询中是一样的)。
- 在迭代查询中,从其他DNS服务器中查询答案的任务由操作系统的解析程序完成。
迭代DNS查询 从上图可以清楚地看出,在迭代查询中,DNS服务器不会为你向其他服务器查询答案(但如果已经有答案,则会告诉你答案)。但是会告诉你的解析程序其他DNS服务器的地址(在我们的例子中是根服务器地址)。
我们将在另一篇文章中讨论反向查询。希望这篇文章有助于理解迭代(非递归)和递归DNS查询。