DNS报文格式(借个图贴过来):

DNS报文Additional records 可以放多个OPT dns报文类型_数据

    说明一下:并不是所有DNS报文都有以上各个部分的。图中标示的“12字节”为DNS首部,这部分肯定都会有,首部下面的是正文部分,其中查询问题部分也都会有。除此之外,回答、授权和额外信息部分是只出现在DNS应答报文中的,而这三部分又都采用资源记录(Recource Record)的相同格式,这个稍后会提到。下面逐个字段地分析DNS报文。

    标识(2字节):这个字段网上的解释有点不清楚:“由客户程序设置并有服务器返回结果。”看了下实验室的程序和文档,原来这个字段可以看作是DNS报文的ID,对于相关联的请求报文和应答报文,这个字段是相同的,由此可以区分DNS应答报文是哪个请求报文的响应。

    标志(2字节):这部分非常重要,需要逐比特分析。再借个图:

DNS报文Additional records 可以放多个OPT dns报文类型_DNS_02

    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,各取值含义如下:

0          无差错

1          格式差错

2          问题在域名服务器上

3          域参照问题

4          查询类型不支持

5          在管理上被禁止

6          -- 15 保留

    标志段说完了,下面是问题数、资源记录数、授权资源记录数和额外资源记录数,这四个字段都是两字节,分别对应下面的查询问题、回答、授权和额外信息部分的数量。一般问题数都为1,DNS查询报文中,资源记录数、授权资源记录数和额外资源记录数都为0.

    该说正文部分了。查询问题部分格式如下:

DNS报文Additional records 可以放多个OPT dns报文类型_DNS_03

    查询名部分长度不定,一般为要查询的域名(也会有IP的时候,即反向查询)。此部分由一个或者多个标示符序列组成,每个标示符以首字节数的计数值来说明该标示符长度,每个名字以0结束。计数字节数必须是0~63之间。该字段无需填充字节。还是借个例子来说明更直观些,查询名为gemini.tuc.noao.edu的话,查询名字段如下:

DNS报文Additional records 可以放多个OPT dns报文类型_数据_04

    查询类型(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)的相同格式。该格式如下:

DNS报文Additional records 可以放多个OPT dns报文类型_数据_05

    域名字段(不定长或2字节):记录中资源数据对应的名字,它的格式和查询名字段格式相同。当报文中域名重复出现时,就需要使用2字节的偏移指针来替换。例如,在资源记录中,域名通常是查询问题部分的域名的重复,就需要用指针指向查询问题部分的域名。关于指针怎么用,TCP/IP详解里面有,即2字节的指针,最签名的两个高位是11,用于识别指针。其他14位从报文开始处计数(从0开始),指出该报文中的相应字节数。注意,DNS报文的第一个字节是字节0,第二个报文是字节1。一般响应报文中,资源部分的域名都是指针C00C(1100000000001100),刚好指向请求部分的域名。

    类型(2字节)、类(2字节):含义与查询问题部分的类型和类相同。

    生存时间(4字节):该字段表示资源记录的生命周期(以秒为单位),一般用于当地址解析程序取出资源记录后决定保存及使用缓存数据的时间。

    资源数据长度(2字节):表示资源数据的长度(以字节为单位,如果资源数据为IP则为0004)

    资源数据:该字段是可变长字段,表示按查询段要求返回的相关资源记录的数据。

    基本上对DNS报文格式的分析就是这些了。贴个报文实例,用wireshark抓的:

DNS报文Additional records 可以放多个OPT dns报文类型_DNS_06

    对应的报文:

DNS报文Additional records 可以放多个OPT dns报文类型_DNS_07

    就不再分析了,对比wireshark的分析应该能找到各个字段。

天道酬勤 循序渐进 技压群雄