dns协议简介

Catalogue
  1. 1. @整体包结构 header+body
  2. 2. @Header 包结构
  3. 3. @Question 包结构
  4. 4. @ Answer、Authority、Additional 包结构

@整体包结构 header+body

DNS请求与响应的格式是一致的,其整体分为Header、Question、Answer、Authority、Additional5部分,如下图所示:

1
2
3
4
5
6
7
8
9
10
11
+-+-+-+-+-------+-+-------------+
| Header |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Question | the question for the name server
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Answer | RRs answering the question
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Authority | RRs pointing toward an authority
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Additional | RRs holding additional information
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

@Header 包结构

Header部分是一定有的,长度固定为12个字节;其余4部分可能有也可能没有,并且长度也不一定,这个在Header部分中有指明。Header的结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
0  1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16
+-+-+-+-+-------+-+-------------+-----------------------
| ID |
+-------------------------------------------------------
|QR| OPCODE |AA|TC|RD|RA| RSV | RCODE |
+-------------------------------------------------------
| QUESTION COUNT |
+-------------------------------------------------------
| ANSWER COUNT |
+-------------------------------------------------------
| AUTHORITY SCOUNT |
+-------------------------------------------------------
| ADITION COUNT |
+-------------------------------------------------------

下面说明一下各个字段的含义:

  • ID:占16位。该值由发出DNS请求的程序生成,DNS服务器在响应时会使用该ID,这样便于请求程序区分不同的DNS响应。
  • QR:占1位。指示该消息是请求还是响应。0表示请求;1表示响应。
  • OPCODE:占4位。指示请求的类型,有请求发起者设定,响应消息中复用该值。0表示标准查询;1表示反转查询;2表示服务器状态查询。3~15目前保留,以备将来使用。
  • AA(Authoritative Answer,权威应答):占1位。表示响应的服务器是否是权威DNS服务器。只在响应消息中有效。
  • TC(TrunCation,截断):占1位。指示消息是否因为传输大小限制而被截断。
  • RD(Recursion Desired,期望递归):占1位。该值在请求消息中被设置,响应消息复用该值。如果被设置,表示希望服务器递归查询。但服务器不一定支持递归查询。
  • RA(Recursion Available,递归可用性):占1位。该值在响应消息中被设置或被清除,以表明服务器是否支持递归查询。
  • Z:占3位。保留备用。
  • RCODE(Response code):占4位。该值在响应消息中被设置。取值及含义如下:
    • 0:No error condition,没有错误条件;
    • 1:Format error,请求格式有误,服务器无法解析请求;
    • 2:Server failure,服务器出错。
    • 3:Name Error,只在权威DNS服务器的响应中有意义,表示请求中的域名不存在。
    • 4:Not Implemented,服务器不支持该请求类型。
    • 5:Refused,服务器拒绝执行请求操作。
    • 6~15:保留备用。
  • QUESTION COUNT:占16位(无符号)。指明Question部分的包含的实体数量。
  • ANSWER COUNT:占16位(无符号)。指明Answer部分的包含的RR(Resource Record)数量。
  • AUTHORITY COUNT:占16位(无符号)。指明Authority部分的包含的RR(Resource Record)数量。
  • ADDITIONAL COUNT:占16位(无符号)。指明Additional部分的包含的RR(Resource Record)数量。

@Question 包结构

1
2
3
4
5
6
7
8
9
0  1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16
+-+-+-+-+-------+-+-------------+-----------------------
/ QUESTION NAME 字节数不固定 存储host name /
/ /
+-------------------------------------------------------
| Question type |
+-------------------------------------------------------
| question class |
+-------------------------------------------------------
  • QNAME:字节数不定,以0x00作为结束符。表示查询的主机名。注意:众所周知,主机名被”.”号分割成了多段标签。在QNAME中,每段标签前面加一个数字,表示接下来标签的长度。比如:www.baidu.com 表示成QNAME时,会在”www”前面加上一个字节0x03,”baidu”前面加上一个字节0x04,”com”前面加上一个字节0x03,最后在加0x00表示结尾
  • QTYPE:占2个字节。表示RR类型,见以上RR介绍;
  • QCLASS:占2个字节。表示RR分类,见以上RR介绍。

@ Answer、Authority、Additional 包结构

三个包结构都是一致的,而且字节数都是动态的如下图:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
0  1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16
+-+-+-+-+-------+-+-------------+-----------------------
/ Name /
/ /
+-------------------------------------------------------
| type |
+-------------------------------------------------------
| class |
+-------------------------------------------------------
| TTl |
| |
+-------------------------------------------------------
| len |
+-------------------------------------------------------
/ data /
/ /
+-------------------------------------------------------

  • NAME:长度不定,可能是真正的数据,也有可能是指针(其值表示的是真正的数据在整个数据中的字节索引数),还有可能是二者的混合(以指针结尾)。若是真正的数据,会以0x00结尾;若是指针,指针占2个字节,第一个字节的高2位为11。算法方式详见具体的go实现
  • TYPE:占2个字节。表示RR的类型,如A、CNAME、NS等,见以上RR介绍;
  • CLASS:占2个字节。表示RR的分类,见以上RR介绍;
  • TTL:占4个字节。表示RR生命周期,即RR缓存时长,单位是秒;
  • RDLENGTH:占2个字节。指定RDATA字段的字节数;
  • RDATA:即之前介绍的value,含义与TYPE有关,见以上RR介绍。