当客户需要域名解析服务、域名服务器之间更新解析信息时,需要构造DNS协议报文。DNS协议定义了查询和响应的报文格式。DNS协议报文的完整规范可以参考RFC1035。DNS数据报通常由UDP传输,使用熟知端口号53。
1.DNS通用报文
DNS查询和响应报文的格式基本相同,只是在响应中添加了一些回答字段,其通用格式如图7-3所示。
DNS通用报文由12字节的首部和4个可变长度的字段组成。各字段的含义如下。
1)标识字段:16bit,由应用程序设置,域名服务器在响应时也需要填写同样的数据,应用程序通过这个字段来匹配查询和响应报文。
图7-3 DNS报文通用格式
2)标志字段:16bit,划分为若干子字段,设置查询方式和返回结果代码等,如图7-4所示。
图7-4 DNS协议标志字段
●QR:1bit,0表示查询报文,1表示响应报文。
●Opcode:4bit,用来指出查询类型,通常取值为0。0为标准查询,1为反向查询,2为服务器状态请求,值3~15保留使用。
●AA(Authoritative Answer):1bit,表示为授权回答。仅在响应报文里是有意义的,表示域名服务器对被查询的域名是授权的。
●TC(Truncated):1bit,表示被截断。仅在响应报文里是有意义的。当响应的报文的字节数大于512字节时,将只返回前512字节,这时候TC字段被置位为1,以提示客户再次进行域名解析请求。因为绝大多数情况DNS报文是基于UDP传输的,如果出现报文截断的情况,一般需要再次请求以TCP方式进行传输。
●RD(Recursion Desired):1bit,表示为期望递归。在查询报文中有效。如果置为1,表示希望域名服务器进行递归查询,即如果当前域名服务器没有相应的映射表,那么它应该向其余域的域名服务器查询,直到得到所需要的响应数据,然后返回给客户。当然递归查询执行的条件是域名服务器支持这种查询操作。如果置为0,表示期望进行迭代查询,这时域名服务器不需要向其余域的域名服务器查询,只需要向客户端返回一个可以解析被查询域名的域名服务器清单,然后客户根据这些列表再次发送查询请求。
●RA(Recursion Available):1bit,表示可用递归。仅在响应报文中有效。表示当前域名服务器是否支持递归查询,支持则置为1,反之置为0。
●(zero)字段:3bit,保留将来使用,必须置为0。
●Recode(Response Code):4bit,返回码,用来说明查询结果。0为没有差错,1为格式错误,2为服务器错误,3为名字差错。通常为0或者3。
3)查询问题数、资源记录数、授权资源记录数和额外资源记录数分别用来说明后面对应字段中包含的记录数。
2.DNS查询报文
查询报文指的是当需要进行域名解析时,客户发送的协议报文,查询报文只含有查询问题部分。查询问题字段的格式如图7-5所示,包含3个字段:查询名、查询类型和查询类。
图7-5 DNS查询数据报包格式
1)查询名:即需要查询的名字,一般为域名,如www.baidu.com,它在报文中的表示方法并不是按字符顺序直接存储的,而是有自己的存储方式,以www.baidu.com为例,其存储方式如图7-6所示。
从图7-6可以看出,首先是计数,后续才是字符。计数是标识后续字符串的长度,这种方法有点类似当前数据库中的存储方式。特别注意的是最后1字节为0,且必须以0结束。若未满,无须填充字节。计数值占1字节,所以后续字符串最长为255。事实上RFC规定后续字符串最长仅为63,因为计数字节的最高两位为1时,将用于压缩格式。
2)查询类型:每一个查询报文都有一个类型,每一个响应也有一个类型。通常查询类型比响应类型要多,响应类型是查询类型的一个子集,表7-2列出了常用的查询类型,共20个,而响应类型大约只取16种。
最常用的查询类型是A类型,通常称为A记录,表示希望得到一个域名的IP地址。PTR类型指的是期望得到一个IP地址对应的域名。
3)查询类:RFC1035定义了4种查询类,表7-3例出了这4种类。(www.daowen.com)
图7-6 查询名存储示例
表7-2 查询类型
表7-3 查询类
查询类除了IN类型,其余都比较少见。因为现在的主机都是使用互联网地址,而很少使用其余类型的地址,因此,通常取值为1。
3.DNS响应报文
资源记录、授权资源记录和额外资源记录一般统称为资源记录(Resource Record)。DNS协议规定使用相同的格式去标识资源记录,图7-7是资源记录的格式,各字段的含义如下。
1)域名:记录中资源数据对应的名字,它的格式和查询名字段格式相同。
2)类型和类:与查询报文中的查询类和查询类型字段基本一致。
图7-7 资源记录格式
3)生存时间:表示客户端保留资源记录的有效时间,单位为s。
4)资源数据长度:说明资源数据的长度,该字段依赖于类型字段的值,对于A记录类型,资源数据是4字节的IP地址。
5)资源数据:这里面是详细的响应内容。
4.DNS报文分析实例
正如之前所述,DNS协议属于网络支撑协议,基本上所有的网络服务都需要用到DNS协议,如浏览网页服务、电子邮件服务等。当在南开大学的IP地址为192.168.1.100的计算机上的浏览器输入www.baidu.com时,开启Wireshark抓包软件,就可以抓取到如下的数据流:
数据流中第一列为抓包序号,第二列是抓包时间,第三列是源IP地址,第四列是目的IP地址,第五列是报文的内容。需要注明的是202.99.96.68是天津市联通的域名服务器。上面只给出了与域名解析有关的两个报文。
1号报文是DNS查询报文,其各个字段值分析如下:
2号报文为DNS响应报文,其各个字段值分析如下:
在对报文的分析过程中也可以发现此次DNS查询和响应都是使用UDP协议,使用的UDP端口号为53,特别需要强调的是熟知端口号53专用于DNS服务。
同时,从返回DNS响应报文Answers(“问题回答”)字段的分析可以知道,www.baidu.com是一个CNAME记录,它真正的域名是www.a.shifen.com。www.a.shifen.com对应的IP地址有两个,分别为202.108.22.43和202.108.22.5,同时在Authoritative nameserv-ers(授权资源记录)字段里返回了该域名所属的域名服务器,总共有4个,在Additionalre-cords(额外信息记录)字段里返回了这些域名服务器对应的IP地址。因此,如果用户需要编写一个域名解析程序,那么读取4个资源记录字段的后两个记录字段是必要的。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。