Sockets 递归和迭代dns查找之间的区别

Sockets 递归和迭代dns查找之间的区别,sockets,dns,Sockets,Dns,我正在通过直接发送dns消息来制作一个解析器和一个名称服务器程序,而不使用dns库(如netdb.h)。但我没有什么问题。据我所知,当我们发送递归请求时,被查询的名称服务器会为我们找到记录。nameserver用于查询其他服务器的查询是否类似于迭代查询?至少这些图片表明了这一点 我还搞不清楚客户机是可以执行迭代查询,还是只有名称服务器可以执行迭代查询 递归dns查找: 迭代dns查找: 客户机当然可以自己进行迭代查询,而无需咨询递归解析器,但有很多理由不这样做: 简化每个主机上存根解析器库(

我正在通过直接发送dns消息来制作一个解析器和一个名称服务器程序,而不使用dns库(如netdb.h)。但我没有什么问题。据我所知,当我们发送递归请求时,被查询的名称服务器会为我们找到记录。nameserver用于查询其他服务器的查询是否类似于迭代查询?至少这些图片表明了这一点

我还搞不清楚客户机是可以执行迭代查询,还是只有名称服务器可以执行迭代查询

递归dns查找:

迭代dns查找:

客户机当然可以自己进行迭代查询,而无需咨询递归解析器,但有很多理由不这样做:

  • 简化每个主机上存根解析器库(例如libresolv或内置于libc中)中需要存在的软件的复杂性
  • 将迭代查询委托给ISP网络中的服务器或更靠近“主干网”的服务器,后者将具有更好的Internet连接(最重要的是,更低的延迟),并且可以更快地完成迭代查询
  • 将许多最终用户的DNS查询聚合到少量缓存解析程序上。大多数情况下,解析程序不必执行完整的迭代查询:它们将缓存部分或全部结果
  • 减少“提示”文件(根名称服务器及其IP地址的列表)的部署位置,这是引导递归解析器所必需的
DNSSEC在这方面遇到了麻烦:使用DNSSEC,最终用户必须执行完整的迭代查询才能验证结果。大规模部署支持DNSSEC的解析程序将如何进行尚不清楚。

任何DNS客户端(或“解析程序”)都可以执行迭代查询

不过,根据定义,执行迭代查询的解析器是递归解析器,而不是存根解析器

存根解析器通常实现为库,直接链接到可执行文件中


但是,也可以将一个完整的递归解析器构建为一个独立的库
libunbound
是一个特别好的例子。

递归查询:-DNS服务器可能会代表您发送internet上其他DNS服务器的查询以获取答案。代理服务器会将查询发送到主服务器以获取答案

在迭代查询中,名称服务器不会为您的查询获取完整答案,但会返回对其他DNS服务器的引用,这些DNS服务器可能有答案。
除非代理服务器给出在其他服务器中搜索的答案,否则代理服务器会给出答案,这是很好的解释,尽管DNSSEC部分是绝对错误的。DNSSEC解析过程与不使用DNSSEC的过程完全相同。要验证DNSSEC结果,您必须沿着信任链一直到根(或另一个受信任的锚)。为了做到这一点,您最终将迭代地执行与迭代解析过程最初要求的几乎相同的查询。没有DNSSEC,您遵循委托链,使用DNSSEC,您遵循委托链和信任链,但本质上是同一条链。DNSSEC只在同一个过程中添加额外的信息。我们说的是同一件事(“本质上是同一条链”)。我只是补充一点,验证存根解析器不能信任一些随机的外部(可能是ISP的)DNS服务器来执行验证,所以它必须自己完成。不久前。与转发器通信的验证存根需要发送带有
CD=1
的查询,以确保它在不经过递归服务器预验证的情况下获取链。您的第一种情况不是迭代的,或者至少是
混合的
DNS方案吗?一个纯粹的递归方案不会遵循这样的路径:computer->localDNS server->Root->.com->contoso.com,那么contoso.com会一直返回ip吗?