DNS报文格式(借个图贴过来):
说明一下:并不是所有DNS报文都有以上各个部分的。图中标示的“12字节”为DNS首部,这部分肯定都会有,首部下面的是正文部分,其中查询问题部分也都会有。除此之外,回答、授权和额外信息部分是只出现在DNS应答报文中的,而这三部分又都采用资源记录(Recource Record)的相同格式,这个稍后会提到。下面逐个字段地分析DNS报文。
标识(2字节):这个字段网上的解释有点不清楚:“由客户程序设置并有服务器返回结果。”看了下实验室的程序和文档,原来这个字段可以看作是DNS报文的ID,对于相关联的请求报文和应答报文,这个字段是相同的,由此可以区分DNS应答报文是哪个请求报文的响应。
标志(2字节):这部分非常重要,需要逐比特分析。再借个图:
QR(1比特):查询/响应的标志位,1为响应,0为查询。
opcode(4比特):定义查询或响应的类型(若为0则表示是标准的,若为1则是反向的,若为2则是服务器状态请求)。
AA(1比特):授权回答的标志位。该位在响应报文中有效,1表示名字服务器是权限服务器(关于权限服务器以后再讨论)
TC(1比特):截断标志位。1表示响应已超过512字节并已被截断(依稀好像记得哪里提过这个截断和UDP有关,先记着)
RD(1比特):该位为1表示客户端希望得到递归回答(递归以后再讨论)
RA(1比特):只能在响应报文中置为1,表示可以得到递归响应。
zero(3比特):不说也知道都是0了,保留字段。
rcode(4比特):返回码,表示响应的差错状态,通常为0(没有差错)和3(名字差错)
标志段说完了,下面是问题数、资源记录数、授权资源记录数和额外资源记录数,这四个字段都是两字节,分别对应下面的查询问题、回答、授权和额外信息部分的数量。一般问题数都为1,DNS查询报文中,资源记录数、授权资源记录数和额外资源记录数都为0.
该说正文部分了。查询问题部分格式如下:
查询名部分长度不定,一般为要查询的域名(也会有IP的时候,即反向查询)。此部分由一个或者多个标示符序列组成,每个标示符以首字节数的计数值来说明该标示符长度,每个名字以0结束。计数字节数必须是0~63之间。该字段无需填充字节。还是借个例子来说明更直观些,查询名为gemini.tuc.noao.edu的话,查询名字段如下:
查询类型(2字节):通常查询类型为A(由名字获得IP地址)或者PTR(获得IP地址对应的域名),类型列表如下:
类型
助记符
说明
1
A
IPv4地址。
2
NS
名字服务器。
5
CNAME
规范名称。定义主机的正式名字的别名。
6
SOA
开始授权。标记一个区的开始。
11
WKS
熟知服务。定义主机提供的网络服务。
12
PTR
指针。把IP地址转化为域名。
13
HINFO
主机信息。给出主机使用的硬件和操作系统的表述。
15
MX
邮件交换。把邮件改变路由送到邮件服务器。
28
AAAA
IPv6地址。
252
AXFR
传送整个区的请求。
255
ANY
对所有记录的请求。
查询类(2字节):通常为1,指Internet数据。
前面说过,回答字段,授权字段和附加信息字段均采用资源记录RR(Resource Record)的相同格式。该格式如下:
域名字段(不定长或2字节):记录中资源数据对应的名字,它的格式和查询名字段格式相同。但是看报文实例还有分析程序,我发现很多DNS响应报文中,此字段由于和查询问题部分的域名相同,改为使用2字节指针,指向查询问题部分的域名。关于指针怎么计算,TCP/IP详解里面有,不过这本书昨天刚被师兄拿回去,所以现在写不了了。
类型(2字节)、类(2字节):含义与查询问题部分的类型和类相同。
生存时间(4字节):该字段表示资源记录的生命周期(以秒为单位),一般用于当地址解析程序取出资源记录后决定保存及使用缓存数据的时间。
资源数据长度(2字节):表示资源数据的长度(以字节为单位,如果资源数据为IP则为0004)
资源数据:该字段是可变长字段,表示按查询段要求返回的相关资源记录的数据。
基本上对DNS报文格式的分析就是这些了。贴个报文实例,用wireshark抓的:
对应的报文:
就不再分析了,对比wireshark的分析应该能找到各个字段。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jianghui3132749/archive/2010/03/03/5343420.aspx