2. Update Message Format (更新消息格式)
2. 更新消息格式 (Update Message Format)
DNS 消息格式由 [RFC1035 4.1] 定义。需要一些扩展 (例如, UPDATE 下可能的错误代码比 QUERY 下更多) 并且某些字段必须重载 (参见下面的 CLASS 字段描述)。
UPDATE 消息的总体格式如下:
+---------------------+
| 头部 |
+---------------------+
| 区域 | 指定要更新的区域
+---------------------+
| 先决条件 | 必须 (不) 预先存在的 RR 或 RRset
+---------------------+
| 更新 | 要添加或删除的 RR 或 RRset
+---------------------+
| 附加数据 | 附加数据
+---------------------+
头部部分指定此消息是 UPDATE, 并描述其他部分的大小。区域部分命名要由此消息更新的区域。先决条件部分指定此更新所需的起始不变量 (就区域内容而言)。更新部分包含要进行的编辑, 附加数据部分包含可能需要完成但不属于此更新的数据。
2.1 传输问题 (Transport Issues)
如果请求适合, 更新事务可以在 UDP 数据报中携带, 或者在 TCP 连接中携带 (由请求者自行决定)。使用 TCP 时, 消息采用 [RFC1035 4.2.2] 中描述的格式。
2.2 消息头部 (Message Header)
DNS 消息格式的头部由 [RFC 1035 4.1] 定义。并非所有操作码都定义相同的标志位集, 尽管实际上大多数为 QUERY 定义的位 (在 [ibid] 中) 被其他操作码以相同方式定义。UPDATE 只使用一个标志位 (QR)。
UPDATE 使用与 QUERY 相同的字段和相同的部分格式, 但这些部分的命名和使用有所不同:
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 | Z | RCODE |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| ZOCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| PRCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| UPCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| ADCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
ID: 由生成任何类型请求的实体分配的 16 位标识符。此标识符在相应的回复中被复制, 请求者可以使用它将回复与未完成的请求匹配, 或者服务器可以使用它检测来自某个请求者的重复请求。
QR: 指定此消息是请求 (0) 还是响应 (1) 的一位字段。
Opcode: 指定此消息中请求类型的四位字段。标识 UPDATE 消息的 Opcode 值为五 (5)。
Z: 保留供将来使用。在所有请求和响应中应为零 (0)。
RCODE: 响应代码 —— 此四位字段在请求中未定义, 在响应中设置。
| 助记符 | 值 | 描述 |
|---|---|---|
| NOERROR | 0 | 无错误条件。 |
| FORMERR | 1 | 名称服务器由于格式错误无法解释请求。 |
| SERVFAIL | 2 | 名称服务器在处理此请求时遇到内部故障。 |
| NXDOMAIN | 3 | 应该存在的某个名称不存在。 |
| NOTIMP | 4 | 名称服务器不支持指定的操作码。 |
| REFUSED | 5 | 名称服务器出于策略或安全原因拒绝执行指定操作。 |
| YXDOMAIN | 6 | 不应该存在的某个名称存在。 |
| YXRRSET | 7 | 不应该存在的某个 RRset 存在。 |
| NXRRSET | 8 | 应该存在的某个 RRset 不存在。 |
| NOTAUTH | 9 | 服务器对区域部分中命名的区域没有权威性。 |
| NOTZONE | 10 | 先决条件或更新部分中使用的名称不在区域部分表示的区域内。 |
ZOCOUNT: 区域部分中的 RR 数量。
PRCOUNT: 先决条件部分中的 RR 数量。
UPCOUNT: 更新部分中的 RR 数量。
ADCOUNT: 附加数据部分中的 RR 数量。
2.3 区域部分 (Zone Section)
区域部分的格式与 [RFC1035 4.1.2] 中规定的格式相同。ZNAME 是区域名称, ZTYPE 必须是 SOA, ZCLASS 是区域的类。
2.4 先决条件部分 (Prerequisite Section)
此部分包含一组 RRset 先决条件, 这些先决条件必须在主主服务器收到 UPDATE 数据包时满足。有五种可能的语义集:
- RRset 存在 (值无关)。具有指定 NAME 和 TYPE 的至少一个 RR 必须存在。
- RRset 存在 (值相关)。具有指定 NAME 和 TYPE 的 RR 集存在, 并且与此部分中指定的 RRset 具有相同的成员和相同的 RDATA。
- RRset 不存在。具有指定 NAME 和 TYPE 的 RR 不能存在。
- 名称在使用中。具有指定 NAME 的至少一个 RR 必须存在。
- 名称未在使用中。没有任何类型的 RR 由指定 NAME 拥有。
2.5 更新部分 (Update Section)
此部分包含要添加到区域或从区域删除的 RR。有四种可能的语义集:
- 向 RRset 添加 RR。
- 删除 RRset。
- 从名称中删除所有 RRset。
- 从 RRset 中删除 RR。
| CLASS | TYPE | RDATA | 含义 |
|---|---|---|---|
| ANY | ANY | 空 | 从名称中删除所有 RRset |
| ANY | rrset | 空 | 删除 RRset |
| NONE | rrset | rr | 从 RRset 中删除 RR |
| zone | rrset | rr | 向 RRset 添加 |
2.6 附加数据部分 (Additional Data Section)
此部分包含与更新本身相关或与更新添加的新 RR 相关的 RR。例如, 区域外粘合 (新 NS RR 引用的 A RR) 应在此处提供。