![域名的概念与机制_域名的概念与机制](https://s2.51cto.com/attachment/200808/200808111218467914091.bmp?x-oss-process=image/resize,m_fixed,w_1184)
owner |
RR能够被找到的域名 | |
它是一个16位值,指定RR内的资源类型,它指一个抽象资源,具体的标记有以下几个: | ||
A |
主机地址 | |
CNAME |
一个拟名的统一命名 | |
HINFO |
标记由主机使用折CPU和OS | |
MX |
标记用于域的邮件交换资源 | |
NS |
此域的权威认证名字服务器 | |
PTR |
指向其它域名空间的指针 | |
SOA |
标记区认证权威的开始 | |
class |
它是一个16位值,标记协议族或某一个协议实例,本文中使用IN代表internet系统,CH代表Chaos系统 | |
TTL |
它是RR的生存时间,它是32位整数,单位是秒,它主要用于resolver缓存RR多长时间 | |
它是一种类型,有时是依赖于数据的类,它描述了以下资源: | ||
A |
对于class是IN的,它是一个32位IP地址,对于CH,它是后面跟一个16位八进制Chaos地址的域名 | |
CNAME |
域名 | |
MX |
作为一个域的邮件服务资源的主机名,主机名后有一个16位的配置值 | |
NS |
主机名 | |
PTR |
域名 | |
SOA |
一些域 |
Question |
包括查询名和其它参数 |
Answer |
包括查询结果的RR |
Authority |
包括一个RR,但这个RR包括的是另一个名字服务器 |
Additional |
包括了一个些在其它部分中使用RR时会有用的信息 |
:和相应类型相匹配的RR matches just that type. (e.g., A, PTR). AXFR:由QTYPE指定的特定区 MAILB:和RR相关的所有邮箱 *:所有RR类型
:和相应类相匹配的RR *:所有的RR类
区中所有结点的认证数据 定义区内顶结点的数据(此数据可被认为是认证数据的一部分) 描述代表子区的数据 访问服务器子区的数据(我们也称为“相关”(glue)数据)
-
最简单的是不支持循环查询,它返回的要么是本地信息,要么是一个错误码,告诉用户你要的信息这里没有,然后再返回一个邻近服务器的地址,让用户到那里去查一查。
-
如果支持循环查询,那名字服务器如果未能在本地找到相应的信息,就代替用户向其它服务器进行查询,这时它是代替用户扮演了resolver的角色,直到最后把结果找到(也可能根本没有结果,那就返回错误),并返回给用户为止。
-
如果允许循环查询则设置RA位,服务器方可以不管客户是否进行请求而直接设置此位
-
查询中如果请求循环查询则设置RD位,客户只有在知道服务器方支持循环查询后才能够进行循环查询请求
查询指定的CNAME RR有多个别名 指定的名字服务器不存在 临时错误
是不是支持循环查询要看服务器,如果支持,而且需要循环查询,转到第5步; 查询最靠近QNAME祖先的结点所在的区,如果未找到这个区,转第4步; 开始在区内从上到下进行匹配,匹配过程的结束条件有以下几个:
如果整个QNAME匹配了,我们就找到了。如果数据所在结果是CNAME,QTYPE不匹配CNAME,复制CNAME RR到响应的应答区,将QNAME改变为CNAME RR中的标准形式后返回第1步;否则复制所有匹配QTYPE的RR到响应的应答区,然后转第6步; 如果匹配的结果使我们离开了认证权威,我们就获得一个参照(referral),我们这时会碰到一个带有NS RR的结点,复制NS RR到响应的认证区内,在其它区域随便放上什么地址,如果从认证数据或缓冲内没有获得地址,可以使用关联RR。然后转到第4步; 如果在一些标记上不可能有匹配,看看是不是有"*"标记存在,如果"*"标记不存在,检查我们要查找的名字是不是QNAME,如果名字就是原来的QNAME,在响应中设置错误,否则退出。如果"*"存在,以RR和QTYPE匹配,如果匹配成功,将它们复制到响应中,但设置RR的拥有者(owner)为QNAME,不是带有"*"的结点,然后转到第6步;
在缓冲中进行匹配,如果在缓冲中找到QNAME,将所有和它关联的而且匹配QTYPE的RR复制到响应区,如果没有从认证权威来的授权,可以在缓冲中寻找最好的一个,将它放在认证区内,然后转到第6步; 使用本地resolver响应请求。保存包括中间CNAME在内的结果到应答中。 仅使用本地数据,试着加入其它有用的RR到查询的附加部分。然后退出。3.3.3. Wildcard在前面的算法中,我们对其拥有者以*开始的RR进行了特殊处理,这类的RR称为wildcards。Wildcard RR可以看成合成RR的指令,在有合适的条件时,服务器创建RR,这个RR的拥有者名和查询名相同,而内容是从wildcard RR获得的。这种机制经常用于创建一个区,这个区可用于在网络上从一个邮件系统向另一个邮件系统转发邮件。这种情况下,通常的假设是区中的所有名字都存在,只要没有说不存在,都认为有。wildcard RR的内容遵守通常RR的格式,区中的wildcard有一个拥有者名,它控制者可以进行匹配的查询名。wildcard RR的拥有者名是以下的形式:"*.",其中是任何域名,不应该再包括其它*标记,而且它应该在区的认证数据之中。我们可以把wildcard看成是通配符的作用。wildcard RR在以下情况中不适用:查询在应该在别的区中;如果区中已经存在了它所代表的某个域。例如,如果wildcard RR有"*.X",区中包括了B.X,那么wildcard就不代表B.X,A.B.X或X,而只能代表Z.X了。在查询名中的*没有什么特殊作用,它只用于在认证权威区中检测wildcard,这样的查询是唯一可以在响应中获得包括拥有者名中包含*的查询请求,其它请求的响应都不能包含*。这样查询的结果不能缓冲。在合成RR时,wildcard RR的内容不应该被改变。下面是一个例子,我们假设一个大公司有一个大型的非TCP/IP网络,它要创建一个邮件网关。如果公司是X.COM,而TCP/IP网关为A.X.COM,下面的RR可能会在COM区中:
X.COM MX 10 A.X.COM *.X.COM MX 10 A.X.COM A.X.COM A 1.2.3.4 A.X.COM MX 10 A.X.COM *.A.X.COM MX 10 A.X.COM对于所有X.COM中的MX查询,都会得到A.X.COM。存在两个wildcard RR是必须的,因为有A.X.COM,就必须要有*.A.X.COM,否则W.A.X.COM就查询不出来,原因请在本节中的wildcard RR不适用的情况中寻找。3.3.4. 否定响应缓冲(可选)DNS可以允许服务器提供一种否定响应缓冲服务,在这种服务下服务器返回一个否定响应和一个TTL,resolver可以认为在TTL的时间之内相同的查询都会获得否定响应。同样的,resolver可以进行一个配置多个类型的查询,并缓冲不存在的类型。实现的方法是当数据是被认证时服务器加入一个SOA RR到响应的附加区域,SOA必须是那个区的,而且这个区必须中响应中数据的认证权威区,SOA的MINIMUM域控制缓冲否定响应的时间。在有些情况下,响应数据可能包括多个拥有者名,这时SOA机制应该用于匹配QNAME的数据上,它才是唯一被认证了的数据。服务器和resovler不应该试图添加SOA到非认证响应的附加区域,也不应该进行任何推测。这个功能是可选的,虽然现在它越来越有可能成为标准,但是服务器并非非要加SOA RR到所有的认证响应中去,resolver也不一定非要缓冲否定结果。所有的resolver和支持循环查询的服务器都应该可以忽略SOA RR。3.3.5. 区的维护与传输区管理员的部分工作是维护所有服务器上的区数据。当必须要进行修改时,修改必须让所有的名字服务器知道。这一过程可以通过FTP或其它什么过程完成,而推荐的方法是DNS协议的区传输部分所指出的方法。通常的自动更新模式是一个服务器是区的主服务器,管理员对区内的域名文件(master file)进行修改,修改后管理员通知主服务器装载新的数据,其它的非主服务器定期和主服务器进行同步。为了知道是否发生了修改,非主服务器必须检查SOA的SERIAL域,只要有改变,SERIAL域就会改变,这种改变可能是加一,也可能是其它的什么算法,反正变了就行。因为我们改变的域大小是有范围的,因此理论上必须有一个修改的时间间隔,基本上,老的复本必须在序列号(就是那个域)用完其空间一半时消失。实际上只要保证比较操作的正确性就可以了。非主服务器的定期同步由区内SOA RR的参数REFRESH,RETRY和EXPIRE决定。当非主服务器装入新区时,它会在REFRESH秒后向主服务器查询新序列号,如果查询未能完成,它会每隔RETRY秒重新进行一次。如果查询得到的序列号和原来的序列号一样,则不需要进行改变。在REFRESH时间间隔后重新开始。如果非主服务器在EXPIRE间隔后不能进行查询,它必须抛弃现有的区数据。当查询后知道区内的数据已经改变,非主服务器必须通过AXFR请求请求主服务器传送区数据。AXFR可能会被拒绝而产生错误,但是通常情况下会得到一系列响应信息。第一个和最后一个信息必须包括区内顶认证结点的数据。中间的信息包括区内其它RR的信息,包括认证的和非认证的。这些数据使非主服务器得到区数据的复本,因为必须保证数据的准确,我们必须使用基于连接的协议。以上的查询操作不但可以在主服务器非主服务器之间进行,而且可以在非主服务器之间进行。这可以提高整体的运行效率。4. RESOLVERS4.1. 介绍Resolver是用户程序和域名服务器之间的接口,最简单的情况下,resolver接收从用户来的请求,返回符合本地数据格式的查询结果。resolver和请求DNS服务的程序在同一台机器上,但DNS服务器则在其它机器上,因为resolver可能要查询多个名字服务器,所有它需要有一个本地缓冲,而查询的时间则可能因具体查询不同而差别很大。resolver的一个重要作用是就是它有一个多个程序可以共享的缓冲区,这里保存着一些查询结果,使用这些结果可以减少对服务器反复的查询。4.2. 客户-resolver接口4.2.1. 典型函数这个接口因主机不同而不同,但有三个函数是大家必须都有的:
主机名到主机地址转换,此函数通常定义用来模拟原来基于HOSTS.TXT的函数。给定一个字符串,返回一个32位IP地址,在DNS下,它转换为请求类型A的RR请求。因为DNS不保存RR的顺序,函数会进行排序将返回的许多地址中的一个返回给用户。请注意:最好是返回多个地址,但单个地址是模拟原来基于HOSTS.TXT服务的。 主机地址到主机名转换,给定32位IP地址,返回字符串。查询时采用PRT查询,主机名加上"IN-ADDR.ARPA"后缀进行查询,如IP地址为1.2.3.4,则PTR RR查询域名"4.3.2.1.IN-ADDR.ARPA"。 通用查询函数,调用者提供QNAME,QTYPE和QCLASS,希望所有匹配的RR,函数会使用DNS格式而非本机格式返回查询结果,结果中包括所有RR的内容。在resolver执行上面的函数时,会返回以下的结果给客户:
给定请求数据的一个或多个RR,此时resovler以合适的格式返回结果 名字错误(NE),在查询的名字不存在是会返回NE 未找到数据错误,查询的名字存在,但合适类型的数据不存在时产生这种错误,如把主机地址用于邮箱地址时会返回错误需要注意的是,有时某些函数会在查询时名字错误和数据未找到错误会被合并为另一种类型的错误,但通常函数不会。一个原因是程序通常先查询一个名字(包括类型信息),然后是同一个名字的另外类型,如果两个错误合起来,反面会减慢查询速度。4.2.2. 别名当试图解析一个特殊的名字查询时,resolver可能发现这是一个别名,如果可能这种情况会返回给客户。但是经常,当resolver碰到一个CNAME时,它会重新开始一个查询。然而,在执行通常函数而且CNAME RR配置查询类型时,resolver不应该要别名。在有别名的时候有几种特殊情况。多级别名应该避免,因为太缺乏效率,但这也不应该被做为错误返回给客户。对于别名循环和别名指向不存在的名字时应该将错误返回给客户。4.2.3. 临时错误有时候因为网络等原因,resolver可能不能完成某个请求,这时不应该返回没有名字或未查询到这类错误。这类错误对人类用户来说可是件烦心的事。在某些时候可以阻塞请求,但这并不是个好的解决之道,特别是服务器就等它完成以转向其它任务的时候。推荐的方法是返回错误指示现在出现临时错误。4.3. Resolver内部每个resolver的实现都不相同,会有复杂的逻辑处理各种错误,而本文只讨论一个纲领。4.3.1. 根(Stub)resolvers一种实现resolver的方法就是在支持循环查询的服务器上实现,这样可以节省PC机上的资源,也可以对查询结果缓冲进行集中管理。其它的事情就是要一个支持循环查询服务器地址的文件在PC机上,PC机上资源有限,支持一个域名数据库可能不太现实。用户必须确定所列的名字服务器支持循环查询,服务器可以拒绝进行任何客户的循环查询请求,因此用户必须向管理员核对。这种类型的服务有一些不足,因为循环查询较费时,根对UDP重发时间的选择比较难以确定,服务器会因为根的反复重发而崩溃。使用TCP或许会好,但这样会严重占用主机时间,使用TCP相当于实现一个实时的查询系统。4.3.2. 资源除了自己的资源外,resolver可以访问本地服务器保存的区数据。这会使resolver的速度加快,但是也可以让缓冲数据冲掉区数据。本文中指的本地信息是说缓冲和共享区数据,在有认证数据和缓冲数据时应该优先使用认证数据。下面的算法假设所有函数被转换为一个通常的查询函数,使用下面的数据结构代表进行中的请求的状态:
SNAME 要查询的域名 STYPE 查询请求的QTYPE SCLASS 查询请求的QCLASS SLIST 表示正在查询的名字服务器和区,它保存resolver的预测,预测希望查询的数据在什么地方,通过接收的数据,此结构内的数据会发生变化。它包括服务器地址,区内已知的服务器,历史记录,以及表示查询距离目标还有多远的标记(查询从树顶开始向下,直到目标)。 SBELT 在resolver无法从本地信息知道应该查询哪个服务器时,它就派上用场了。 CACHE 保存前一次响应的结果,因为resolver会抛弃达到TTL时间的RR,所有大部分resolver实现将接收到RR的时间转换为绝对时间,然后保存在缓冲中,resolver可以在查询时顺便将过期RR抛弃,也可定期进行维护。4.3.3. 算法大体上,算法有四步:
检查结果是否在本地,如果是则直接返回; 向最合适的服务器查询; 向多个服务器发出请求,直到得到响应; 分析结果:
如果响应给出了结果或包含名字错误,缓冲并返回结果给用户; 如果响应指出更合适的服务器,缓冲这个结果,转第2步; 如果响应显示CNAME,但并不是答案,缓冲CNAME,将SNAME改为CNAME RR中的统一名称,然后转第1步; 如果响应显示服务器失败或其它不可识别的内容,从SLIST中删除此服务器,然后转第3步。第1步在缓冲内查找,如果找到了,那就返回给用户。有些resolver可以设置不使用缓冲内的数据,但并不推荐把它做为默认情况。如果resolver能够直接访问服务器的区,而且能够找到数据的认证形式,则不要使用缓冲内的数据。第2步向服务器查询需要的数据,通常的办法是寻找本地提供的服务器RR,提供SNAME,然后给出SNAME的父域名,父域名的父域名,以此类推,直到根。因此,如果SNAME=Mockapetris.ISI.EDU,查询NS RR的顺序为Mockapetris.ISI.EDU,ISI.EDU,EDU,最后是.(根)。NS RR列出了此区的或在SNAME之上的主机名,复制名字到SLIST,使用本地信息设置它们的地址,可能地址不可用,此时resolver有几种不同的选择,最好是进行并行搜索,一个搜索现在可用的,一个去寻找新的,当然实现起来就有麻烦了,我们把实现的一些规则列于下面:
加入一些限制,让请求不会进入无限循环,也不会造成对链式请求和对其它服务的链式请求,即使在有人错误配置的情况下也不能造成上述情况 尽一切可以获得响应 避免不必要的传输 尽快获得响应如果查询NS RR失败,resolver从SBELT中初始化SLIST,基本的思想是当resolver不知道哪个服务器在工作时,它会从一个配置文件中取得相应的信息。虽然是特殊情况,但基本上要有两个根服务器地址存在于这种配置文件中。有两个是为了冗余,根服务器可以对所有的域空间进行探索,两个本地服务器将允许resolver继续尝试利用本地资源解析域名。除了名字的名字和地址,SLIST中可以保存服务器的优先查询顺序,保证高优先级在前,本地服务器在远程服务器前,也可能是由成功的统计结果得到,算法不尽相同。第3步发出请求,直到收到响应。算法基本思想是对所有列出的服务器以循环方式进行发送。实际上,要重视多穴(multihomed)主机的多个地址,在使用多个resolver的时候要注意对相同主机进行重新传输对时间的影响。SLIST通常包括一个值,用于控制和监视传输的超时。第4步涉及分析结果,resovler应该检查响应的ID域看是不是和请求的ID一致。理想的响应是从认证权威那里收到的数据,它要么给出需要的数据,要么给出名字错误。在TTL大于0的时候,结果保存于缓冲,同时结果返回给用户。如果结果指出其它服务器A,要对这个服务器A和SLIST中的主机进行比较,看是不是更合适,这可以通过比较SLIST中的匹配计数完成,这个匹配计数是通过SNAME和服务器A中的NS RR计算得到。如果不合适,这个响应会被忽略,如果合适,结果会被缓冲,相应的服务器会进入SLIST,新的查询开始。如果响应包括CNAME,新查询将从CNAME开始,除非响应有标准格式的数据,或CNAME就中结果。5.例子在我们的例子空间中,假设我们希望将根管理权分散到MIL,EDU,MIT.EDU和ISI.EDU区,我们可以按下图分配名字服务器:(认证权威将被加上括号)
. IN SOA SRI-NIC.ARPA. HOSTMASTER.SRI-NIC.ARPA. ( 870611 ;serial 1800 ;refresh every 30 min 300 ;retry every 5 min 604800 ;expire after a week 86400) ;minimum of a day NS A.ISI.EDU. NS C.ISI.EDU. NS SRI-NIC.ARPA. MIL. 86400 NS SRI-NIC.ARPA. 86400 NS A.ISI.EDU. EDU. 86400 NS SRI-NIC.ARPA. 86400 NS C.ISI.EDU. SRI-NIC.ARPA. A 26.0.0.73 A 10.0.0.51 MX 0 SRI-NIC.ARPA. HINFO DEC-2060 TOPS20 ACC.ARPA. A 26.6.0.65 HINFO PDP-11/70 UNIX MX 10 ACC.ARPA. USC-ISIC.ARPA. CNAME C.ISI.EDU. 73.0.0.26.IN-ADDR.ARPA. PTR SRI-NIC.ARPA. 65.0.6.26.IN-ADDR.ARPA. PTR ACC.ARPA. 51.0.0.10.IN-ADDR.ARPA. PTR SRI-NIC.ARPA. 52.0.0.10.IN-ADDR.ARPA. PTR C.ISI.EDU. 103.0.3.26.IN-ADDR.ARPA. PTR A.ISI.EDU. A.ISI.EDU. 86400 A 26.3.0.103 C.ISI.EDU. 86400 A 10.0.0.52
EDU. IN SOA SRI-NIC.ARPA. HOSTMASTER.SRI-NIC.ARPA. ( 870729 ;serial 1800 ;refresh every 30 minutes 300 ;retry every 5 minutes 604800 ;expire after a week 86400 ;minimum of a day ) NS SRI-NIC.ARPA. NS C.ISI.EDU. UCI 172800 NS ICS.UCI 172800 NS ROME.UCI ICS.UCI 172800 A 192.5.19.1 ROME.UCI 172800 A 192.5.19.31 ISI 172800 NS VAXA.ISI 172800 NS A.ISI 172800 NS VENERA.ISI.EDU. VAXA.ISI 172800 A 10.2.0.27 172800 A 128.9.0.33 VENERA.ISI.EDU. 172800 A 10.1.0.52 172800 A 128.9.0.32 A.ISI 172800 A 26.3.0.103 UDEL.EDU. 172800 NS LOUIE.UDEL.EDU. 172800 NS UMN-REI-UC.ARPA. LOUIE.UDEL.EDU. 172800 A 10.0.0.96 172800 A 192.5.39.3 YALE.EDU. 172800 NS YALE.ARPA. YALE.EDU. 172800 NS YALE-BULLDOG.ARPA. MIT.EDU. 43200 NS XX.LCS.MIT.EDU. 43200 NS ACHILLES.MIT.EDU. XX.LCS.MIT.EDU. 43200 A 10.0.0.44 ACHILLES.MIT.EDU. 43200 A 18.72.0.8
+---------------------------------------------+ Header | OPCODE=SQUERY | +---------------------------------------------+ Question | QNAME=SRI-NIC.ARPA., QCLASS=IN, QTYPE=A | +---------------------------------------------+ Answer || +---------------------------------------------+ Authority | | +---------------------------------------------+ Additional | | +---------------------------------------------+
响应应该是: +--------------------------------------------+ Header | OPCODE=SQUERY, RESPONSE, AA | +--------------------------------------------+ Question | QNAME=SRI-NIC.ARPA., QCLASS=IN, QTYPE=A | +--------------------------------------------+ Answer | SRI-NIC.ARPA. 86400 IN A 26.0.0.73 | | 86400 IN A 10.0.0.51 | +--------------------------------------------+ Authority || +--------------------------------------------+ Additional | | +--------------------------------------------+
响应的头和查询头挺象,除了RESPONSE位的设置不同,还有就是AA位的设置,表示此数据来自认证权威。响应的question区和查询的question区一致。如果相同的查询发送到其它非SRI-NIC.ARPA的认证性质服务器,响应可能是:+---------------------------------------------------+ Header | OPCODE=SQUERY,RESPONSE | +---------------------------------------------------+ Question | QNAME=SRI-NIC.ARPA., QCLASS=IN, QTYPE=A | +---------------------------------------------------+ Answer | SRI-NIC.ARPA. 1777 IN A 10.0.0.51 | | 1777 IN A 26.0.0.73 | +---------------------------------------------------+ Authority || +---------------------------------------------------+ Additional | | +---------------------------------------------------+ 这个响应和上面的响应不同,AA位不同,TTL不同,此数据可能不来自于一个区,而来自缓冲。认证TTL和这里的TTL不同是因为处于缓冲中的原因,响应区中的RR的不同不用注意。5.2.2. QNAME=SRI-NIC.ARPA,QTYPE=*这个查询和上面的很象,但是QTYPE=*,从C.ISI.EDU接收到的响应如下:+---------------------------------------------------+ Header | OPCODE=SQUERY, RESPONSE, AA | +---------------------------------------------------+ Question | QNAME=SRI-NIC.ARPA., QCLASS=IN, QTYPE=* | +---------------------------------------------------+ Answer | SRI-NIC.ARPA. 86400 IN A 26.0.0.73 | | A 10.0.0.51 | | MX 0 SRI-NIC.ARPA. | | HINFO DEC-2060 TOPS20 | +---------------------------------------------------+ Authority || +---------------------------------------------------+ Additional | | +---------------------------------------------------+ 如果相同的查询发到两个非SRI-NIC.ARPA区中的非认证性质的服务器,响应如下: +---------------------------------------------------+ Header | OPCODE=SQUERY, RESPONSE | +---------------------------------------------------+ Question | QNAME=SRI-NIC.ARPA., QCLASS=IN, QTYPE=* | +---------------------------------------------------+ Answer | SRI-NIC.ARPA. 12345 IN A 26.0.0.73 | | A 10.0.0.51 | +---------------------------------------------------+ Authority || +---------------------------------------------------+ Additional | | +---------------------------------------------------+ 和+---------------------------------------------------+ Header | OPCODE=SQUERY, RESPONSE | +---------------------------------------------------+ Question | QNAME=SRI-NIC.ARPA., QCLASS=IN, QTYPE=* | +---------------------------------------------------+ Answer | SRI-NIC.ARPA. 1290 IN HINFO DEC-2060 TOPS20 | +---------------------------------------------------+ Authority || +---------------------------------------------------+ Additional | | +---------------------------------------------------+ 未设置AA位,因此响应不是认证数据,TTL不同,表示缓冲的时候不同,头一个是因为QTYPE=A查询而缓冲的,第二个是进行HINFO查询后响应而缓冲的。5.2.3. QNAME=SRI-NIC.ARPA,QTYPE=MX此类的查询可以来自邮件发送者,它希望查询邮件地址[email]HOSTMASTER@SRI-NIC.ARPA[/email]的路由信息,从C.ISI.EDU获得的响应可能是:+---------------------------------------------------+ Header | OPCODE=SQUERY, RESPONSE, AA | +---------------------------------------------------+ Question | QNAME=SRI-NIC.ARPA., QCLASS=IN, QTYPE=MX | +---------------------------------------------------+ Answer | SRI-NIC.ARPA. 86400 IN MX 0 SRI-NIC.ARPA.| +---------------------------------------------------+ Authority || +---------------------------------------------------+ Additional | SRI-NIC.ARPA. 86400 IN A 26.0.0.73 | | A 10.0.0.51 | +---------------------------------------------------+ 响应中包括MX RR,附加区域包括地址RR,因为C.ISI.EDU的名字服务器猜测请求者可能需要这个地址。5.2.4. QNAME=SRI-NIC.ARPA,QTYPE=NS C.ISI.EDU的响应如下:+---------------------------------------------------+ Header | OPCODE=SQUERY, RESPONSE, AA | +---------------------------------------------------+ Question | QNAME=SRI-NIC.ARPA., QCLASS=IN, QTYPE=NS | +---------------------------------------------------+ Answer || +---------------------------------------------------+ Authority | | +---------------------------------------------------+ Additional | | +---------------------------------------------------+ 响应与查询的区别在于AA位和RESPONSE位,此服务器是名字的认证权威,而且名字存在。5.2.5. QNAME=SIR-NIC.ARPA,QTYPE=A如果主机名错误,C.ISI.EDU的响应如下:+---------------------------------------------------+ Header | OPCODE=SQUERY, RESPONSE, AA, RCODE=NE | +---------------------------------------------------+ Question | QNAME=SIR-NIC.ARPA., QCLASS=IN, QTYPE=A | +---------------------------------------------------+ Answer || +---------------------------------------------------+ Authority | . SOA SRI-NIC.ARPA. HOSTMASTER.SRI-NIC.ARPA. | | 870611 1800 300 604800 86400 | +---------------------------------------------------+ Additional | | +---------------------------------------------------+ 响应表示名字不存在,错误码在头的RCODE区中给出。认证区中的SOA RR是可选的否定缓冲数据,它可以让resolver使用这个响应来使请求者在SOA MINIMUM(86400)秒内认为此名字不存在。5.2.6. QNAME=BRL.MIL,QTYPE=A如果查询发到C.ISI.EDU,响应是:+---------------------------------------------------+ Header | OPCODE=SQUERY, RESPONSE | +---------------------------------------------------+ Question | QNAME=BRL.MIL, QCLASS=IN, QTYPE=A | +---------------------------------------------------+ Answer || +---------------------------------------------------+ Authority | MIL. 86400 IN NS SRI-NIC.ARPA. | | 86400 NS A.ISI.EDU. | +---------------------------------------------------+ Additional | A.ISI.EDU. A 26.3.0.103 | | SRI-NIC.ARPA. A 26.0.0.73 | | A 10.0.0.51 | +---------------------------------------------------+ 响应有一个空的回答区,但它不是认证的,只是一个参考。在C.ISI.EDU知道自己不是MIL的认证权威,因此向请求者推荐了在A.ISI.EDU和SRI-NIC.ARPA上的服务器,它们是MIL的认证权威。5.2.7. QNAME=USC-ISIC.ARPA,QTYPE=A从A.ISI.EDU的响应如下:+---------------------------------------------------+ Header | OPCODE=SQUERY, RESPONSE, AA | +---------------------------------------------------+ Question | QNAME=USC-ISIC.ARPA., QCLASS=IN, QTYPE=A | +---------------------------------------------------+ Answer | USC-ISIC.ARPA. 86400 IN CNAME C.ISI.EDU. | | C.ISI.EDU. 86400 IN A 10.0.0.52 | +---------------------------------------------------+ Authority || +---------------------------------------------------+ Additional | | +---------------------------------------------------+ 请注意,头中的AA域保证匹配的QNAME是认证过的,但对于C.ISI.EDU的数据是不是认证的可没有说,由于A.ISI.EDU可能是ARPA域和ISI.EDU的认证权威,而且找到了USC-ISIC.ARPA和C.ISI.EDU的数据,因此此响应是可能的。如果相同的查询发到C.ISI.EDU,响应差不多:+---------------------------------------------------+ Header | OPCODE=SQUERY, RESPONSE, AA | +---------------------------------------------------+ Question | QNAME=USC-ISIC.ARPA., QCLASS=IN, QTYPE=A | +---------------------------------------------------+ Answer | USC-ISIC.ARPA. 86400 IN CNAME C.ISI.EDU. | +---------------------------------------------------+ Authority | ISI.EDU. 172800 IN NS VAXA.ISI.EDU. | | NS A.ISI.EDU. | | NS VENERA.ISI.EDU. | +---------------------------------------------------+ Additional | VAXA.ISI.EDU. 172800 A 10.2.0.27 | | 172800 A 128.9.0.33 | | VENERA.ISI.EDU. 172800 A 10.1.0.52 | | 172800 A 128.9.0.32 | | A.ISI.EDU. 172800 A 26.3.0.103 | +---------------------------------------------------+响应包括对别名USC-ISIC.ARPA的认证响应,而且包括一个对ISI.EDU的推荐。5.2.8. QNAME=USC-ISIC.ARPA,QTYPE=CNAME如果查询发到A.ISI.EDU或C.ISI.EDU,响应如下:+---------------------------------------------------+ Header | OPCODE=SQUERY, RESPONSE, AA | +---------------------------------------------------+ Question | QNAME=USC-ISIC.ARPA., QCLASS=IN, QTYPE=A | +---------------------------------------------------+ Answer | USC-ISIC.ARPA. 86400 IN CNAME C.ISI.EDU. | +---------------------------------------------------+ Authority || +---------------------------------------------------+ Additional | | +---------------------------------------------------+ 因为QTYPE=CNAME,CNAME RR本身就响应了查询,服务器不用查询别的东西。5.3. 解析例子下面的例子表示了resolver的动作,我们假设resolver开始时没有缓冲,我们假设查询主机在26号网络,而且它的SBELT如下:Match count = -1 SRI-NIC.ARPA. 26.0.0.73 10.0.0.51 A.ISI.EDU. 26.3.0.103其中的匹配记数为-1,表示服务器不靠近目标,这个靠近不靠近是一个相对值,不能精确表示什么,它为以后的算法提供了一个数据。下面的例子显示缓冲的使用,所以每个例子都假设前一个例子中的查询已经完成。5.3.1. 解析ISI.EDU的MX假设第一个解析是为了解析[email]PVM@ISI.EDU[/email]的地址。resolver会检查缓冲,但空的缓冲区可是帮不上什么忙,resolver然后会查询ISI.EDU,EDU和根域,查询也失败了,于是resolver就从SBELT中获得数据,并复制到SLIST中。此时resolver会检查3个有用的服务器地址进行尝试,因为resolver在26号网络,它会首先选择26.0.0.73或26.3.0.103,发出的请求如下:+---------------------------------------------------+ Header | OPCODE=SQUERY | +---------------------------------------------------+ Question | QNAME=ISI.EDU., QCLASS=IN, QTYPE=MX | +---------------------------------------------------+ Answer || +---------------------------------------------------+ Authority | | +---------------------------------------------------+ Additional | | +---------------------------------------------------+ resolver会等待结果,如果超时,它会尝试另一个地址,下来是相同服务器的不同地址,最后再试试试过的地址,它最终可能从SRI-NIC.ARPA获得响应:+---------------------------------------------------+ Header | OPCODE=SQUERY, RESPONSE | +---------------------------------------------------+ Question | QNAME=ISI.EDU., QCLASS=IN, QTYPE=MX | +---------------------------------------------------+ Answer || +---------------------------------------------------+ Authority | ISI.EDU. 172800 IN NS VAXA.ISI.EDU. | | NS A.ISI.EDU. | | NS VENERA.ISI.EDU.| +---------------------------------------------------+ Additional | VAXA.ISI.EDU. 172800 A 10.2.0.27 | | 172800 A 128.9.0.33 | | VENERA.ISI.EDU. 172800 A 10.1.0.52 | | 172800 A 128.9.0.32 | | A.ISI.EDU. 172800 A 26.3.0.103 | +---------------------------------------------------+ resolver发现响应是给出的推荐服务器比现在的SLIST要好,resolver会缓冲响应中的信息,并用它建立新的SLIST:Match count = 3 A.ISI.EDU. 26.3.0.103 VAXA.ISI.EDU. 10.2.0.27 128.9.0.33 VENERA.ISI.EDU. 10.1.0.52 128.9.0.32A.ISI.EDU在列表上,这是巧合,resolver将再一次开始发送,等待,最终得到响应:+---------------------------------------------------+ Header | OPCODE=SQUERY, RESPONSE, AA | +---------------------------------------------------+ Question | QNAME=ISI.EDU., QCLASS=IN, QTYPE=MX | +---------------------------------------------------+ Answer | ISI.EDU. MX 10 VENERA.ISI.EDU. | | MX 20 VAXA.ISI.EDU. | +---------------------------------------------------+ Authority || +---------------------------------------------------+ Additional | VAXA.ISI.EDU. 172800 A 10.2.0.27 | | 172800 A 128.9.0.33 | | VENERA.ISI.EDU. 172800 A 10.1.0.52 | | 172800 A 128.9.0.32 | +---------------------------------------------------+ resolver缓冲结果,同时返回结果给客户。5.3.2. 获得地址26.6.0.65的主机名resolver会将查询转换为对65.0.6.26.IN-ADDR.ARPA.有PTR RR=查询。此信息不在缓冲中,所以要查询别的服务器,又是没有找到合适的服务器,需要再次使用SBELT。因为请求的数据在缓冲中两个服务器的认证数据中,所以响应如下所示:+---------------------------------------------------+ Header | OPCODE=SQUERY, RESPONSE, AA | +---------------------------------------------------+ Question | QNAME=65.0.6.26.IN-ADDR.ARPA.,QCLASS=IN,QTYPE=PTR | +---------------------------------------------------+ Answer | 65.0.6.26.IN-ADDR.ARPA. PTR ACC.ARPA. | +---------------------------------------------------+ Authority || +---------------------------------------------------+ Additional | | +---------------------------------------------------+ 这会是一个对poneria.ISI.EDU的A请求,resolver找不到缓冲数据,但是能够在ISI.EDU的缓冲中的找到NS RR,使用这样的数据,它可以建立下面的SLIST表:Match count = 3 A.ISI.EDU. 26.3.0.103 VAXA.ISI.EDU. 10.2.0.27 128.9.0.33 VENERA.ISI.EDU. 10.1.0.52A.ISI.EDU列在最前面,因为它是最合适的服务器,A.ISI.EDU和resolver在同一网络上。上表中有许多服务器,其中之一就可以响应请求。