例详解dns递归和迭代查询原理及过程

例详解dns递归和迭代查询原理及过程
例详解dns递归和迭代查询原理及过程

例详解dns递归和迭代查询原理及过程

在互联网中,一个域名的顺利解析离不开两类域名服务器,只有由这两类域名服务器可以提供“权威性”的域名解析。

第一类就是国际域名管理机构,也就InterNIC,主要负责国际域名的注册和解析,第二类就是国内域名注册管理机构,在中国就是 CNNIC了,主要负责国内域名注册和解析,当然,尽管分为国际和国内,但两者一主一辅,相互同步信息,毕竟最终的目的是在全球任何一个有网络的地方都可以顺利访问任何一个有效合法的域名,其间的联系就可见一斑了。

有的朋友可能会有这个疑问,域名服务器不是有很多吗?为什么说只有2类呢?是的,ISP何其多?当我们输入某一网址(或域名),系统将这个域名发送至需要将其当前已配置的DNS服务器,以便转换为IP地址进行访问,通常会是当地的公共DNS服务器(内网环境可能直接提交到防火墙或路由器上做进一步转发处理)。公网DNS服务器收到此请求后,并非立刻处理,比如转发至上一级的DNS服务器(在第一节讲过DNS有着很严格的逻辑层次关系),而是首先会查看自己的DNS缓存,如果有这个域名对应的IP,则直接返回给用户,系统收到这个IP后交给浏览器做进一步处理。在这个轮回的过程中,客户端所得到的DNS的回复就是“非权威的性”的,也就是说这个结果并不是来自这个域名所直接授权的DNS服务器,而是该记录的副本。简单的说,“非权威性”的应答是从别的 DNS服务器上复制过来的,与之对应的,就是“权威性”应答则是由域名所在的服务器作出的应答,听起来似乎不易理解,我们来看一个例子。

我所在地是深圳,这里的公共DNS服务器是202.96.134.133,我们来检测一下。

如下图:

这里用到了nslookup命令,用来查询当前本机解析域名所依赖的DNS服务器,从上图中文名可以得知当前默认的DNS解析服务器是 https://www.360docs.net/doc/876662206.html,,对应的IP地址为202.96.134.133,也就是说在这台机子上运行的网络程序,如果需要用到DNS域名解析的,都会将请求到这个服务器上,寻求解析。

当然,如果你是在内网,或是其他类型的局域网,在解析时候可能无法顺利得到上图的结果,多半是代理或防火墙的缘故。建议ADSL用户可以自测一下,加深印象。现在,我们来解析一个网站的别名记录,以此来了解一下何为“非授权记录”

以网易为例吧。如下图:

依照上图步骤就完成了一次CNAME记录的查询,通过这次小测试,希望大家注意一下几点:

1、查询的命令不仅这一种,我们还可以用命令nslookup -qt=cname https://www.360docs.net/doc/876662206.html, ,返回的结果是一样的。

2、查询的对象需要是一个完整的URL地址,而并非域名,如果想查询对象写出https://www.360docs.net/doc/876662206.html,,则默认值返回https://www.360docs.net/doc/876662206.html,这个域的ns记录。

如下图:

https://www.360docs.net/doc/876662206.html,的子域名还有很多,不同的子域名可能对应不用的NS服务器,这样做的目的是可以更快的相应客户请求,这就用到的服务器的均衡负载技术了。所以网易的NS服务器也肯定不只这一个。可以用命令来证实,如下图:

从上图可知,网易的NS服务器至少有2台。

以上所有的信息都是“非权威性”的回应,换句话说,这些记录都保存在深圳的这台DNS服务器上,刚才查询的所有结果均来源于此,自然都是副本信息。

那如何才能找到最原始的解析记录呢?要想揭开这个疑难,我们需要对DNS 的查询原理有一定的认识。下面是是DNS查询的大致步骤:

1>首先,客户端提出域名解析请求(无论以何种形式或方法),并将该请求发或转发给本地的DNS服务器。

2>接着,本地DNS服务器收到请求后就去查询自己的缓存,如果有该条记录,则会将查询的结果返回给客户端。(也就是我们看到的““非权威性”的应答”)。

请注意,下面就开始递归查询了:

反之,如果DNS服务器本地没有搜索到相应的记录,则会把请求转发到根DNS(13台根D NS服务器的IP信息默认均存储在DNS服务器中,当需要时就会去有选择性的连接)。

3>然后,根DNS服务器收到请求后会判断这个域名是谁来授权管理,并会返回一个负责该域名子域的DNS服务器地址。比如,查询https://www.360docs.net/doc/876662206.html,的IP,根DNS服务器就会在负责.co m顶级域名的DNS服务器中选一个(并非随机,而是根据空间、地址、管辖区域等条件进行筛选),返回给本地DNS服务器。可以说根域对顶级域名有绝对管理权,自然也知道他们的全部信息,因为在DNS系统中,上一级对下一级有管理权限,毫无疑问,根DNS是最高一级了。

4>本地DNS服务器收到这个地址后,就开始联系对方并将此请求发给他。负责.com域名的某台服务器收到此请求后,如果自己无法解析,就会返回一个管理.com的下一级的DNS服务器地址给本地DNS服务器,也就是负责管理https://www.360docs.net/doc/876662206.html,的DNS。

5> 当本地DNS服务器收到这个地址后,就会重复上面的动作,继续往下联系。

6> 不断重复这样的轮回过程,直到有一台DNS服务器可以顺利解析出这个地址为止。在这个过程中,客户端一直处理等待状态,他不需要做任何事,也做不了什么。

7> 直到本地DNS服务器获得IP时,才会把这个IP返回给客户端,到此在本地的DNS服务器取得IP地址后,递归查询就算完成了。本地DNS服务器同时会将这条记录写入自己的缓存,以备后用。

到此,整个解析过程完成。

客户端拿到这个地址后,就可以顺利往下进行了。但假设客户端请求的域名根本不存在,解析自然不成功,DNS服务器会返回此域名不可达,在客户端的体现就是网页无法浏览或网络程序无法连接等等。

下节中,我将以图解的方式将这个过程体现出来,便于大家形象化的理解递归查询的过程,谢谢。

上节里,我们用文字的形式大致描述了DNS解析的过程,为了更好的帮助大家理解整个解析过程,我做了一张DNS域名解析的分步图,如下:

在这个图里,通过8个步骤的解析过程就使得客户端可以顺利访问https://www.360docs.net/doc/876662206.html, 这个域名,但实际应用中,通常这个过程是非常迅速的,主要由几个方面的原因所决定。1、客户端网络状况是否良好,2、与本地DNS连接的速度是否优秀,3、本地DNS上是否有访问地址的缓存等等,如果以上的因素答案都是肯定的,那么访问就会很迅速,上图的步骤也会骤减至2个,因为有缓存,所以本地 DNS服务器会很快告之域名对应的IP而实现迅速访问。

上图中出现了2个陌生的列表,下面就说说这两张表的来历。这里我们结合第九章的内容继续讲解DNS的高级属性,如下图:

可以看到,在【根提示】选项卡中列出了13台根服务器,分别是

(a~m)https://www.360docs.net/doc/876662206.html,和对应的IP地址,有的是2个IP,后面那个是备选地址,我们可以手动修改这些地址,但一般情况下,建议不要去动它。如果不小心更改或者删除,我们还是有几个办法修复的。因为这些服务器的地址列表是整个互联网共享的,所以我们可以在网络上找到最新的根服务器列表。通常在这个链接里:

ftp://https://www.360docs.net/doc/876662206.html,/domain/named.root ,也可以通过直接从网络上复制。如下图:

在服务器IP地址里,我们可以输入13个地址中的任意一个,确定后系统会自动连接到该服务器上更新列表。也并非13个地址中的一个,如果同网段内有冗余DNS,这里就可以输入那台DNS的地址,也是可以更新的。前提是,两台DNS服务器都必须连接到互联网。当然在DNS的安装目录下的 CACHE.DNS文件中也是可以找到的,具体路径如下:C:\WINDOWS\system32\dns\CACHE.DNS。以上的方法都可以恢复这个列表。

在回到第一个图中,当本地DNS服务器向根DNS查询时,它会搜索自己的根DNS服务器列表,找到一个连接的地址,比如d.root- https://www.360docs.net/doc/876662206.html,,这样就联系到了根服务器,当然,连接其他的也可以,没有太大区别。根服务器检测到是.com域名后,就返回给本地DNS服务器一个IP地址,这个IP就是负责.com 顶级域名的其中一个服务器,我这里选的是https://www.360docs.net/doc/876662206.html,,同样的,一共有13台这样的服务器负责.com域名的解析,即(a~m)https://www.360docs.net/doc/876662206.html,。可能有的朋友疑问,这个是这么知道?OK,要解这部分内容,我们需要用到另一个工具dig,这个原本是Linux下的DNS服务器的调试工具,类似windows下的nslookup,但功能上比后者强很多,我们先做个演示,至于如何使用,后面会有章节来描述。

我们用dig命令来跟踪一下到https://www.360docs.net/doc/876662206.html,网站的整个过程,如下图:

图中提到的gTLD,其实这是顶级域名的一个分类,除此之外还有ccTLD,也就是国家及地区代码顶级域名,即CountryCodeTLD,比如.cn表示中国.hk,表示香港等。上图的4个过程其实就是我们从提交请求,到正常访问的过程。上图中还有很多参数没有说明,这部分会再后面章节有详述。

现在我们再来说一下递归查询和迭代查询。

在本节的第一张图中,当本地的DNS服务器帮助客户端解析https://www.360docs.net/doc/876662206.html,这个地址的IP地址的过程中,其实有已经包含了这2类查询。从客户端到本地DNS 服务器是属于递归查询。而DNS服务器之间就是的交互查询就是迭代查询。

我们模拟一个场景。比如你的老板要去喜来登大酒店,但不知道怎么走,于是问你(你是他的秘书),此时你也不知道,于是问张三,张三也不清楚,让说让你去问李四,于是你问李四,李四正好知道,然后把线路告诉你,然后你把结果告诉你老板,这样整个问询就完成了。那么这就是个递归的过程。在这个过程中,老板始终在等待你的答案,而自己却丝毫不关心这档子事,而你就充当

了一个代理和中间人的角色,来全权负责此时,你的目的是要把答案找到并反馈给老板。

你、张三、李四这三个人之间的信息传递,就是迭代的过程,因为你在问张三的时候,张三并没有像你代替你老板一样去问别人,而只是返回给你一个参考答案。这样的问询方式,我们就称之为迭代查询。

在默认情况下DNS服务器可以接受来自其他客户机(或其他DNS服务器)的迭代或递归查询,如果流量较大的服务器通常都只接受迭代查询,比如13台根服务器。因为如果它们对每一个解析请求都代为查询的话,那将会消耗极大的服务器资源,可能会导致服务器过载甚至崩溃。

关于DNS的迭代和递归查询我们先聊到这里。

递归与循环的优缺点

递归与循环的优缺点(转载) 2011-08-24 17:49:40| 分类:算法数据结构| 标签:|字号大中小订阅 递归的话函数调用是有开销的,而且递归的次数受堆栈大小的限制。 以二叉树搜索为例: bool search(btree* p, int v) { if (null == p) return false; if (v == p->v) return true else { if (v < p->v) return search(p->left, v); else return search(p->right, v); } } 如果这个二叉树很庞大,反复递归函数调用开销就很大,万一堆栈溢出怎么办?现在我们用循环改写: bool search(btree* p, int v) { while (p) { if (v == p->v) return true; else { if (v < p->v) p = p->left; else p = p->right; } }

return false; } --------------------------------------------------------------------------------------------------------- 递归好处:代码更简洁清晰,可读性更好 递归可读性好这一点,对于初学者可能会反对。实际上递归的代码更清晰,但是从学习的角度要理解递归真正发生的什么,是如何调用的,调用层次和路线,调用堆栈中保存了什么,可能是不容易。但是不可否认递归的代码更简洁。一般来说,一个人可能很容易的写出前中后序的二叉树遍历的递归算法,要写出相应的非递归算法就比较考验水平了,恐怕至少一半的人搞不定。所以说递归代码更简洁明了。 递归坏处:由于递归需要系统堆栈,所以空间消耗要比非递归代码要大很多。而且,如果递归深度太大,可能系统撑不住。 楼上的有人说: 小的简单的用循环, 太复杂了就递归吧,,免得循环看不懂 话虽然简单,其实非常有道理:对于小东西,能用循环干嘛要折腾?如果比较复杂,在系统撑的住的情况下,写递归有利于代码的维护(可读性好) 另:一般尾递归(即最后一句话进行递归)和单向递归(函数中只有一个递归调用地方)都可以用循环来避免递归,更复杂的情况则要引入栈来进行压栈出栈来改造成非递归,这个栈不一定要严格引入栈数据结构,只需要有这样的思路,用数组什么的就可以。 至于教科书上喜欢n!的示例,我想只是便于递归思路的引进和建立。真正做代码不可能的。 -------------------------------------------------------------------------------------------------------------------- 循环方法比递归方法快, 因为循环避免了一系列函数调用和返回中所涉及到的参数传递和返回值的额外开销。 递归和循环之间的选择。一般情况下, 当循环方法比较容易找到时, 你应该避免使用递归。这在问题可以按照一个递推关系式来描述时, 是时常遇到的, 比如阶乘问题就是这种情况。反过来, 当很难建立一个循环方法时, 递归就是很好的方法。实际上, 在某些情形下, 递归方法总是显而易见的, 而循环方法却相当难找到。当某些问题的底层数据结构本身就是递归时, 则递归也就是最好的方法了。

算法之2章递归与分治

算法分析(第二章):递归与分治法 一、递归的概念 知识再现:等比数列求和公式: 1、定义:直接或间接地调用自身的算法称为递归算法。 用函数自身给出定义的函数称为递归函数。 2、与分治法的关系: 由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供了方便。在这种情况下,反复应用分治手段,可以使子问题与原问题类型一致而其规模却不断缩小,最终使子问题缩小到很容易直接求出其解。这自然导致递归过程的产生。分治与递归经常同时应用在算法设计之中,并由此产生许多高效算法。 3、递推方程: (1)定义:设序列01,....n a a a简记为{ n a},把n a与某些个() i a i n <联系起来的等式叫做关于该序列的递推方程。 (2)求解:给定关于序列{n a}的递推方程和若干初值,计算n a。 4、应用:阶乘函数、Fibonacci数列、Hanoi塔问题、插入排序 5、优缺点: 优点:结构清晰,可读性强,而且容易用数学归纳法来证明算法的正确性,因此它为设计算法、调试程序带来很大方便。 缺点:递归算法的运行效率较低,无论是耗费的计算时间还是占用的存储空间都比非递归算法要多。 二、递归算法改进: 1、迭代法: (1)不断用递推方程的右部替代左部 (2)每一次替换,随着n的降低在和式中多出一项 (3)直到出现初值以后停止迭代 (4)将初值代入并对和式求和 (5)可用数学归纳法验证解的正确性 2、举例: -----------Hanoi塔算法----------- ---------------插入排序算法----------- ()2(1)1 (1)1 T n T n T =?+ = ()(1)1 W n W n n W =?+? (1)=0

第二章 迭代法的一般原理

第二章 迭代法的一般原理 非线性方程组无论从理论上还是计算方法上,都比线性方程组复杂得多。一般的非线性方程组很难求出解析解,往往只能求出其数值解,且往往只能借助于迭代法。本章我们将讨论迭代法的一般原理、迭代法的一般构造及迭代收敛速度的衡量标准。 2-1 迭代法与不动点定理 设n n R R D →?:f ,考虑方程 ()0=x f (2-1) 若存在D *∈x ,使()0=*x f ,则称*x 为方程(2-1) 的解。 用迭代法求解(2-1) ,先将(2-1)化为等价的方程 ()x g x = (2-2) 这里映象n n R R D →?:g 。 方程(2-2)的解*x (即()**x g x =)称为映象g 的不动点。因此用迭代法解方程(2-1),就是求(2-2)中映象g 的不动点。这样以及g 是否存在不动点自然就是我们关心的问题。 定理2-1 若n n R R D →?:g 为有界闭集D D ?0上的严格非膨胀映象,()00D D ?g ,则g 在0D 内有唯一不动点。 证 唯一性 设g 在0D 内至少有两个不动点1x ,2x ,则 ()() 2121x x x g x g x x 21-≤-=-α 因1<α,所以由上式推得21x x =。唯一性得证。 记()()x g x x -=?,由g 及泛数的连续性可知1:R R D n →??连续。因0D 为有界闭集,故?在0D 上有最小值。设0D *∈x 为最小点,即

()()x g x x -=∈min 0 D x *? 则*x 为g 的不动点。因为若不然,则有()**x g x ≠,再由g 严格非膨胀,可得 ()()()()()***x g g x g x g -=?()()***x x g x ?=-< 这与*x 为?的最小点相矛盾,故*x 为g 的不动点。 注 定理中0D 的有界闭性、g 的压缩性和g 映0D 入自身,此3个条件缺一不可。例如,()x x x g 1+=在[)+∞=,D 10上严格非膨胀,但它在0D 中却没有不动点。 下面我们介绍在应用上非常广泛的不动点定理。 定理2-2 (Brouwer 不动点定理) 设n n R R D →?:g 在有解闭凸集D D ?0上连续,且()00D D G ?,则g 在0D 至少有一个不动点。 本定理在一维情形下叙述为:[]b a f ,: []b a ,→则f 在[]b a ,中至少有一个不动点。几何解释见图2-1。 x b a 图2-1 一维Brouwer 定理

归并排序算法实现 (迭代和递归)

归并排序算法实现(迭代和递归)\递归实现归并排序的原理如下: 递归分割: 递归到达底部后排序返回: 最终实现排序: #include void merge(int *array, int low, int center, int high) { if(low >= high) return; int m = center - low + 1; int n = high - center; int L[m], R[n]; for(int i=0; i R[j]) array[k] = R[j++]; else array[k] = L[i++];

} while(i #include

迭代与递归的区别

迭代算法是用计算机解决问题的一种基本方法。它利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值。 利用迭代算法解决问题,需要做好以下三个方面的工作: 一、确定迭代变量。在可以用迭代算法解决的问题中,至少存在一个直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量。 二、建立迭代关系式。所谓迭代关系式,指如何从变量的前一个值推出其下一个值的公式(或关系)。迭代关系式的建立是解决迭代问题的关键,通常可以使用递推或倒推的方法来完成。 三、对迭代过程进行控制。在什么时候结束迭代过程?这是编写迭代程序必须考虑的问题。不能让迭代过程无休止地重复执行下去。迭代过程的控制通常可分为两种情况:一种是所需的迭代次数是个确定的值,可以计算出来;另一种是所需的迭代次数无法确定。对于前一种情况,可以构建一个固定次数的循环来实现对迭代过程的控制;对于后一种情况,需要进一步分析出用来结束迭代过程的条件。 例 1 :一个饲养场引进一只刚出生的新品种兔子,这种兔子从出生的下一个月开始,每月新生一只兔子,新生的兔子也如此繁殖。如果所有的兔子都不死去,问到第 12 个月时,该饲养场共有兔子多少只? 分析:这是一个典型的递推问题。我们不妨假设第 1 个月时兔子的只数为 u 1 ,第 2 个月时兔子的只数为 u 2 ,第 3 个月时兔子的只数为 u 3 ,……根据题意,“这种兔子从出生的下一个月开始,每月新生一只兔子”,则有 u 1 = 1 , u 2 = u 1 +u 1 × 1 = 2 , u 3 = u 2 +u 2 × 1 = 4 ,…… 根据这个规律,可以归纳出下面的递推公式: u n = u n - 1 × 2 (n ≥ 2) 对应 u n 和 u n - 1 ,定义两个迭代变量 y 和 x ,可将上面的递推公式转换成如下迭代关系: y=x*2 x=y 让计算机对这个迭代关系重复执行 11 次,就可以算出第 12 个月时的兔子数。参考程序如下: cls

C语言(迭代法与递归法)

一、用迭代法求斐波那契数列。 #include #define N 35 //定义输出项数 int main() { int f1=1,f2=1,f3=0; int i; int n=2; printf("Fibonacci数列的前%d项为:\n",N); printf("%d\t%d\t",f1,f2); for(i=3;i #include double factorial(double x) { double amass; if(x==0||x==1) amass=1; else amass=factorial(x-1)*x; //递归法求X的阶乘return amass; } int main() { double sum=0; double n=1; int sign=1; double x;

printf("输入sin(x)中的x:\n"); scanf("%lf",&x); do { sum=sum+sign*pow(x,n)/factorial(n); n=n+2; sign=-sign; }while(pow(x,n)/factorial(n)>=1e-6); printf("sin(%.2lf)=%.2lf\n",x,sum); return 0; }

迭代法

迭代方法(也称为“折返”方法)是一个过程,在该过程中,不断使用变量的旧值来递归推导新值。与迭代方法相对应的是直接方法(或称为第一求解方法),即问题已解决一次。迭代算法是使用计算机来解决问题的一种基本方式,它利用计算机的运行速度,适合于重复操作的特性,让计算机对一组指令(或步骤)必须每次都重复执行在执行的这组指令(或这些步骤)中,由于变量的原始值是新值,因此迭代方法分为精确迭代和近似迭代。典型的迭代方法(例如“二分法”和“牛顿迭代”)属于近似迭代方法。 迭代方法的主要研究主题是构造收敛的迭代方案,并分析问题的收敛速度和收敛范围。迭代方法的收敛定理可以分为以下三类:(1)局部收敛定理:假设问题的解存在,则得出结论:当初始逼近足够接近解时,迭代法收敛。 (2)半局部收敛定理:结论是,迭代方法根据迭代方法在初始逼近时所满足的条件收敛到问题的解,而不假定解的存在。 (3)大范围收敛定理:得出的结论是,迭代方法收敛到问题的解,而无需假设初始近似值足够接近解。 迭代法广泛用于求解线性和非线性方程,优化计算和特征值计算。 迭代法是一种迭代法,用于数值分析中,它从初始估计值开始寻找一系列解决问题的迭代解法(通常为迭代法),以解决问题(迭代法)。 通常,可以做出以下定义:对于给定的线性方程组(x,B和F

都是矩阵,任何线性方程组都可以转换为这种形式),公式(表示通过迭代获得的x k次,并且初始时间k = 0)逐渐替换为该方法以找到近似解,这称为迭代方法(或一阶时间不变迭代方法)。如果存在,则将其表示为x *,并称迭代方法收敛。显然,x *是该系统的解,否则称为迭代散度。 迭代方法的对应方法是直接方法(或第一种解决方法),它是对问题的快速一次性解决方案,例如通过求平方根来求解方程x + 3 = 4。通常,如果可能,直接解决方案始终是首选。但是,当我们遇到复杂的问题时,尤其是当未知数很多并且方程是非线性的时,我们无法找到直接解(例如,第五和更高阶代数方程没有解析解,请参见Abelian 定理)。时候,我们可以通过迭代的方法寻求方程(组)的近似解。 最常见的迭代方法是牛顿法。其他方法包括最速下降法,共轭迭代法,可变尺度迭代法,最小二乘法,线性规划,非线性规划,单纯形法,罚函数法,斜率投影法,遗传算法,模拟退火等。

递归算法详解完整版

递归算法详解标准化管理处编码[BBX968T-XBB8968-NNJ668-MM9N]

递归 冯文科一、递归的基本概念。 一个函数、概念或数学结构,如果在其定义或说明内部直接或间接地出现对其本身的引用,或者是为了描述问题的某一状态,必须要用至它的上一状态,而描述上一状态,又必须用到它的上一状态……这种用自己来定义自己的方法,称之为递归或递归定义。在程序设计中,函数直接或间接调用自己,就被称为递归调用。 二、递归的最简单应用:通过各项关系及初值求数列的某一项。 在数学中,有这样一种数列,很难求出它的通项公式,但数列中各项间关系却很简 a与前面临近几项之间的关单,于是人们想出另一种办法来描述这种数列:通过初值及 n 系。 要使用这样的描述方式,至少要提供两个信息:一是最前面几项的数值,一是数列间各项的关系。 比如阶乘数列 1、2、6、24、120、720…… 如果用上面的方式来描述它,应该是: a的值,那么可以很容易地写成这样: 如果需要写一个函数来求 n

这就是递归函数的最简单形式,从中可以明显看出递归函数都有的一个特点:先处理一些特殊情况——这也是递归函数的第一个出口,再处理递归关系——这形成递归函数的第二个出口。 递归函数的执行过程总是先通过递归关系不断地缩小问题的规模,直到简单到可以作为特殊情况处理而得出直接的结果,再通过递归关系逐层返回到原来的数据规模,最终得出问题的解。 以上面求阶乘数列的函数) f为例。如在求)3(f时,由于3不是特殊值,因此需 (n 要计算)2( 3f,但)2(f是对它自己的调用,于是再计算)2(f,2也不是特殊值,需要计 * 算)1( f,返回 )1(= 2f,需要知道)1(f的值,再计算)1(f,1是特殊值,于是直接得出1 * 上一步,得2 3 * )2( )3(= = f,从而得最终 =f )1( 3 2 * * )2(= =f 2 f,再返回上一步,得6 解。 用图解来说明,就是

迭代算法

算法设计之迭代法 军人在进攻时常采用交替掩护进攻的方式,若在数轴上的点表示A,B两人的位置,规定在前面的数大于后面的数,则是A>B,B>A交替出现。但现在假设军中有一个胆小鬼,同时大家又都很照顾他,每次冲锋都是让他跟在后面,每当前面的人占据一个新的位置,就把位置交给他,然后其他人再往前占领新的位置。也就是A始终在B的前面,A向前迈进,B跟上,A把自己的位置交给B(即执行B = A操作),然后A 再前进占领新的位置,B再跟上……直到占领所有的阵地,前进结束。像这种两个数一前一后逐步向某个位置逼近的方法称之为迭代法。 迭代法也称辗转法,是一种不断用变量的旧值递推新值的过程,跟迭代法相对应的是直接法(或者称为一次解法),即一次性解决问题。迭代算法是用计算机解决问题的一种基本方法。它利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值。 利用迭代算法解决问题,需要做好以下三个方面的工作: 一、确定迭代变量。在可以用迭代算法解决的问题中,至少存在一个直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量。 二、建立迭代关系式。所谓迭代关系式,指如何从变量的前一个值推出其下一个值的公式(或关系)。迭代关系式的建立是解决迭代问题的关键,通常可以使用递推或倒推的方法来完成。 三、对迭代过程进行控制。在什么时候结束迭代过程?这是编写迭代程序必须考虑的问题。不能让迭代过程无休止地重复执行下去。迭代过程的控制通常可分为两种情况:一种是所需的迭代次数是个确定的值,可以计算出来;另一种是所需的迭代次数无法确定。对于前一种情况,可以构建一个固定次数的循环来实现对迭代过程的控制;对于后一种情况,需要进一步分析出用来结束迭代过程的条件。 最经典的迭代算法是欧几里德算法,用于计算两个整数a,b的最大公约数。其计算原理依赖于下面的定理: 定理:gcd(a, b) = gcd(b, a mod b) 证明:a可以表示成a = kb + r,则r = a mod b 。假设d是a,b的一个公约数,则有 d% a==0, d%b==0,而r = a - kb,因此d%r==0 ,因此d是(b, a mod b)的公约数 同理,假设d 是(b, a mod b)的公约数,则 d%b==0 , d%r==0 ,但是a = kb +r ,因此d也是(a,b)的公约数。 因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证。 欧几里德算法就是根据这个原理来做的,欧几里德算法又叫辗转相除法,它是一个反复迭代执行,直到余数等于0停止的步骤,这实际上是一个循环结构。其算法用C语言描述为: int Gcd_2(int a, int b)// 欧几里德算法求a, b的最大公约数 { if (a<=0 || b<=0) //预防错误 return 0; int temp; while (b > 0) //b总是表示较小的那个数,若不是则交换a,b的值 { temp = a % b; //迭代关系式

单纯形法求解原理过程

单纯形法 需要解决的问题: 如何确定初始基本可行解; 如何由一个基本可行解迭代出另一个基本可行解,同时使目标函数获得较大的下降; 如何判断一个基本可行解是否为最优解。 min f(X)=-60x1-120x2 s.t. 9x1+4x2+x3=360 3x1+10x2+x4=300 4x1+5x2+x5=200 x i≥0 (i=1,2,3,4,5) (1) 初始基本可行解的求法。当用添加松弛变量的方法把不等式约 束换成等式约束时,我们往往会发现这些松弛变量就可以作为 初始基本可行解中的一部分基本变量。 例如:x1-x2+x3≤5 x1+2x2+x3≤10 x i≥0 引入松弛变量x4,x5后,可将前两个不等式约束换成标准形式 x1-x2+x3+x4=5 x1+2x2+x3+x5=10 x i≥0 (i=1,2,3,4,5) 令x1=x2=x3=0,则可立即得到一组基本可行解 x1=x2=x3=0,x4=5,x5=10 同理在该实例中,从约束方程式的系数矩阵 中可以看出其中有个标准基,即 与B对应的变量x3,x4,x5为基本变量,所以可将约束方程写成 X3=360-9x1-4x2 x4=300-3x1-10x2 x5=200-4x1-5x2 若令非基变量x1=x2=0,则可得到一个初始基本可行解X0 X0=[0,0,360,300,200] T 判别初始基本可行解是否是最优解。此时可将上式代入到目标函数中,得:

F(X)=-60x1-120x2 对应的函数值为f(X0)=0。 由于上式中x1,x2系数为负,因而f(X0)=0不是最小值。因此所得的解不是最优解。 (2) 从初始基本可行解X0迭代出另一个基本可行解X1,并判断X1是否 为最优解。从一个基本可行解迭代出另一个基本可行解可分为 两步进行: 第一步,从原来的非基变量中选一个(称为进基变量)使其成为基本变量; 第二步,从原来的基本变量中选一个(称为离基变量)使其成为新的非基变量。 选择进基和离基变量的原则是使目标函数值得到最快的下降和使所有的基本变量值必须是非负。 在目标函数表达式中,非基变量x1,x2的系数是负值可知,若x1,x2不取零而取正值时,则目标函数还可以下降。因此,只要目标函数式中还存在负系数的非基变量,就表明目标函数还有下降的可能。也就还需要将非基本变量和基本变量进行对换。一般选择目标函数式中系数最小的(即绝对值最大的负系数)非基变量x2换入基本变量,然后从x3,x4,x5中换出一个基本变量,并保证经变换后得到的基本变量均为非负。 当x1=0,约束表达式为: X3=360-4x2≥0 x4=300-10x2≥0 x5=200-5x2≥0 从上式中可以看出,只有选择 x2=min{}=30 才能使上式成立。由于当x2=30时,原基本变量x4=0,其余x3和x5都满足非负要求。因此,可以将x2,x4互换。于是原约束方程式可得到:4x2+x3=360-9x1 10x2 =300-3x1-x4 5x2+x5=200-4x1 用消元法将上式中x2的系数列向量变[4,10,5]T换成标准基向量[0,1,0]T。其具体运算过程如下: -*4/10 : x3=240-78x1/10+4 x4/10 /10 : x2 =30-3x1/10-x4/10

迭代法

题目:Newton-Raphson 迭代法 (1)计算原理 (2)编出计算机程序 (3)给出算例(任意题型) (1)计算原理: 牛顿-拉夫森(Newton-Raphson)迭代法也称为牛顿迭代法,它是数值分析中最重要的方法之一,它不仅适用于方程或方程组的求解,还常用于微分方程和积分方程求解。 用迭代法解非线性方程时,如何构造迭代函数是非常重要的,那么怎样构造的迭代函数才能保证迭代法收敛呢?牛顿迭代法就是常用的方法之一,其迭代格式的来源大概有以下几种方式: 1设()[]2,f x C a b ∈,对()f x 在点[]0,x a b ∈,作泰勒展开: 略去二次项,得到()f x 的线性近似式:()()()()000f x f x f x x x '≈+- 由此得到方程()0f x =的近似根(假定()00f x '≠),() () 000f x x x f x =-' 即可构造出迭代格式(假定()00f x '≠):() () 1k k k k f x x x f x +=- ' 这就是牛顿迭代公式,若得到的序列{}k x 收敛于α,则α就是非线性方程的根。 2 牛顿迭代法 牛顿切线法,这是由于()f x 的线性化近似函数()()()()000l x f x f x x x '≈+-是曲线()y f x =过点()()00,x f x 的切线而得名的,求()f x 的零点代之以求() l x !2))((''))((')()(2 0000x x f x x x f x f x f -+ -+= ξ

的零点,即切线与x 轴交点的横坐标,如左图所示,这就是牛顿切线法的几何解释。实际上,牛顿迭代法也可以从几何意义上推出。利用牛顿迭代公式,由 k x 得到1k x +,从几何图形上看,就是过点()(),k k x f x 作函数()f x 的切线k l ,切线k l 与x 轴的交点就是1k x +,所以有()() 1 k k k k f x f x x x +'=-,整理后也能得出牛顿迭 代公式: 3 要保证迭代法收敛,不管非线性方程()0f x =的形式如何,总可以构造: 作为方程求解的迭代函数。因为: 而且 在根附近越小,其局部收敛速度越快,故可令: 若0(即根不是0的重根),则由得: , 因此可令 ,则也可以得出迭代公式: 。 4 迭代法的基本思想是将方程改写成等价的迭代形式,但随之而来的问题却是迭代公式不一定收敛,或者收敛的速度较慢。运用前述加速技巧,对于简单迭代过程 ,其加速公式具有形式: ,其中 记,上面两式可以合并写成: 这种迭代公式称作简单的牛顿公式,其相应的迭代函数是: 。 需要注意的是,由于是的估计值,若取,则实际上便是的估计值。假设,则可以用代替上式中的, 就可得到牛顿法的迭代公式: 。 )(')(1k k k k x f x f x x - =+)()()(x f x k x x x -==?)0)((≠x k )(')()()('1)('x f x k x f x k x --=?) ('x ?α0)('=α?≠)('αf α=)(x f 0)('=α?)('1 )(ααf k = )('1 )(x f x k = )(')(1k k k k x f x f x x - =+0)(=x f )(x x ?=)(1n n n x f x x +=+θθ?--= +1)(1n n n x x x ) (111n n n x x x --+=++θθ )(1 n n x x ?=+1-=θL L x f x x n n n )(1- =+L x f x x )()(- =?L )('x ?)()(x f x x +=?)('x ?)('x f 0)('≠x f )('x f L )(')(1n n n n x f x f x x - =+

例详解dns递归和迭代查询原理及过程

例详解dns递归和迭代查询原理及过程 在互联网中,一个域名的顺利解析离不开两类域名服务器,只有由这两类域名服务器可以提供“权威性”的域名解析。 第一类就是国际域名管理机构,也就InterNIC,主要负责国际域名的注册和解析,第二类就是国内域名注册管理机构,在中国就是 CNNIC了,主要负责国内域名注册和解析,当然,尽管分为国际和国内,但两者一主一辅,相互同步信息,毕竟最终的目的是在全球任何一个有网络的地方都可以顺利访问任何一个有效合法的域名,其间的联系就可见一斑了。 有的朋友可能会有这个疑问,域名服务器不是有很多吗?为什么说只有2类呢?是的,ISP何其多?当我们输入某一网址(或域名),系统将这个域名发送至需要将其当前已配置的DNS服务器,以便转换为IP地址进行访问,通常会是当地的公共DNS服务器(内网环境可能直接提交到防火墙或路由器上做进一步转发处理)。公网DNS服务器收到此请求后,并非立刻处理,比如转发至上一级的DNS服务器(在第一节讲过DNS有着很严格的逻辑层次关系),而是首先会查看自己的DNS缓存,如果有这个域名对应的IP,则直接返回给用户,系统收到这个IP后交给浏览器做进一步处理。在这个轮回的过程中,客户端所得到的DNS的回复就是“非权威的性”的,也就是说这个结果并不是来自这个域名所直接授权的DNS服务器,而是该记录的副本。简单的说,“非权威性”的应答是从别的 DNS服务器上复制过来的,与之对应的,就是“权威性”应答则是由域名所在的服务器作出的应答,听起来似乎不易理解,我们来看一个例子。 我所在地是深圳,这里的公共DNS服务器是202.96.134.133,我们来检测一下。 如下图: 这里用到了nslookup命令,用来查询当前本机解析域名所依赖的DNS服务器,从上图中文名可以得知当前默认的DNS解析服务器是 https://www.360docs.net/doc/876662206.html,,对应的IP地址为202.96.134.133,也就是说在这台机子上运行的网络程序,如果需要用到DNS域名解析的,都会将请求到这个服务器上,寻求解析。 当然,如果你是在内网,或是其他类型的局域网,在解析时候可能无法顺利得到上图的结果,多半是代理或防火墙的缘故。建议ADSL用户可以自测一下,加深印象。现在,我们来解析一个网站的别名记录,以此来了解一下何为“非授权记录” 以网易为例吧。如下图:

递归迭代及均衡形态交易系统

递归迭代及均衡形态交易系统 第一章 递归均衡 递归(Recursion)本是指函数/过程/子程序在运行过程中,直接或间接调用自身而 产生的重入现象。著名的斐波那契(Fibonacci)数列就可以使用递归公式来描述:Fib(n) = Fib(n-1) + Fib(n-2) 第一节 递归比率 在这里,我们主要应用其比率(Ratio)关系: HTR 之间存在平方、倒数、递归关系,甚至还应用了圆周率。

我们在图表上会经常看到相似的形态,例如: 上证指数在跌到1664点之后,走出了一个蝴蝶形态,而大蝴蝶中又嵌套着小蝴蝶。在完成了递归形态之后,股指便走出了一波强劲的升势。我们再来看一幅指数图: 两幅相当类似的形态。也许我们可以把它们理解为三重顶形态或三角形整理形态,这有点类似艾略特的波浪理论,只是直观的看法,而递归形态才能告诉我们事物的本质。

最简单直观的均衡(Balance)状态就是:赚钱=赔钱。1万涨到2万,利润率是100%;2万跌到1万,利润率是-50%。所以,我们可以经常看到股价下跌一半时,便出现了背驰(Retracement)。图如: 成交额=成交价×成交量,所以在画均线时我们使用了成交量权重(使用DMA函数),实际的均衡价位与50%会有些差异。在飞狐交易师(和讯收购后更名为大交易师)中有“点石成金”画线工具,可以参考 Paul Levine 的 Midas 技术分析文章。Midas 的头三个字母与中间 Middle 一样,所以下面我们称之为 M 线。

上图为2006-2007年的大牛市,股指从1000点开始不断创出新高,几乎没有象样的调整。直到4000点才出现了一个均衡调整,当时称之为530暴跌。成交量在下降,但股指依然攀升到6124点,又出现了一次均衡调整,之后无法创出新高才掉头向下。注意到两次调整的反递归关系了吗? 金融风暴之下,我们依然看到历史在重演——递归均衡! 第二章 迭代共振 在数学中,迭代(Iteration)函数是在分形(Fractal)和动力(Dynamic)系统中深入研究的对象。迭代函数是重复的与自身复合的函数,这个过程叫做迭代。所谓迭代关系式,指如何从变量的前一个值推出其下一个值的公式(或关系)。迭代关系式的建立是解决迭代问题的关键,通常可以使用递推或倒推的方法来完成。 简单的讲,递归和迭代都具有重复和递推的特性。区别在于,递归是自己调用自己,而迭代是不断地根据变量的旧值推出新值。交易是由人完成的:我们有时会有一种心理,就是在一次成功之后,自然就会想到复制成功,会有相同的预期,这就是递归思想;而有时条件发生了较大的变化,就会根据情况改变预期,这就是迭代思想。斐波那契数列用递归或迭代算法都容易得出,所以在黄金比例出现的价位,较容易获得均衡。

DNS中的递归查询和迭代查询

迭代查询 合理使用DNS中的递归查询和迭代查询 前言 本章主要介绍递归查询与迭代查询的差别,以及他们混合工作时的方式。并且简单的介绍了如何根据实际情况进行部署。 目录 ?递归查询的工作方式 ?迭代查询的工作方式 ?如何配置递归查询及迭代查询 ?调整最佳性能的查询方式 递归查询的工作方式 递归查询是最常见的查询方式,域名服务器将代替提出请求的客户机(下级DNS服务器)进行域名查询,若域名服务器不能直接回答,则域名服务器会在域各树中的各分支的上下进行递归查询,最终将返回查询结果给客户机,在域名服务器查询期间,客户机将完全处于等待状态。 示例:(红色为查询,蓝色为迭代查询返回的提示信息,棕色为递归查询返回的IP信息)

示例说明:A向B发送递归查询请求,B向C发送迭代查询请求(下一节将介绍迭代查询),得到C给出的提示后,B向D发送迭代查询请求,得到D给出的提示后,B向E发出迭代请求,得到E给出的提示后,B向F发出迭代查询请求,得到F给出的提示后,B得到了F返回G的IP地址,B向A返回G的IP 地址,整个查询结束。 也许你现在还很难理解什么是迭代查询,下一节中将以一个非常易于理解的方法说明。 迭代查询的工作方式 迭代查询又称重指引,当服务器使用迭代查询时能够使其他服务器返回一个最佳的查询点提示或主机地址,若此最佳的查询点中包含需要查询的主机地址,则返回主机地址信息,若此时服务器不能够直接查询到主机地址,则是按照提示的指引依次查询,直到服务器给出的提示中包含所需要查询的主机地址为止,一般的,每次指引都会更靠近根服务器(向上),查寻到根域名服务器后,则会再次根据提示向下查找。从上节的图中可以知道,B访问C、D、E、F、G,都是迭代查询,首先B访问C,得到了提示访问D的提示信息后,开始访问D,这时因为是迭代查询,D又返回给B提示信息,告诉B应该访问E,依次类推。 说明:假设你要寻找一家你从未去过的公司,你会有2种解决方案,1是找一个人替你问路,那可能是你的助手,2是自己问路,每走过一个路口,就问一个人,这就好比递归查询和迭代查询,递归查询在这里代表你的第1种解决方案,而迭代则是第2种解决方案。 如何配置递归查询及迭代查询 在默认情况下DNS服务器既接受来自其他客户机(其他DNS服务器)的迭代查询也接受其他客户机(其他DNS服务器)的递归查询。 提醒:在DNS服务器属性中,你可能会混淆高级选项卡中的“禁止递归”选项和转发器选项中的“不对这个域使用递归”后者控制将要接受的查询类型。 修改: 禁止递归查询。在DNS服务器属性中,高级选项卡,服务器选项,“禁止递归”。 通常根服务器或者流量较大的域名服务器都不使用递归查询,其原因也很简单,大量的递归查询会导致服务器过载。 问题:为什么不连迭代查询也关闭?这样不更节省损耗吗?这绝对是一个让人哭笑不得的问题。原因是如果不建立迭代查询,你的DNS又可以做什么事情呢?那不如不建立DNS服务器。 调整最佳性能的查询方式 一般的,你的企业内部如果有超过300台机器,你就应该在你的部署计划中建立多个DNS服务器了。根据活动目录或者物理位置将多个DNS平均分布。而根域名服务器总应该使用迭代查询,而不应该使用递归查询。同时,为了减轻客户机的负担,所有的下级域名服务器就都应该使用递归查询与迭代查询的混合

递归算法实例

递归算法实例 忘记关窗子给冷风吹醒了,额!前段时间研究PHP,关于递归有个例题“馋嘴猴子”。说有只猴子弄到了一堆桃子,它第一天吃了这堆的一半,还觉得不过瘾,出门的时候又吃了一个,第二天吃了剩下的桃子的一半再加一个,每天都这样,第十天准备吃的时候,发现桃子只剩一个了,问最初一共有多少个桃子。 问题并不复杂,但是要用倒着推的方式,第十天的桃子数量1也就是第九天剩下的数量,设第九天桃子数量为X,则有等式:X/2-1=1,解得:X=4。以此类推可以算出最初的桃子数量。 用编程的方式解决这个问题,有两种推导方式,“迭代”和“递归”。今天主要说说编程中递归,递归说白了就是函数自己调用自己,这种流程控制方法和“迭代”一样,都是用在代码执行步进中,后一步的计算结果当做前一步计算参数的时候。 “递归”的关键是出口,就是结束递归的条件,条件设置不合适,容易死循环。 来个简单的例子----阶乘,阶乘就是自然数从1乘到自己本身,比如3的阶乘,就是1x2x3=6。用VBA实现,按正常的流程做法应该是: Function Factorial0(ByVal num As Integer) Dim i As Long Factorial0 = 1 For i = 1 To num Factorial0 = Factorial0 * i Next i End Function 这么写也无可厚非,比较容易理解,用递归写阶乘代码是下面这样的: Function Factorial(ByVal num As Integer) If num = 1 Then '这里设置的是递归的出口,NUM是1就结束 Factorial = 1 Else Factorial = num * Factorial(num - 1) '这里是重点,自己调用自己,变量NUM减1 End If End Function

牛顿-拉夫逊迭代法原理及其实现

牛顿迭代法(简写)就是一种近似求解实数域与复数域求解方程的数学方法。那么这个方法是具体是什么原理呢? 牛顿迭代如何迭代? 直接看数学公式描述如何迭代不直观,先来看动图就很容易理解牛顿迭代法为什么叫迭代法以及怎样迭代的: 牛顿迭代法是原理是根据一个初始点在该点做切线,切线与X轴相交得出下一个迭代点的坐标,再在处做切线,依次类推,直到求得满足精度的近似解为止。 由前面描述知道,牛顿迭代法是用来近似求解方程的,这里有两个点需要说明:?为啥要近似求解?很多方程可能无法直接求取其解 ?迭代法非常适合计算机编程实现,实际上计算机编程对于牛顿迭代法广为应用来看看,数学上如何描述的? 其中为函数在处的一阶导数,也就是该点的切线。 来简单推一推上面公式的由来,直线函数方程为: 知道一个直线的一个坐标点以及斜率则该直线的方程就很容易可以得知:

那么该直线与轴的交点,就是y=0也即等式x 的解: 啥时候停止迭代呢? 1.计算出 2.给出一个初始假定根值x0,利用上面迭代式子进行迭代 3.计算绝对相对迭代近似误差 4.将绝对相对近似误差与预定的相对误差容限进行比较。如果,则迭 代步骤2,否则停止算法。另外,检查迭代次数是否已超过允许的最大迭代次数。如果是这样,则需要终止算法并退出。另一个终止条件是: 如何编码呢? 由于牛顿迭代法主要目的是解方程,当然也有可能用于某一个数学函数求极值,所以无法写出通用的代码,这里仅仅给出一个编代码的思路。相信掌握了思路,对于各种实际应用应该能很快的写出符合实际应用的代码。 假定一函数为 其波形图如下: 其一阶导数为:

那么对于该函数的根: 从图上大致可以知道有两个根,如果直接解方程,则很难求出其根,可以编个代码试试: #include #include #include /*假定待求根函数如下*/ #define F(x) (2*(x)*(x)-10*cos(x)+(x)-80) /*其一阶导数为*/ #define DF(x) (4*(x)+10*sin(x)+1) float newton_rooting(float x0,float precision,float min_deltax,int max_iterations) { float xn,xn1,fn,fn1,dfn; float deltax; int step = 0; xn = x0; xn1 = x0; do{ xn = xn1; fn = F(xn); dfn = DF(xn); /*判0*/ if( fabs(dfn) <1e-6 ) { if( fabs(fn)>precision ) return NAN; else return fn; } xn1 = xn - fn/dfn; fn1 = F(xn1); deltax = fabs(xn1-xn); step++; if( step>max_iterations ) { if( fabs(fn1)precision || deltax>min_deltax );

一起学DNS系列(十)图、例详解DNS递归和迭代查询原理及过程

一起学DNS系列(十)图、例详解DNS递归和迭代查询原理及过程 上节中提到了一些有关递归查询的内容,但说的很少,也很笼统,本节将会从原理和实例两方面入手分析DNS的递归以及迭代查询。 在此之前,我们需要了解一些背景知识,以便于更好的理解今天的主题内容。在互联网中,一个域名的顺利解析离不开两类域名服务器,只有由这两类域名服务器可以提供“权威性”的域名解析。 第一类就是国际域名管理机构,也就InterNIC,主要负责国际域名的注册和解析,第二类就是国内域名注册管理机构,在中国就是CNNIC了,主要负责国内域名注册和解析,当然,尽管分为国际和国内,但两者一主一辅,相互同步信息,毕竟最终的目的是在全球任何一个有网络的地方都可以顺利访问任何一个有效合法的域名,其间的联系就可见一斑了。 有的朋友可能会有这个疑问,域名服务器不是有很多吗?为什么说只有2 类呢?是的,ISP何其多?当我们输入某一网址(或域名),系统将这个域名发送至需要将其当前已配置的DNS服务器,以便转换为IP地址进行访问,通常会是当地的公共DNS服务器(内网环境可能直接提交到防火墙或路由器上做进一步转发处理)。公网DNS服务器收到此请求后,并非立刻处理,比如转发至上一级的DNS服务器(在第一节讲过DNS有着很严格的逻辑层次关系),而是首先会查看自己的DNS缓存,如果有这个域名对应的IP,则直接返回给用户,系统收到这个IP后交给浏览器做进一步处理。在这个轮回的过程中,客户端所得到的DNS 的回复就是“非权威的性”的,也就是说这个结果并不是来自这个域名所直接授权的DNS服务器,而是该记录的副本。简单的说,“非权威性”的应答是从别的DNS服务器上复制过来的,与之对应的,就是“权威性”应答则是由域名所在的服务器作出的应答,听起来似乎不易理解,我们来看一个例子。 我所在地是深圳,这里的公共DNS服务器是202.96.134.133,我们来检测一下。 如下图: 这里用到了nslookup命令,用来查询当前本机解析域名所依赖的DNS服务器,从上图中文名可以得知当前默认的DNS解析服务器是https://www.360docs.net/doc/876662206.html,,对应的IP地址为202.96.134.133,也就是说在这台机子上运行的网络程序,如果需要用到DNS域名解析的,都会将请求到这个服务器上,寻求解析。 当然,如果你是在内网,或是其他类型的局域网,在解析时候可能无法顺利得到上图的结果,多半是代理或防火墙的缘故。建议ADSL用户可以自测一下,加深印象。现在,我们来解析一个网站的别名记录,以此来了解一下何为“非授权记录” 以网易为例吧。如下图:

相关文档
最新文档