DNS 协议是应用层协议,DNS 查询使用的是UDP 协议和端口53。响应也通过UDP 协议返回,如果大于512 KB,则使用TCP。服务器之间的“区传送”则都使用TCP 协议。
RFC 1034 说明了DNS 协议的概念和功能,RFC 1035 详细说明了DNS 协议的规范和实现。
1.DNS 报文的总体格式
DNS 定义了一个用于查询和响应的报文格式,报文的总体格式如图3-1-24 所示。
图3-1-24 DNS 报文的总体格式
DNS 报文由12 字节长的首部和4 个长度可变的数据字段组成,各字段含义如下。
1)标识
首部中的标识(ID)字段是用来鉴证每个DNS 报文的印记,由客户端设置,由服务器返回,它可以让客户匹配请求与响应。在域名解析的整个过程中,客户端以特定的标识向DNS 服务器发送域名查询数据包,DNS 服务器查询之后,以相同的ID 号向客户端发送域名响应数据包。这时,客户端会将收到的DNS 响应数据包的ID 和自己发送的查询数据包ID相比较。如果匹配,则表明接收到的正是自己等待的数据包;如果不匹配,则丢弃之。
2)标志
16 位的“标志”字段被划分为若干子字段,如图3-1-25 所示。
图3-1-25 DNS 首部的“标志”字段格式
从左往右各子字段的定义和属性:
●QR: 值为0,表示查询报文;值为1,表示响应报文。
●opcode: 通常,值为0,表示标准查询;值为1,表示反向查询;值为2,表示服务器状态请求。
●AA: 表示“授权回答”。该名字服务器是授权于该域的。
●TC: 表示“可截断的”。使用UDP 时,它表示当应答的总长度超过512 字节时,只返回前512 字节。
●RD: 表示“期望递归”。该字段能在一个查询中设置,并在响应中返回。这个标志告诉名字服务器必须处理这个查询,也称为一个递归查询。如果该位为0,且被请求的名字服务器没有一个授权回答,它就返回一个能解答该查询的其他名字服务器列表,这称为迭代查询。
●RA: 表示“可用递归”。如果名字服务器支持递归查询,则在响应中将该字段设置为1。大多数名字服务器都提供递归查询,除了某些根服务器。
●zero: 必须为0。
●rcode: 返回码字段。通常的值为0 (没有差错)和3 (名字差错)。名字差错只有从一个授权名字服务器上返回,它表示在查询中制定的域名不存在。
3)其他字段
首部中随后的4 个16 位字段说明了4 个可变长数据字段中包含的条目数。对于查询报文,“问题数”字段通常值为1,而其他3 项则均为0。与之类似,对于应答报文,“问题数”字段值通常是1,“回答数”字段值至少是1,剩下的两项可以是0 或非0。
2.DNS 查询报文
当DNS 报文中标志字段中第一个位为0 时,表示这个报文是查询报文,此时需要关注该报文中的“查询问题”字段。
在“查询问题”部分中,每个问题的格式如图3-1-26 所示,通常只有一个问题。
图3-1-26 DNS 查询报文的问题部分格式
1)查询名
查询名指要查找的名字,它是一个或多个标识符的序列。每个标识符以首字节的计数值来说明随后标识符的字节长度,每个名字以最后字节为0 结束,长度为0 的标识符是根标识符。
图3-1-27 所示为如何存储域名“gemini.tuc.noao.edu”。
2)查询类型
查询类型指期望获得查询名的不同类型信息,大约有20 个不同的类型值,表3-1-2所示为其中的一些值及相应的信息。
图3-1-27 DNS 首部的“查询名”字段存储域名的实例
表3-1-2 DNS 首部的“查询类型”字段值及描述(部分)
最常用的“查询类型”是A 类型,表示期望获得查询名的IP 地址;一个PTR 查询表示请求获得一IP 地址对应的域名,这是一个指针查询。
3)查询类
该字段通常是1,指互联网地址(某些站点也支持其他非IP 地址)。
DNS 查询报文的实例如图3-1-28 所示,通过其可以了解“查询问题”部分的各字段的值,加深对各字段定义的理解。
图3-1-28 DNS 查询报文的“查询问题”部分实例(www.xing528.com)
3.DNS 响应报文
当DNS 报文中“标志”字段的第1 位为1 时,表示这个报文是响应报文,需要关注该报文中的最后3 个字段,即资源记录部分。
DNS 报文中最后的3 个字段为回答字段、授权字段和附加信息字段,均采用一种称为资源记录RR (Resource Record)的格式。资源记录的格式如图3-1-29 所示。
图3-1-29 DNS 首部的资源记录RR 的统一格式
各字段含义如下:
●域名: 记录资源数据对应的名字,该名称与资源记录所在的控制台树结点的名称相同。
●类型: 说明RR 的类型码,其取值及含义和查询报文中的“查询类型”是一样的。
●类: 通常为1,指Internet 数据。
●生存时间: 客户程序保留该资源记录的秒数。
●资源数据长度: 说明资源数据的数量。
●资源数据: 该数据的格式依赖于类型字段的值。对于类型1 (A 记录),资源数据是4 字节的IP 地址;对于类型5 (CNAME 规范名称),资源数据是若干字节的域名记录。
4.协议实例分析
在DNS 客户端开启IE 浏览器,将临时文件清空,再启动Wireshark,设置为截获所有IP数据包,然后用IE 浏览器访问某一网站,如www.sohu.com。当网站显示完毕后,停止Wireshark 抓包,共抓取到22 帧数据。本机IP 地址是192.168.10.5,设置的本地域名服务器IP 地址是192.168.10.6。在此,仅关注最初的DNS 数据包,保存数据文件,如图3-1-30 所示。
图3-1-30 DNS 查询报文实例
1)DNS 工作过程
当用域名访问某网站时,如果本地DNS 缓存中没有该域名解析的IP 地址,则会向本地DNS 服务器发送DNS 查询报文,当DNS 客户端收到服务器发来的DNS 应答报文后,分析报文即可得知目的网站的IP 地址。接下来,客户端与该IP 地址通过三次握手建立连接,通过HTTP 协议来获取网站内容。
由图3-1-30 可知:
第21 帧是本机发往DNS 域名服务器的DNS 查询报文,共68 字节。
第22 帧是域名服务器发回的DNS 应答报文,共116 字节。
注意:
两帧数据包的ID 号相同,都是(5957)16。
2)DNS 报文的总体格式
DNS 协议定义的查询报文和应答报文有同样的总体格式,都是由12 字节长的首部和4个长度可变的字段组成。如图3-1-30 所示,以第21 帧查询报文为例,分析实例数据的含义。
第1 帧有68 字节数据,第0 ~13 字节是以太网数据包头,第14 ~33 字节是IP 数据包头,第34 ~41 字节是UDP 数据包头,从第42 字节开始是DNS 数据报文。
在DNS 数据报文中,前12 字节是DNS 首部,其中第1、2 字节是ID 号,如实例中的ID数据值为“5957”,这是十六进制数据,转换为十进数据即22871。
第3、4 字节是标志字段,实例数据为“0100”,转换成二进制形式为“0000000100000000”。对照图3-1-30 可知,该报文是一个查询报文、是标准报文、是不可截断的,等等。
第5、6 字节是查询的问题数量字段,实例数据为“0001”,表明查询的问题数为1 个。
DNS 首部余下的几字节实例数据都为0,表明没有回答、没有授权、没有附加数据。
3)DNS 查询报文
当DNS 报文中“标志”字段中第1 位为0 时,表示这个报文是查询报文。实例中除去DNS 首部后,剩下的18 字节即查询报文的问题部分。如图3-1-30 所示。
最后4 字节是查询类型和查询类字段,实例数据都是“0001”,表明查询类型是A,即表明期望获得查询名的IP 地址;查询类是1,指互联网地址(某些站点也支持其他非IP 地址)。
问题部分的剩下字节是查询名字段,实例数据为“ 04 73 6f 68 75 03 63 6f 6d 00”,其中“04”“03”“00”等为计数字节,“73”“6f”“63”等是“s”“o”“c”等字符的ASCII 码值,因此,实例数据很容易译为“sohu.com”。
总结起来,该实例DNS 查询报文是向DNS 域名服务器查询域名www.sohu.com 的IP地址。
4)DNS 应答报文
该实例相应的DNS 应答报文如图3-1-31 所示。
首部的信息与查询报文有所不同。“标志”字段实例数据为“81 80”,表明该报文是应答报文、不是授权域名服务器、不截断回答、使用递归查询等。
图3-1-31 DNS 应答报文实例
首部的其余字段表明,该应答报文有1 个问题、3 个问题回答、0 个授权回答、0 个附加记录。3 个问题的回答如图3-1-32 所示。
图3-1-32 DNS 应答报文的3 个问题的回答
DNS 应答报文除去首部后的3 个字段为回答字段、授权字段、附加信息字段。在此,仅分析回答字段的格式及具体数据含义。在回答字段里给了3 个答案,说明域名www.sohu.com 的IP 地址有3 个,分别是: 221.179.177.36;123.125.116.28;220.181.90.52。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。