记关于DNS协议的一次学习(递归查询与迭代查询)

目录

0.引言

1.域名系统概述

2.DNS基础

3.DNS报文

3.1 查询报文

3.1.1 Flags

3.1.2 Queries

3.2 应答报文

3.2.1 Flags

3.2.2 Answers

3.2.3 Authoritative nameservers

3.2.4 Additional records

4.域名的解析过程

4.1 递归查询

4.2 迭代查询

5.小结


0.引言

之前没怎么去专门学习DNS相关信息,一直对递归和迭代查询区别不是很清楚,今天在学习使用“dig”工具时,决定抽空去简单的学习了下,把学习内容记录下来,期间看了一遍TCP/IP协议详解中的DNS篇,也找了很多其他资料学习借鉴,记录总结一下。学习生涯中的第一篇博客,欢迎大家留言指正,哈哈!

1.域名系统概述

域名系统(DNS)是一种用于TCP/IP应用程序的分布式数据库,它提供主机名字和IP地址之间的转换及有关电子邮件的选路信息。

我们都知道在Internet中是以IP地址来惟一标识主机的,可IP地址是32位二进制数组成,为了方便我们记忆,IP地址以点分十进制来进行表示。当我们去和网络中的众多主机通信的时候,需要记下超多的IP地址仍然非常痛苦的,所以我们比较喜欢记忆更加“人性化”的主机名。但是设备在处理数据时,并不处理主机名,只处理IP地址。所以这时候就需要DNS来帮助我们完成主机和IP之间的转换。

2.DNS基础

DNS的名字空间和linux的文件系统相似,也具有层次结构。如下图所示:

记关于DNS协议的一次学习(递归查询与迭代查询)

每个结点(上图中的圆圈)有一个至多63个字符长的标识。这颗树的树根是没有任何标识的特殊结点。命名标识中一律不区分大写和小写。命名树上任何一个结点的域名就是将从该结点到最高层的域名串连起来,中间使用一个点“.”分隔这些域名。以点“ .”结尾的域名称为绝对域名或完全合格的域名FQDN(Full Qualified Domain Name),例如sun.tuc.noao.edu.。插一句,平时域名输入都是www.xxx.com,最后没有“.”啊,那不是都没有合格嘛。其实大家试试看,在com后面加个“.”,看是否可以正常解析,不加“.”的是相对域名,加了“.”的是绝对域名,这个“.”被称为trailing dot。

*域名被分为三个部分:

1.arpa是一个用作地址到名字转换的特殊域,如果在搭过DNS服务器的朋友就很熟悉啦,就是经常说的反向解析域。

2.通用*域名gTLD:最常见的通用*域名有7个,即:com(公司企业),net(网络服务机构),int(国际组织),gov(美国的*部门),mil(美国的军事部门),edu(教育组织),org(非营利组织)。

3.国家*域名nTLD:采用ISO3166的规定。如cn代表中国,us代表美国,uk代表英国等等。国家域名也记为ccTLD(cc表示国家代码contry-code)。

DNS的一个没在上图中表示出来的重要特征是DNS中域名的授权。没有哪个机构来管理域名树中的每个标识,相反,只有一个机构,即网络信息中心NIC负责分配*域和委派其他指定地区域的授权机构。一个独立管理的DNS子树称为一个区域(zon e)。一个常见的区域是一个二级域,如noao.edu。许多二级域将它们的区域划分成更小的区域。

一旦一个区域的授权机构被委派后,由它负责向该区域提供多个名字服务器。当一个新系统加入到一个区域中时,该区域的DNS管理者为该新系统申请一个域名和一个IP地址,并将它们加到名字服务器的数据库中。这就是授权机构存在的必要性。一个名字服务器负责一个或多个区域。一个区域的管理者必须为该区域提供一个主名字服务器和至少一个辅助名字服务器。主、辅名字服务器必须是独立和冗余的,以便当某个名字服务器发生故障时不会影响该区域的名字服务。主、辅名字服务器的主要区别在于主名字服务器从磁盘文件中调入该区域的所有信息,而辅名字服务器则从主服务器调入所有信息。我们将辅名字服务器从主服务器调入信息称为区域传送。

3.DNS报文

DNS定义了一个用于查询和响应的报文格式。

记关于DNS协议的一次学习(递归查询与迭代查询)

3.1 查询报文

记关于DNS协议的一次学习(递归查询与迭代查询)

Transaction ID:标识字段由客户程序设置并由服务器返回结果。客户程序通过它来确定响应与查询是否匹配。

Flags:一共16bit的控制位,具体的稍后来说。

Questions:表示查询问题区域节的数量。

Answers RRs:表示回答区域的数量。

Authority RRs:表示授权区域的数量。

Additional RRs:表示附加区域的数量。

Queries:Queries区域的内容,具体内容的稍后来说。

3.1.1 Flags

记关于DNS协议的一次学习(递归查询与迭代查询)

Response:0表示query查询消息,1表示response消息。

Opcode:通常值为0(标准查询),其他值为1(反向查询),2(服务器状态请求)。

Truncated:用来指出报文比允许的长度还要长,导致被截断。仅当DNS报文使用UDP服务时使用。因为UDP数据包有长度限制,当长度过长时会被截断。1标识DNS报文长度超过512字节,并被截断。

Recursion desired:0标识迭代查询,1标识执行递归查询。具体的介绍放后面再说明。

Z:保留位

Non-authenticated data:未认证数据,这个我还没有搞太明白什么场景会用到,先mark,知道的朋友可以告诉我一下,谢谢。

3.1.2 Queries

记关于DNS协议的一次学习(递归查询与迭代查询)

Name:要查找的名字,是一个或多个标识符的序列,长度不固定,且不使用填充字节,一般该字段表示的就是需要查询的域名(如果是反向查询,则为IP,反向查询即由IP地址反查域名)。还有这种写法:9baynk52114vicp2cc0,每个标识符以首字节的计数值来说明随后标识符的字节长度,每个名字以最后字节为0结束,长度为0的标识符是根标识符。

Type:每个问题有一个查询类型。2个字节表示查询类型,取值可以为任何可用的类型值,以及通配码*来表示所有的资源记录。常见类型有以下几种:

A:由域名获得IPv4地址

NS:查询授权的域名服务器

CNAME:查询规范名称(别名)

PTR:把IP地址转换成域名(指针记录,反向查询)

MX:邮件交换记录

AAAA:由域名获得IPv6地址。

在查资料的时候发现一个域名,用来查询全球DNS服务器解析域名的情况,也可用来模拟DNS的查询类型,有兴趣的朋友可以去试试看,就是广告有点多。。。https://www.nslookuptool.com

Class:通常为1,表示IN,表明是Internet数据。

3.2 应答报文

记关于DNS协议的一次学习(递归查询与迭代查询)

会发现其实大体结构和请求报文一样,并且有很多字段和请求报文一样,这里就不重复说明了,主要说明一些不一样的东西。

新增加了3个字段Answers、Authoritative nameservers、Additional records。也把这个称为资源记录(RR)区域。

Answers:回答区域的内容,具体内容下面分析。

Authoritative nameservers:授权区域的内容,具体内容下面分析。

Additional records:附加区域的内容,具体内容下面分析。

3.2.1 Flags

记关于DNS协议的一次学习(递归查询与迭代查询)

Authoritative:指出给出应答的服务器是查询域名的授权解析服务器。注意因为别名的存在,应答可能存在多个主域名,这个AA位对应请求名,或者应答中的第一个主域名。1标识域名服务器是授权服务器。

Recursion available:这个比特位在应答中设置或取消,用来代表服务器是否支持递归查询。1标识DNS服务器支持递归查询。

Answer authenticated:应答/权限部分未由服务器进行认证,先mark。

Reply code:状态码。常用值如下:

0 没有差错(No error)。

1 报文格式错误(Format error) - 服务器不能理解请求的报文。

2 服务器失败(Server failure) - 因为服务器的原因导致没办法处理这个请求。

3 名字差错(Name Error) - 只有对授权域名解析服务器有意义,指出解析的域名不存在。

4 没有实现(Not Implemented) - 域名服务器不支持查询类型。

5 拒绝(Refused) - 服务器由于设置的策略拒绝给出应答。比如,服务器不希望对某些请求者给出应答,或者服务器不希望进行某些操作(比如区域传送zone transfer)。

6-15 保留值,暂时未使用。

3.2.2 Answers

记关于DNS协议的一次学习(递归查询与迭代查询)

Name,Type,Class就不再作说明了。

Time to live:生存时间TTL:4字节无符号整数表示资源记录可以缓存的时间。以秒为单位,表示的是资源记录的生命周期,一般用于当地址解析程序取出资源记录后决定保存及使用缓存数据的时间,它同时也可以表明该资源记录的稳定程度,极为稳定的信息会被分配一个很大的值(比如86400,这是一天的秒数)。0代表只能被传输,但是不能被缓存。

Data length:表示RDATA的长度

Address:该字段是一个可变长字段,不定长字符串来表示记录,格式与TYPE和CLASS有关。比如,TYPE是A,CLASS 是 IN,那么RDATA就是一个4个字节的ARPA网络地址。表示按照查询段的要求返回的相关资源记录的数据。可以是Address(表明回应是一个IP地址)或者CNAME(表明回应是一个规范主机名,从3.3.3小节可以看到有不同的数据)等等。

3.2.3 Authoritative nameservers

记关于DNS协议的一次学习(递归查询与迭代查询)

主要说明授权服务器的信息,字段内容和之前报文一致,不再说明。

3.2.4 Additional records

记关于DNS协议的一次学习(递归查询与迭代查询)

这里主要说明了授权服务器的地址信息。字段内容和之前报文一致,不再说明。

4.域名的解析过程

用一个的例子来说明一个DNS解析的过程,在本机需要访问baynk5211.vicp.cc这个URL,访问过程如下:

1.本机向本地服务器192.168.2.1进行递归查询

2.本地服务器在缓存里面没有baynk5211.vicp.cc的记录,采用迭代查询,联系13个根服务器中的一个进行查询。

3.13个根服务器中的j.root-servers.net告诉本地服务器,下一次应查询的*域名服务器cc.的IP地址/域名。

4.本地服务器向ac2.nstld.com请求查询。

5.ac2.nstld.com回复本地服务器应该去向vicp.cc.进行查询。

6.本地服务器向ns2.exhera.com进行查询。

7.ns2.exhera.com回复本地服务器baynk5211.vicp.cc.的地址为171.113.172.242。

8.本地服务器向本机应答刚刚收到的结果,整个查询结束。

记关于DNS协议的一次学习(递归查询与迭代查询)

PS:关于“dig”的使用,下篇博客见。

4.1 递归查询

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

记关于DNS协议的一次学习(递归查询与迭代查询)

主机向本地域名服务器的查询一般都是采用递归查询。

4.2 迭代查询

迭代查询:当根域名服务器收到本地域名服务器发出的迭代查询请求报文时,要么给出所要查询的IP地址,要么告诉本地服务器:“你下一步应当向哪一个域名服务器进行查询”。然后让本地服务器进行后续的查询。根域名服务器通常是把自己知道的*域名服务器的IP地址告诉本地域名服务器,让本地域名服务器再向*域名服务器查询。*域名服务器在收到本地域名服务器的查询请求后,要么给出所要查询的IP地址,要么告诉本地服务器下一步应当向哪一个权限域名服务器进行查询。最后,知道了所要解析的IP地址或报错,然后把这个结果返回给发起查询的主机。

记关于DNS协议的一次学习(递归查询与迭代查询)

本地域名服务器向根域名服务器的查询的是迭代查询。

5.小结

上述的域名解析流程其实是最简单的一种,实际上,域名解析还包括缓存、分布式等特点,利用域名解析还可以实现负载均衡、CDN加速等功能,有机会再进行学习研究这些吧。