JAVA面试题分享八十九:DNS迭代和递归的区别?

一、什么是DNS

域名系统 (DNS) 将人类可读的域名 (例如,www.amazon.com) 转换为机器可读的 IP 地址 (例如,192.0.2.44)。

DNS 服务的类型

权威 DNS(Authoritative DNS):处于 DNS 服务端的一套系统,该系统保存了相应域名的权威信息。权威 DNS 即通俗上“这个域名我说了算”的服务器。权威 DNS 包含 DNS 查询的最终答案,通常是 IP 地址。客户端(例如移动设备、在云中运行的应用程序或数据中心中的服务器)实际上并不直接与权威 DNS 服务通信,但极少数情况例外。如 Amazon Route 53、Aliyun 云解析、Azure DNS zone、Google Cloud DNS 等服务都是一种权威型 DNS。

递归 DNS(Recursive DNS):又叫 LocalDNS。递归 DNS 可以理解为是一种功能复杂些的 resolver,其核心功能一个是缓存、一个是递归查询。收到域名查询请求后其首先看本地缓存是否有记录,如果没有则一级一级的查询根、顶级域、二级域……直到获取到结果然后返回给用户。日常上网中运营商分配的 DNS 即这里所说的递归 DNS。递归型 DNS 服务就像是旅馆的门童:尽管没有任何自身的 DNS 记录,但是可充当代表您获得 DNS 信息的中间程序。如 Route 53 解析程序、Google Public DNS(8.8.8.8)、114dns(114.114.114.114) 等是一种公共 DNS 服务,也是递归 DNS 服务。

二、DNS 查询流程

下图概述了递归型和权威型 DNS 服务如何协同工作以将终端用户路由到您的网站或应用程序。

带你深入了解 DNS 解析原理-递归与迭代_递归

  1. 用户打开 Web 浏览器,在地址栏中输入 www.example.com,然后按 Enter 键。
  2. www.example.com 的请求被路由到 DNS 解析程序,这一般由用户的互联网服务提供商 (ISP) 进行管理,例如有线 Internet 服务提供商、DSL 宽带提供商或公司网络。
  3. ISP 的 DNS 解析程序将 www.example.com 的请求转发到 DNS 根名称服务器。
  4. ISP 的 DNS 解析程序再次转发 www.example.com 的请求,这次转发到 .com 域的一个 TLD 名称服务器。.com 域的名称服务器使用与 example.com 域相关的四个 Amazon Route 53 名称服务器的名称来响应该请求。
  5. ISP 的 DNS 解析程序选择一个 Amazon Route 53 名称服务器,并将 www.example.com 的请求转发到该名称服务器。
  6. Amazon Route 53 名称服务器在 example.com 托管区域中查找 www.example.com 记录,获得相关值,例如,Web 服务器的 IP 地址 (192.0.2.44),并将 IP 地址返回至 DNS 解析程序。
  7. ISP 的 DNS 解析程序最终获得用户需要的 IP 地址。解析程序将此值返回至 Web 浏览器。DNS 解析程序还会将 example.com 的 IP 地址缓存 (存储) 您指定的时长,以便它能够在下次有人浏览 example.com 时更快地作出响应。
  8. Web 浏览器将 www.example.com 的请求发送到从 DNS 解析程序中获得的 IP 地址。这是您的内容所处位置,例如,在 Amazon EC2 实例中或配置为网站端点的 Amazon S3 存储桶中运行的 Web 服务器。
  9. 192.0.2.44 上的 Web 服务器或其他资源将 www.example.com 的 Web 页面返回到 Web 浏览器,且 Web 浏览器会显示该页面。

递归查询与迭代查询

递归查询:主机向本地域名服务器的查

递归查询:主机向本地域名服务器的查询一般都是采用递归查询。如果主机所询问的本地域名服务器不知道被查询的域名的 IP 地址,那么本地域名服务器就以 DNS 客户的身份,向其它根域名服务器继续发出查询请求报文(即替主机继续查询),而不是让主机自己进行下一步查询。因此,递归查询返回的查询结果或者是所要查询的 IP 地址,或者是报错,表示无法查询到所需的 IP 地址。

迭代查询:一般DNS服务器之间属迭代查询,如:若 DNS2 不能响应 DNS1 的请求,则它会将 DNS3 的 IP 给 DNS2,以便其再向 DNS3 发出请求。

理论上讲域名查询有两种方式:

迭代查询 A问B一个问题,B不知道答案说你可以问C,然后A再去问C,C推荐D,然后A继续问D,如此迭代…

递归查询 A问B一个问题,B问C,C问D… 然后D告诉C,C告诉B,B告诉A

上图中的 1-2 为递归查询,3-6 为迭代查询。

三、智能 DNS 解析

传统 DNS 解析,不判断访问者来源,会随机选择其中一个 IP 地址返回给访问者。而智能 DNS 解析,会判断访问者的来源,为不同的访问者智能返回不同的 IP 地址,可使访问者在访问网站时可获取用户指定的 IP 地址,能够减少解析时延,并提升网站访问速度的功效。

edns-client-subnet(ECS)

在之前,它使用 DNS 解析器(LocalDNS)的 IP 地址对内容进行 DNS 查询。在特定解析器具有单一固定地理位置的时代,此模型运行良好。今天,许多流行的 DNS 解析器在地理上分散(Google DNS 和 OpenDNS 是两个很好的例子),并且特定解析器的位置不再是客户端位置的准确预测器。如果对内容的请求被路由到比需要更远的边缘位置,这可能会导致性能欠佳,因此 Google 提交了一份 DNS 扩展协议,允许 DNS resolver 传递用户的 IP 地址给 authoritative DNS server。

DNS 协议的 EDNS-Client-Subnet 扩展通过返回附加信息以响应 DNS 查询来解决此问题。该信息允许内容交付网络做出更好的决策。此扩展是作为 Faster Internet 项目的一部分开发的。

四、JAVA中迭代和递归的区别

1.含义不同

递归是重复调用函数自身实现循环。遇到满足终止条件的情况时逐层返回来结束

迭代是函数内某段代码实现循环,循环代码中参与运算的变量同时是保存结果的变量,当前保存的结果作为下一次循环计算的初始值。迭代则使用计数器结束循环。

2.结构不同

递归与迭代都是基于控制结构,都涉及重复结构

迭代用重复结构,迭代显式使用重复结构

递归用选择结构,递归通过重复函数调用实现重复

3.终止条件不同

迭代在循环条件失败时终止,迭代一直修改计数器,直到计数器值使循环条件失败;

递归在遇到基本情况时终止,使用计数器控制重复的迭代和递归都逐渐到达终止点(递归不断产生最初问题的简化副本,直到达到基本情况。)

4.小结

迭代法也称辗转法,是一种不断用变量的旧值递推新值的过程。让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值。

代码实现:不断重复调用某个方法,符合一定条件后,计算出结果值。常见的累加,累乘都是迭代算法策略的基础应用。

递归算法:实现思想一样,重复的调用方法。好理解,JVM运行慢

迭代算法:实现思想一样,重复的调用某段代码。不好理解,JVM运行快

实际:解决思路为第一!

迭代大部分时候需要人为的对问题进行剖析,将问题转变为一次次的迭代来逼近答案。迭代不像递归一样对堆栈有一定的要求,另外一旦问题剖析完毕,就可以很容易的通过循环加以实现。迭代的效率高,但却不太容易理解,当遇到数据结构的设计时,比如图‘表、二叉树、网格等问题时,使用就比较困难,而是用递归就能省掉人工思考解法的过程,只需要不断的将问题分解直到返回就可以了。

总结:迭代更为底层一些;递归更为高级一些,更抽象一些;所以,有“迭代为人,递归为神”的说法。

下面用表格再总结一下:

递归迭代
定义函数调用自身。重复执行的一组指令。
应用对于功能。对于循环。
终止通过 base case,这里不会有函数调用。当不再满足迭代器的终止条件时。
用法当代码大小需要很小并且时间复杂度不是问题时使用。当时间复杂度需要与扩展的代码大小进行平衡时使用
代码大小更少的代码更多的代码
时间复杂度非常高(通常是指数)的时间复杂度。时间复杂度相对较低(一般为多项式-对数)。
空间复杂度空间复杂度高于迭代。空间复杂度较低。
这里的栈是用来存放函数调用时的局部变量的。不使用堆栈。
速度执行速度很慢,因为它有维护和更新堆栈的开销。通常,它比递归更快,因为它不使用堆栈。
存储与迭代相比,递归使用更多内存。没有开销,因为迭代中没有函数调用。
高架拥有重复函数调用的开销。没有开销,因为迭代中没有函数调用。
无限重复如果递归函数不满足终止条件或未定义或从未达到基本情况,则会导致堆栈溢出错误,并且系统有可能在无限递归中崩溃。如果迭代语句的控制条件永远不为假或控制变量没有达到终止值,就会造成死循环。在无限循环中,它一次又一次地使用 CPU 周期。
  • 16
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
归和代是两种常见的解决问的编程方法,它们在处理数据结构和算法时有着不同的执行机制和理解方式。 **归**: 归是一种通过将大问分解为更小的相同或类似子问,并调用自身来解决这些子问的过程。它通常涉及一个函数(或方法)调用自身,并在每次调用时处理规模更小的问,直到达到基本情况(也称为归基或终止条件),然后逐级返回结果。归的一个关键特征是每次调用都需要保存状态以便于后续恢复。 **代**: 代则是在循环结构中解决问,通常使用循环(如for、while等)来逐步执行一系列步骤,每次代都会更新当前状态,直到达到预设的终止条件。代不需要函数调用自身,而是直接在循环内部完成任务,没有明确的“归”过程。 **区别**: 1. **思维方式**:归是自上而下的,像倒推游戏一样;代则是自底向上的,像爬楼梯一样。 2. **效率**:归可能会导致大量的函数调用开销,如果归深度过深可能导致栈溢出;而代通常更节省内存。 3. **控制流**:归依赖于函数返回和调用,易于理解和表达问的本质;代则更加直观,便于实现复杂的数据结构遍历。 4. **语言支持**:并非所有编程语言都对归有良好的支持,一些有限制的语言可能需要特殊技巧或库来避免栈溢出。 **相关问**: 1. 归是如何避免无限循环的? 2. 什么情况下适合使用代而非归? 3. 归和代哪种更容易理解和调试?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

之乎者也·

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值