DNS报文

来源:互联网 发布:seo网络营销策略 编辑:程序博客网 时间:2024/05/18 02:29
摘自:
 http://hi.baidu.com/hcq11/blog/item/35bb62fa1ca0e112a8d311a2.html
DNS报文
2010-04-08 19:35
  1. 下边是DNS报文的大致格式:
  2. +---------------------------+---------------------------+
  3. |     标识 (最重要的 :)    |       参数          |
  4. +---------------------------+---------------------------+
  5. |        问题数              |       回答数          |
  6. +---------------------------+---------------------------+
  7. |        管理机构数       |        附加信息数       |
  8. +---------------------------+---------------------------+
  9. |                                                    |
  10. /                                                    /
  11. /                      问题                         /
  12. |                                                    |
  13. +-------------------------------------------------------+
  14. |                                                    |
  15. /                                                    /
  16. /                      回答                         /
  17. |                                                    |
  18. +-------------------------------------------------------+
  19. |                                                    |
  20. /                                                    /
  21. /                附加信息(无关紧要)                   /
  22. |                                                    |
  23. +-------------------------------------------------------+
  24. DNS报文结构
  25. 标识(id)
  26. 这是用来鉴证每个DNS报文的印记,由客户端设置,由服务器返回,它可以让客户匹
  27. 配请求与响应。
  28. 参数(flags)
  29. 参数域被分成好几个部份:
  30.    4 位                3 位,总是0
  31.    |                      |
  32.    |                      |
  33. [QR | opcode | AA| TC| RD| RA | zero | rcode ]
  34.                                         |
  35. |          |__|__|__|__|__|          |______ 4 位
  36. |                    |_ 1 位
  37. |
  38. 1 位
  39. QR     = 如果QR位设为0表示报为是查询,如果1则是响应
  40. opcode = 通常是0,指标准查询,1是反向查询,2是服务器状态查询。
  41. AA     = 如果此位为1,表示服务器对问题部份的回答是权威性的。
  42. TC     = 截断,如果UDP包超过512字节将被截流
  43. RD     = 表示希望递归,如果它设为1的话,表示递归查询。
  44. RA     = 如果设为1,表示递归可用。
  45. Zero = 如它的名称一样,总是0
  46. rcode   = 就象errno一样,0表示没有错误,3表示名字错误。
  47. DNS查询报文:
  48. 下面是DNS报文查询的格式:
  49. +--------------------------------------------------------------------+
  50. |                             查询名                                  |
  51. +--------------------------------------------------------------------+
  52. |    查询类型                 |          查询类                |
  53. +--------------------------------+-----------------------------------+
  54. 一个报文查询的结构是下面这样的
  55. 查询名是要查找的名字,它是一个或多个标识符的序列。每个标识符以首字节的计数值
  56. 来说明随后标识符的字节长度,每个名字以最后字节为0结束,长度为0的标识符是根标识符。
  57. 计数字节的值必须是0 ~ 6 3的数,因为标识符的最大长度仅为6 3(在本节的后面我们将看到计数字节的最高两比特为1,即值1 9 2 ~ 2 5 5,将用于压缩格式)。不像我们已经看到的许多其他报文格式,该字段无需以整32 bit边界结束,即无需填充字节。
  58. 示例:
  59. www.heike.com是[3|w|w|w|5|h|e|i|k|e|3|c|o|m|0]
  60. 对IP地址来说,也是同样的;)
  61. 44.33.88.123.in-addr.arpa是:
  62. [2|4|4|2|3|3|2|8|8|3|1|2|3|7|i|n|-|a|d|d|r|4|a|r|p|a|0]
  63. 还有一种压缩格式,但我们不需要用到,就略过了。
  64. 查询类型:
  65. 这里是一些我们最经常用到的查询类型——这些类型大约有20种不同的类型,我可懒得全部列出来了;)
  66. 名称    值
  67. A | 1 | IP地址           (将域名解析为IP)
  68. PTR   | 12 | 指针          (将IP解析为域名)
  69. DNS响应报文:
  70. 响应报文有个共同的格式,我们称之为资源记录——RR
  71. 下面是响应报文的格式(RR)
  72. +--------------------------------------------------------------------+
  73. |                                域名                                  |
  74. +--------------------------------------------------------------------+
  75. |       类型                    |              类                   |
  76. +----------------------------------+---------------------------------+
  77. |                         TTL (生存时间)                            |
  78. +--------------------------------------------------------------------+
  79. |    资源数据长度       |                                        |
  80. |---------------------------+                                        |
  81. |                            资源数据                               |
  82. +--------------------------------------------------------------------
  83. 域名:
  84. 域名是与下面的资源数据对应的名字,它的格式同前面讲到的查询名一样,比如还是
  85. www.heike.com吧,它的域名是用下面方式表现的:[3|w|w|w|5|h|e|i|k|e|3|c|o|m|0]
  86. 类型:
  87. 类型标识了RR类型代码号,它同前面讲到的查询类值一样。
  88. 类:
  89. 通常为1,表示因特网数据。
  90. 生存时间:
  91. 表示客户方将RR放在高速缓存里的时间,RRs的TTL通常为2天。
  92. 资源数据长度:
  93. 标识资源数据的大小。
  94. 下面我们将用一个简单的例子来帮助大家理解:
  95. 这个例子展示了当ns.bibi.com向ns.heike.com询问www.heike.com地址时,这些数据报文的模样。
  96. ns.bibi.com:53 ---> [?www.heike.com] ----> ns.heike.com:53 (Phear Heike ;)
  97. +---------------------------------+----------------------------------+
  98. |    标识(ID) = 1999          |    QR = 0 opcode = 0 RD = 1        |
  99. +---------------------------------+----------------------------------+
  100. |     问题数 = htons(1)           |          回答数 = 0             |
  101. +---------------------------------+----------------------------------+
  102. |     管理机构数 = 0              |           附加信息数 = 0          |
  103. +---------------------------------+----------------------------------+
  104. <问题部份>
  105. +-------------------------------------------------------------------+
  106. |                查询名 = [3|w|w|w|5|h|e|i|k|e|3|c|o|m|0]              |
  107. +--------------------------------------------------------------------+
  108. |       查询类型 = htons(1) |           查询类=htons(1)          |
  109. +---------------------------------+----------------------------------+
  110. 上面是查询报文
  111. 现在我们来看看ns.heike.com的回答
  112. ns.heike.com:53 -->[IP of www.heike.com is 31.33.7.44] --> ns.bibi.com:53
  113. +---------------------------------+----------------------------------+
  114. |       标识(ID) = 1999       | QR=1 opcode=0 RD=1   AA =1   RA=1 |
  115. +---------------------------------+---------------------------------+
  116. |       问题数 = htons(1)    |           回答数 = htons(1)           |
  117. +---------------------------------+----------------------------------+
  118. |        管理机构数 = 0           |          附加信息数 = 0          |
  119. +---------------------------------+----------------------------------+
  120. +--------------------------------------------------------------------+
  121. |                 查询名 = [3|w|w|w|5|h|e|i|k|e|3|c|o|m|0]             |
  122. +--------------------------------------------------------------------+
  123. |        查询类型 = htons(1)    |       查询类 = htons(1)          |
  124. +--------------------------------------------------------------------+
  125. +--------------------------------------------------------------------+
  126. |             查询名 = [3|w|w|w|5|h|e|i|k|e|3|c|o|m|0]                |
  127. +--------------------------------------------------------------------+
  128. |        类型    = htons(1) |       类 = htons(1)              |
  129. +--------------------------------------------------------------------+
  130. |                       time to live = 999999                             |
  131. +--------------------------------------------------------------------+
  132. |    资源数据长度 = htons(4) | 资源数据=inet_addr("31.33.7.44") |
  133. +-------------------------------------------------------------------+
  134. OK,就这么多了;)
  135. 分析:
  136. 在应答中QR = 1 是因为它是应答;)
  137. AA = 1 因为名称服务器是权威服务器
  138. RA = 1 是因为递归是可用的  
复制代码DNS报文格式:

该报文由12字节的首部和4个长度可变的字段组成。
标识字段由客户程序设置并有服务器返回结果。
16bit的标志字段 如下:

QR:0表示查询报文,1表示响应报文
Opcode:通常值为0(标准查询),其他值为1(反向查询)和2(服务器状态请求)。
AA:表示授权回答(authoritative answer).
TC:表示可截断的(truncated)
RD:表示期望递归
RA:表示可用递归
随后3bit必须为0
Rcode:返回码,通常为0(没有差错)和3(名字差错)
后面4个16bit字段说明最后4个变长字段中包含的条目数。

问题部分:
报文格式:

查询名为要查找的名字,它由一个或者多个标示符序列组成。每个标示符已首字节数的计数值来说明该标示符长度,每个名字以0结束。计数字节数必须是0~63之间。该字段无需填充字节。如:gemini.tuc.noao.edu

每个问题有一个查询类型,通常查询类型为A(由名字获得IP地址)或者PTR(获得IP地址对应的域名)
资源记录部分:
报文格式:
DNS最后3个字段,回答字段,授权字段和附加信息字段均采用资源记录RR(Resource Record)的相同格式。

域名是记录中资源数据对应的名字。它的格式和查询名字段格式相同。
类型说明R R的类型码。类通常为1,指I n t e r n e t数据。
生存时间字段是客户程序保留该资源记录的秒数。
资源数据长度说明资源数据的数量。该数据的格式依赖于类型字段的值。对于类型1(A记录)资源数据是4字节的I P地址。

数据包DNS 查询:(DNS query)
0000  00 19 56 6e 19 bf 00 17   a4 1a b2 e0 08 00 45 00 ..Vn.... ......E.
0010  00 3b ed c6 00 00 80 11   e3 c3 ac 15 0f 04 ac 15 .;...... ........
0020  01 f9 04 a9 00 35 00 27   2f bd 3e 3a 01 00 00 01 .....5.' /.>:....
0030   00 00 00 00 00 00 03 77   77 77 06 67 6f 6f 67 6c .......w ww.googl
0040   65 02 63 6e 00 00 01 00   01                      e.cn.... .   
说明:
前面三段分别为以太网包头,ip包头和UDP包头。
从0020行后面开始为DNS数据包.
3e 3a   为标识字段
01 00 为标志字段,该字段设置了TC表示该报文是可截断的。
00 01   查询报文数量为1。
00 00 00 00 00 00 表示回答,授权和额外信息都为0。
03 77   77 77 06 67 6f 6f 67 6c 65 02 63 6e 00 表示查询的名字为
www.google.com
00 01 为类型,1表示A查询
00 01 为类,1表示Internet数据。

数据包 DNS response (DNS response)
0000  00 17 a4 1a b2 e0 00 19   56 6e 19 bf 08 00 45 00 ........ Vn....E.
0010  00 78 48 af 00 00 7d 11   8b 9e ac 15 01 f9 ac 15 .xH...}. ........
0020  0f 04 00 35 04 a9 00 64   75 db 3e 3a 81 80 00 01 ...5...d u.>:....
0030   00 03 00 00 00 00 03 77   77 77 06 67 6f 6f 67 6c .......w ww.googl
0040   65 02 63 6e 00 00 01 00   01 c0 0c 00 05 00 01 00 e.cn.... ........
0050   00 05 42 00 11 02 63 6e   01 6c 06 67 6f 6f 67 6c ..B...cn .l.googl
0060   65 03 63 6f 6d 00 c0 2b   00 01 00 01 00 00 00 5f e.com..+ ......._
0070   00 04 cb d0 21 65 c0 2b   00 01 00 01 00 00 00 5f ....!e.+ ......._
0080   00 04 cb d0 21 64                               ....!d          
说明:
前面三段分别为以太网包头,ip包头和UDP包头。
3e 3a   为标识字段
81 80  为标志字段,其中设置了QR = 1,RD = 1,RA = 1
00 01  问题数100 03  回答数3,其余两个为0
03 77   77 77 06 67 6f 6f 67 6c 65 02 63 6e 00 表示查询的名字为
www.google.com
00 01 为类型,1表示A查询
00 01 为类,1表示Internet数据。
接下来为回答报文,
c0 0c 为域名指针
00 05  表示CNAME(规范名称)
00 01  类,表示为Internet数据
00 00 05 42  生存时间
00 11  数据长度
02 63 6e   01 6c 06 67 6f 6f 67 6c 65 03 63 6f 6d 00 为数据 cn.l.google.cn
然后接下来两段为另外两个回答。
最后的数据为IP地址。

 

原创粉丝点击