谁真正在递归DNS查找中“递归”?


16

我试图了解迭代和递归DNS查找之间的区别。从根本上讲,我认为迭代就像打电话给百货公司寻找产品一样,当他们没有产品时,他们会给您另一个分支机构的电话号码,然后您自己给另一个分支机构打电话。相对于递归而言,这就像给百货商店打电话,而当他们没有您要的东西时,他们会代表您呼叫另一个分支以寻找产品。事实是,在DNS方面,我对此有不一致的看法。当我想到递归时,我想到的是这样的: 替代文字

但是,尽管在网上阅读文章,甚至在Google图像上搜索DNS递归,我还会看到更多类似以下的示例: 替代文字

在我看来,第二个示例比递归看起来更具迭代性,因为每个“其他DNS服务器”都在告诉“首选DNS服务器”要查找的下一台计算机的地址,而不是代表首选计算机DNS服务器。我看到的唯一递归元素是首选DNS服务器代表DNS客户端进行查找,但是从这里开始,它肯定看起来是迭代的。

因此,我想我的问题是,“递归” DNS查找是否真的就意味着首选DNS服务器代表客户端做某事的意义上是递归的,但是从此以后真的是迭代的?我在Google图片搜索中看到的大多数结果都使我相信这一点,这又引出了一个问题,即帖子中的第一张图片是否完全错误?


退房询问DNS先生播客,娱乐,信息,和他们一直管理DNS为自1989年以来,独着或合着每O'Reily DNS书等ask-mrdns.com了解更多比你想要知道的。
罗纳德·帕托

Answers:


16

您的最后一段是正确的。

客户端在DNS请求标头中发送的“所需的递归”(RD)标志(请参阅RFC 1035)询问服务器“请给我该问题的完整答案”。

然后,该服务器会反复请求名称服务器链提供正确答案。这些查询本身不应该设置RD位。

最终,递归服务器的响应将设置“递归可用”(Recursion Available)(RA)标志,表明答案确实已完全回答。相反,权威服务器将不会设置RA标志。

恕我直言,这是一个糟糕的术语选择。

就其价值而言,您发现的第一张图根本上是错误的。根服务器不对任何其他服务器执行查询,它们仅向其他服务器发出引用。


4

据我了解,“递归查找”仅是从原始查询器的角度来看的。因此,如果它询问DNS服务器并获得完全解析的答案,则它是“递归查询”。如果该服务器又进行递归或迭代查找,那么原始查询器就不必担心了。


1

您问题中的两个图表中的第一个是不正确的。根服务器不会将查询发送到其他服务器。如果根服务器实际上进行了如该图所示的转发查询,则DNS系统将比实际更容易受到DoS攻击。

第二张图大部分是正确的,但过于简化,无法向您展示查找的递归性质。该图仍然足够详细,尽管我们可以指出递归发生的位置。

DNS服务器的数字旁边的12一记Preferred DNS server就是递归发生。术语首选DNS服务器是不是标准术语。该服务器通常被称为缓存DNS递归或它的某种缩写。

在查看网络流量时,的确确实是迭代的。递归完全在DNS递归内部。如果您查看DNS递归的实现,则会发现一些处理请求的递归结构。

如果实现使用每个请求的线程,并且查找是使用递归函数调用实现的,则递归很容易发现。但是更高效的设计不针对每个请求使用线程,而是在DNS递归使用的数据结构内找到递归。

需要递归的原因是由于如何实现权威DNS服务器之间的引用。最好用一个例子说明。在该图中,您看到的权威DNS服务器microsoft.com指向的权威DNS服务器example.microsoft.com。这是通过使用NS指向主机名的记录来完成的。因此,例如,的权威服务器microsoft.com可以告诉DNS递归ms.example.netexample.microsoft.com

到那时,DNS递归必须先解析,ms.example.net然后才能继续解析example.microsoft.com

为了解析一个主机名,它首先必须解析另一个主机名。那就是递归。为了避免这种情况导致无限递归,DNS具有粘合记录,该NS记录在某些情况下会与记录一起发送。


这有很多错误。术语“递归”的使用与是否使用“递归函数调用”无关-Vatine的答案更接近-递归只是客户端向服务器请求完整的已解决答案时的(较差的选择)名称。所谓的“递归服务器”使用的机制实际上称为迭代。另外,粘贴记录并不是为了防止“无限递归”,它们是为了防止“鸡和蛋”问题,即如果这些服务器位于委托域的空间内,则如何查找名称服务器的地址。
Alnitak

@Alnitak DNS解析本质上是递归的。通过将执行堆栈转换为不同的数据结构,可以将任何递归算法转换为迭代算法。我的回答中已经提到了这种可能性。您提到的循环依赖问题与无限递归没有什么不同。两者确实是同一回事。如果要应用朴素的递归算法而没有注意到基础任务遭受循环依赖,则结果将是无限递归。
卡巴斯德,2015年

@Alnitak您无法摆脱递归堆栈,而反复执行DNS解析,一次只能跟踪恒定数量的DNS名称。您可以用看起来不同的数据结构表示递归堆栈,但是它本质上仍然是递归的。可以以一种将递归深度保持为一的方式配置域名。但是,并非所有域名都以这种方式配置。
卡巴斯德(Kasperd),2015年

我引用RFC 1034-“” 处理此问题的两种通用方法是“递归”和“迭代”,其中第一台服务器在另一台服务器上查询客户端的查询,其中服务器将客户端引向另一台服务器。服务器并让客户端进行查询。“”它与“堆栈”或“数据结构” 无关
Alnitak 2015年

@Alnitak该段所指的递归与我的答案不同。我的答案中提到的递归是(如我的答案中明确指出的)在一台特定DNS服务器内部。如果您实际上尝试以完全迭代的方式实现DNS递归,则它将永远无法工作。一旦收到不带相关胶水的NS记录的回复,您必须先查找该NS记录指向的主机名的IP地址,然后才能继续使用原始解析。
卡巴斯德(Kasperd)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.