对DNS报文的理解

 

对DNS报文的理解  

2009-07-01 18:14:43|  分类: 电脑(信息区) |  标签: |字号 订阅

本人是在windows 上使用nslookup工具来产生的dns通信,见上图。


-----------------------------dns查询报文------------------------------------
首先是一个dns查询报文抓包:
0000: 00 14 78 b5 da ae 00 0c 6e ec 1e ae 08 00 45 00 ..x.....n.....e.
0010: 00 38 00 33 00 00 80 11 29 6f c0 a8 a8 02 dd 05 .8.3....)o......
0020: cb 62 04 0f 00 35 00 24 17 95 00 02 01 00 00 01 .b...5.$........
0030: 00 00 00 00 00 00 03 66 74 70 02 75 75 03 6e 65 .......ftp.uu.ne
0040: 74 00 00 01 00 01 t.....

对以太网首部和ip首部字段就不再加以解释说明,直接以udp首部开始分析.

04 0f---udp源端口号1039;
00 35---udp目的端口号53;
00 24---udp报文长度36字节;
17 95---udp检验和;

接下来就是dns请求报文的内容了:
00 02---标识符;
01 00---16 bit标志,二进制表示为00000001 000000000
从高位到低位,第一位0表示这是一个dns查询报文; 第2-5位0000是opcode字段,这里表示是一个标准查询;
第6位0表示授权回答未设置; 第7位0表示可截断位未设置; 第8位1表示期望递归已设置; 第9位0表示可用递归未设置;
第10-12位000表示zero字段; 第13-16位0000表示4位返回码字段,表示没有差错产生。
00 01---问题数为1
00 00---资源记录数为0
00 00---授权资源记录数为0
00 00---附加资源记录数为0
03 66 74 70 02 75 75 03 6e 65 74 00---问题部分的查询名字段,它是一个或多个标识符的序列,每个标识符以首字节的计数值来说明随后
标识符的字节长度,每个名字以最后字节为0结束。03(计数),66 74 70(ftp),02(计数),75 75(uu),03(计数),6e 65 74(net),00(结束)
00 01---表示查询类型字段,这里表示一个a记录的查询;
00 01---表示查询类字段,通常是1,指互联网地址
----------------------------------------------------------------------------


-----------------------------dns响应报文------------------------------------
下面是对上面的一个dns查询报文所产生的dns响应报文抓包:
0000: 00 0c 6e ec 1e ae 00 14 78 b5 da ae 08 00 45 00 ..n.....x.....e.
0010: 00 a1 1a 1c 00 00 18 11 77 1d dd 05 cb 62 c0 a8 ........w....b..
0020: a8 02 00 35 04 0f 00 8d 31 fe 00 02 81 80 00 01 ...5....1.......
0030: 00 01 00 04 00 00 03 66 74 70 02 75 75 03 6e 65 .......ftp.uu.ne
0040: 74 00 00 01 00 01 c0 0c 00 01 00 01 00 00 0c 82 t...............
0050: 00 04 c0 30 60 09 c0 10 00 02 00 01 00 00 0d 2c ...0`..........,
0060: 00 0c 06 61 75 74 68 36 30 02 6e 73 c0 10 c0 10 ...auth60.ns....
0070: 00 02 00 01 00 00 0d 2c 00 0a 07 61 75 74 68 32 .......,...auth2
0080: 30 30 c0 3f c0 10 00 02 00 01 00 00 0d 2c 00 0a 00.?.........,..
0090: 07 61 75 74 68 32 31 30 c0 3f c0 10 00 02 00 01 .auth210.?......
00a0: 00 00 0d 2c 00 09 06 61 75 74 68 30 30 c0 3f ...,...auth00.?

00 35---udp源端口号53;
04 0f---udp目的端口号1039;
00 8d---udp报文长度141字节;
31 fe---udp检验和;
00 02---标识符,与dns请求报文中的相对应.
81 80---16 bit标志,二进制表示为10000001 10000000
从高位到低位,第一位1表示这是一个dns响应报文; 第2-5位0000是opcode字段,这里表示是一个标准查询;
第6位0表示授权回答未设置; 第7个0表示可截断位未设置; 第8位1表示期望递归已设置; 第9位1表示可用递归已设置;
第10-12位000表示zero字段; 第13-16位0000表示4位返回码字段,表示没有差错产生。
00 01---问题数为1
00 01---资源记录数为1
00 04---授权资源记录数为4
00 00---附加资源记录数为0

[问题]部分
03 66 74 70 02 75 75 03 6e 65 74 00---问题部分的查询名字段,它是一个或多个标识符的序列,每个标识符以首字节的计数值来说明随后
标识符的字节长度,每个名字以最后字节为0结束。03(计数),66 74 70(ftp),02(计数),75 75(uu),03(计数),6e 65 74(net),00(结束)
00 01---表示查询类型字段,这里表示一个a记录的查询;
00 01---表示查询类字段,通常是1,指互联网地址

[回答]部分:
c0 0c---回答字段部分中的域名字段。因为有重复域名的出现,这里使用了压缩方式。这里需要详细的讲解。

《tcp/ip卷一》书中是这样描述的:“当一个域名中的标识符是压缩的,它的单计数字节中的最高两位将被置为11。这表示它是一个16 bit指
针而不再是8 bit的计数字节。指针中的剩下14 bit说明在该dns报文中标识符所在的位置(起始位置由标识字段的第一字节起算)。一个指针
可能指向一个完整的域名,也可能只指向域名的结尾部分,因为给定域名的结尾标识符是相同的。”

c0 0c二进制表示为11000000 00001100,最高两位被置为11,剩下的14位"000000 00001100"说明标识符所在的位置相对于dns报文起始位置偏
移了12字节,因此就是指向"03 66 74 70 02 75 75 03 6e 65 74 00"中(问题部分中的查询名字段)的03字节,而03相对于dns报文起始位置
的偏移量正好为12。也就是说指针指向的内容为ftp.uu.net
00 01---表示查询类型字段,这里表示一个a记录的查询;
00 01---表示查询类字段,通常是1,指互联网地址
00 00 0c 82---表示生存时间为3202秒
00 04---表示资源数据长度为4
c0 30 60 09---表示资源数据,这里表示的是一个32 bit ip地址 192.48.96.9


[授权资源记录]部分:
c0 10---授权资源记录部分中的域名字段,根据上面的计算方法,这个16 bit指针,指向的内容偏移dns报文起始位置16字节,因此指向"02 75
75 03 6e 65 74 00"中的02字节,也就是说指针指向的内容为uu.net
00 02---表示查询类型字段,这里表示一个ns记录的查询;
00 01---表示查询类字段,通常是1,指互联网地址
00 00 0d 2c---表示生存时间为3372秒
00 0c---表示授权资源数据长度为12
06 61 75 74 68 36 30 02 6e 73 c0 10---表示授权资源数据,06(计数),61 75 74 68 36 30(auth60),02(计数),6e 73(ns),c0 10(仍然表示
一个16 bit指针,指向"02 75 75 03 6e 65 74 00"的内容,连起来,所表示的域名就是 auth60.ns.uu.net)

后面三条授权资源记录的解释就省略了,方法都是一样的。
----------------------------------------------------------------------------

在nslookup交互式命令中打入set debug开启调试状态,可以显示更丰富的信息。
我们对照抓图,可以发现我们的分析跟图中显示完全符合。
其它类型的dns报文在理解上也是一样的.
阅读更多
个人分类: 协议分析
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭