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位)
说明: 指定此消息中的查询类型
值定义:
| 值 | 名称 | 说明 |
|---|---|---|
| 0 | QUERY | 标准查询 |
| 1 | IQUERY | 反向查询 |
| 2 | STATUS | 服务器状态请求 |
| 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位字段作为响应的一部分设置
值定义:
| 值 | 名称 | 说明 |
|---|---|---|
| 0 | NOERROR | 无错误条件 |
| 1 | FORMERR | 格式错误 - 名称服务器无法解释查询 |
| 2 | SERVFAIL | 服务器失败 - 由于名称服务器问题无法处理此查询 |
| 3 | NXDOMAIN | 名称错误 - 查询中引用的域名不存在 |
| 4 | NOTIMP | 未实现 - 名称服务器不支持请求的查询类型 |
| 5 | REFUSED | 拒绝 - 名称服务器因策略原因拒绝执行指定操作 |
| 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 | 域名,表示为标签序列 |
| QTYPE | 2字节,指定查询类型 |
| QCLASS | 2字节,指定查询类 |
示例:
查询: 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%)
压缩规则
- 可以压缩的位置: 域名可以在消息中的任何位置出现
- 指针可以指向: 消息中任何先前出现的域名或标签列表
- 链式指针: 指针可以指向包含指针的域名
- 循环检测: 实现必须检测循环指针
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使用)
使用场景:
- 响应大于512字节时
- 区域传输 (AXFR/IXFR)
- 客户端明确请求
消息格式:
+---------------------+---------------------+
| 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
关键概念总结
消息结构
- 固定头部: 12字节,包含控制信息
- 可变部分: Question, Answer, Authority, Additional
- 压缩: 使用指针减少重复
传输协议
- UDP: 默认,快速,512字节限制
- TCP: 大消息,区域传输,可靠
重要标志
- QR: 区分查询和响应
- AA: 标识权威答案
- TC: 指示截断
- RD/RA: 递归控制
下一章: 5. Master Files (主文件) - 区域文件格式