Skip to main content

4. Messages (消息)

本章定义DNS协议消息的格式和传输方式。这是实现DNS通信的核心规范。


4.1. Format (格式)

消息结构

域协议内的所有通信都以称为消息的单一格式进行。消息的顶层格式分为5个部分:

+---------------------+
| Header | 12字节,总是存在
+---------------------+
| Question | 查询名称服务器的问题
+---------------------+
| Answer | 回答问题的RR
+---------------------+
| Authority | 指向权威的RR
+---------------------+
| Additional | 保存附加信息的RR
+---------------------+

部分说明:

部分必需说明
Header✅ 是总是存在,包含指定其余部分是否存在的字段
Question查询时包含描述对名称服务器的问题的字段
Answer响应时包含回答问题的RR
Authority可选包含指向权威名称服务器的RR
Additional可选包含与查询相关但不是严格答案的RR

4.1.1. Header section format (头部部分格式)

头部格式 (12字节)

                                1  1  1  1  1  1
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| ID |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|QR| Opcode |AA|TC|RD|RA| Z | RCODE |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| QDCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| ANCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| NSCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| ARCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

字段详解

ID (16位)

说明: 由生成任何类型查询的程序分配的标识符

用途:

  • 此标识符被复制到相应的回复中
  • 请求者可以使用它来匹配回复与未完成的查询

示例: 0x1234

QR (1位)

说明: 指定此消息是查询还是响应

含义
0查询 (Query)
1响应 (Response)

Opcode (4位)

说明: 指定此消息中的查询类型

值定义:

名称说明
0QUERY标准查询
1IQUERY反向查询
2STATUS服务器状态请求
3-15-保留供将来使用

AA (1位) - Authoritative Answer

说明: 权威答案 - 此位在响应中有效

含义: 指定响应名称服务器是问题部分中域名的权威

注意:

  • 由于别名,答案部分的内容可能有多个所有者名称
  • AA位对应于与查询名称匹配的名称,或答案部分中的第一个所有者名称

TC (1位) - TrunCation

说明: 截断 - 指定此消息由于长度大于传输通道允许的长度而被截断

场景:

  • UDP消息超过512字节时设置
  • 客户端应切换到TCP重新查询

RD (1位) - Recursion Desired

说明: 期望递归 - 此位可以在查询中设置并复制到响应中

含义: 如果设置了RD,它指示名称服务器递归地追求查询

注意: 递归查询支持是可选的

RA (1位) - Recursion Available

说明: 递归可用 - 此位在响应中设置或清除

含义: 表示名称服务器中是否可用递归查询支持

Z (3位)

说明: 保留供将来使用

要求: 在所有查询和响应中必须为零

RCODE (4位) - Response Code

说明: 响应代码 - 此4位字段作为响应的一部分设置

值定义:

名称说明
0NOERROR无错误条件
1FORMERR格式错误 - 名称服务器无法解释查询
2SERVFAIL服务器失败 - 由于名称服务器问题无法处理此查询
3NXDOMAIN名称错误 - 查询中引用的域名不存在
4NOTIMP未实现 - 名称服务器不支持请求的查询类型
5REFUSED拒绝 - 名称服务器因策略原因拒绝执行指定操作
6-15-保留供将来使用

RCODE详解:

NXDOMAIN (3):

  • 仅对来自权威名称服务器的响应有意义
  • 表示查询中引用的域名不存在

REFUSED (5):

  • 例如,名称服务器可能不希望向特定请求者提供信息
  • 或名称服务器可能不希望对特定数据执行特定操作(例如,区域传输)

QDCOUNT (16位)

说明: 无符号16位整数,指定问题部分中的条目数

通常值: 1

ANCOUNT (16位)

说明: 无符号16位整数,指定答案部分中的资源记录数

NSCOUNT (16位)

说明: 无符号16位整数,指定权威记录部分中的名称服务器资源记录数

ARCOUNT (16位)

说明: 无符号16位整数,指定附加记录部分中的资源记录数


4.1.2. Question section format (问题部分格式)

问题部分用于在大多数查询中携带"问题",即定义所询问内容的参数。

格式

                                1  1  1  1  1  1
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| |
/ QNAME /
/ /
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| QTYPE |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| QCLASS |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

字段说明

字段说明
QNAME域名,表示为标签序列
QTYPE2字节,指定查询类型
QCLASS2字节,指定查询类

示例:

查询: www.example.com的A记录

QNAME: 3www7example3com0
QTYPE: 0x0001 (A)
QCLASS: 0x0001 (IN)

4.1.3. Resource record format (资源记录格式)

答案、权威和附加部分都共享相同的格式:可能为空的连接资源记录列表。

格式

                                1  1  1  1  1  1
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| |
/ /
/ NAME /
| |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| TYPE |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| CLASS |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| TTL |
| |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| RDLENGTH |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--|
/ RDATA /
/ /
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

(详细字段说明见第3章)


4.1.4. Message compression (消息压缩)

压缩目的

为了减少消息中传输的数据量,域名系统使用压缩方案来消除域名中标签的重复。

压缩方案

使用指针替换域名或标签列表。

指针格式:

+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| 1 1| OFFSET |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

规则:

  • 前两位为11表示这是一个指针
  • OFFSET是从消息开始的偏移量(以八位字节为单位)

压缩示例

未压缩:

查询: www.example.com
响应: www.example.com, example.com, com

消息中:
3www7example3com0 (www.example.com)
7example3com0 (example.com)
3com0 (com)

总计: 13 + 12 + 4 = 29字节

压缩后:

3www7example3com0  (www.example.com, 偏移12)
0xC00C (指向偏移12, 即example.com)
0xC010 (指向偏移16, 即com)

总计: 13 + 2 + 2 = 17字节
节省: 12字节 (41%)

压缩规则

  1. 可以压缩的位置: 域名可以在消息中的任何位置出现
  2. 指针可以指向: 消息中任何先前出现的域名或标签列表
  3. 链式指针: 指针可以指向包含指针的域名
  4. 循环检测: 实现必须检测循环指针

4.2. Transport (传输)

DNS消息可以通过UDP或TCP传输。

4.2.1. UDP usage (UDP使用)

默认传输: UDP是DNS的首选传输协议

消息大小限制:

  • 默认最大512字节
  • 包括DNS头部的所有部分

超过限制时:

  • 设置TC (截断) 位
  • 客户端应使用TCP重新发送查询

端口:

  • 服务器端口: 53
  • 客户端端口: 临时端口

超时和重试:

  • 客户端负责重试
  • 推荐初始超时: 2-5秒
  • 指数退避

4.2.2. TCP usage (TCP使用)

使用场景:

  1. 响应大于512字节时
  2. 区域传输 (AXFR/IXFR)
  3. 客户端明确请求

消息格式:

+---------------------+---------------------+
| LENGTH | MESSAGE |
+---------------------+---------------------+
2字节 变长

LENGTH字段:

  • 16位,指定消息长度(不包括LENGTH字段本身)
  • 大端序

端口: 53 (与UDP相同)

连接管理:

  • 客户端发起连接
  • 可以在单个TCP连接上发送多个查询
  • 服务器可以在空闲后关闭连接

消息示例

查询消息示例

查询: www.example.com的A记录

十六进制转储:
0000 12 34 01 00 00 01 00 00 00 00 00 00 # Header
0012 03 77 77 77 07 65 78 61 6D 70 6C 65 # www.example
0024 03 63 6F 6D 00 # .com.
0029 00 01 # QTYPE: A
0031 00 01 # QCLASS: IN

解析:
ID: 0x1234
QR: 0 (查询)
Opcode: 0 (标准查询)
RD: 1 (期望递归)
QDCOUNT: 1
ANCOUNT: 0
NSCOUNT: 0
ARCOUNT: 0

Question:
QNAME: www.example.com
QTYPE: A (1)
QCLASS: IN (1)

响应消息示例

响应: www.example.com → 93.184.216.34

十六进制转储:
0000 12 34 81 80 00 01 00 01 00 00 00 00 # Header
0012 03 77 77 77 07 65 78 61 6D 70 6C 65 # www.example
0024 03 63 6F 6D 00 # .com.
0029 00 01 # QTYPE: A
0031 00 01 # QCLASS: IN
0033 C0 0C # 指针到www.example.com
0035 00 01 # TYPE: A
0037 00 01 # CLASS: IN
0039 00 00 0E 10 # TTL: 3600
0043 00 04 # RDLENGTH: 4
0045 5D B8 D8 22 # RDATA: 93.184.216.34

解析:
ID: 0x1234 (匹配查询)
QR: 1 (响应)
AA: 1 (权威答案)
RD: 1 (期望递归)
RA: 1 (递归可用)
RCODE: 0 (无错误)
QDCOUNT: 1
ANCOUNT: 1
NSCOUNT: 0
ARCOUNT: 0

Question: (同上)

Answer:
NAME: www.example.com (压缩指针)
TYPE: A
CLASS: IN
TTL: 3600
RDLENGTH: 4
RDATA: 93.184.216.34

关键概念总结

消息结构

  1. 固定头部: 12字节,包含控制信息
  2. 可变部分: Question, Answer, Authority, Additional
  3. 压缩: 使用指针减少重复

传输协议

  1. UDP: 默认,快速,512字节限制
  2. TCP: 大消息,区域传输,可靠

重要标志

  1. QR: 区分查询和响应
  2. AA: 标识权威答案
  3. TC: 指示截断
  4. RD/RA: 递归控制

下一章: 5. Master Files (主文件) - 区域文件格式