我正在尝试理解迭代和递归 DNS 查找之间的区别。从根本上讲,我认为迭代就像是打电话给一家百货公司寻找产品,如果他们没有产品,他们会给你另一家分店的号码,然后你自己打电话给另一家分店。而递归就像是打电话给百货公司,如果他们没有你想要的产品,他们代表您致电其他分支机构寻找产品。问题是,当涉及到 DNS 时,我对此有不同的看法。当我想到递归时,我会想到类似以下内容的东西:
但在阅读网络上的文章时,甚至在谷歌图片搜索中DNS 递归,我看到更多类似这样的例子:
对我来说,第二个示例看起来更像是迭代的,而不是递归的,因为每个“其他 DNS 服务器”都在告诉“首选 DNS 服务器”下一台要查找的机器的地址,而不是代表首选 DNS 服务器进行查找。我看到的唯一递归元素是首选 DNS 服务器代表 DNS 客户端进行查找,但从这里开始,它看起来肯定是迭代的。
所以我想我的问题是,“递归”DNS查找是否真的只意味着首选DNS服务器代表客户端执行某些操作的递归,但从现在开始实际上是迭代的?我看到的大多数结果谷歌图片搜索让我相信这一点,那么这就引出了一个问题,这篇文章中的第一张图片是否完全是错误的?
答案1
您的最后一段是正确的。
客户端在 DNS 请求标头中发送的“所需递归”(RD)标志(参见 RFC 1035)要求服务器“请给我这个问题的完整答案”。
该服务器比反复地向名称服务器链询问正确答案。这些查询本身不应该设置 RD 位。
最终,递归服务器的响应将设置“递归可用”(RA)标志,表明答案确实已完全回答。相反,权威性服务器将不会设置 RA 标志。
恕我直言,这是一个糟糕的术语选择。
不管怎样,你找到的第一张图从根本上就是错误的。根服务器不是对任何其他服务器执行查询,它们仅向其他服务器发出引用。
答案2
据我所知,“递归查找”完全是从原始查询者的角度来看的。因此,如果它询问 DNS 服务器并得到完全解析的答案,那么它就是“递归查询”。如果该服务器反过来进行递归或迭代查找,那么原始查询者就不必关心了。
答案3
您的问题中的两个图表中的第一个是错误的。根服务器不会向其他服务器发送查询。如果根服务器确实像该图所示那样转发查询,则 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.net
是 的权威服务器example.microsoft.com
。
此时,DNS递归器必须先解析,ms.example.net
然后才能继续解析example.microsoft.com
。
为了解析一个主机名,它首先必须解析另一个主机名。这就是递归。为了不导致无限递归,DNS 具有粘合记录,NS
在某些情况下,这些记录会与记录一起发送。