跳到主要内容

2. Update Message Format (更新消息格式)

2. 更新消息格式 (Update Message Format)

DNS 消息格式由 [RFC1035 4.1] 定义. 需要一些扩展 (例如, UPDATE 下可能的错误代码比 QUERY 下更多), 并且某些字段必须重载 (参见下面对 CLASS 字段的描述).

按照 [ibid], UPDATE 消息的总体格式如下:

+---------------------+
| Header |
+---------------------+
| Zone | 指定要更新的区域
+---------------------+
| Prerequisite | 必须预先存在或不得预先存在的 RR 或 RRset
+---------------------+
| Update | 要添加或删除的 RR 或 RRset
+---------------------+
| Additional Data | 附加数据
+---------------------+

Header Section 指明此消息是 UPDATE, 并描述其他各 Section 的大小. Zone Section 命名此消息要更新的区域. Prerequisite Section 指定此更新所需的起始不变量 (以区域内容表示). Update Section 包含要执行的编辑, Additional Data Section 包含可能为完成此更新所需但不属于此更新本身的数据.

2.1 传输问题 (Transport Issues)

如果请求能够装入, 更新事务可以承载在 UDP 数据报中, 也可以承载在 TCP 连接中 (由请求者自行决定). 使用 TCP 时, 消息采用 [RFC1035 4.2.2] 中描述的格式.

2.2 消息头部 (Message Header)

DNS 消息格式的头部由 [RFC 1035 4.1] 定义. 并非所有 opcode 都定义相同的标志位集合, 但从实践上看, 大多数在 [ibid] 中为 QUERY 定义的位也由其他 opcode 以相同方式定义. UPDATE 只使用一个标志位 (QR).

DNS 消息格式为它的四个 Section (Question, Answer, Authority 和 Additional) 指定记录计数. UPDATE 使用相同字段以及相同 Section 格式, 但这些 Section 的命名和用法不同, 如下方基于 [RFC1035 4.1.1] 修改后的头部所示:

                                  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). 本规范的实现应忽略非零 Z 字段.

RCODE

响应代码 - 此四位字段在请求中未定义, 在响应中设置. 响应中此字段的取值及含义如下:

助记符描述
NOERROR0无错误条件.
FORMERR1名称服务器由于格式错误无法解释请求.
SERVFAIL2名称服务器在处理此请求时遇到内部故障, 例如操作系统错误或转发超时.
NXDOMAIN3应该存在的某个名称不存在.
NOTIMP4名称服务器不支持指定的 Opcode.
REFUSED5名称服务器出于策略或安全原因拒绝执行指定操作.
YXDOMAIN6不应该存在的某个名称存在.
YXRRSET7不应该存在的某个 RRset 存在.
NXRRSET8应该存在的某个 RRset 不存在.
NOTAUTH9服务器对 Zone Section 中命名的区域没有权威性.
NOTZONE10Prerequisite Section 或 Update Section 中使用的名称不在 Zone Section 所表示的区域内.

ZOCOUNT

Zone Section 中的 RR 数量.

PRCOUNT

Prerequisite Section 中的 RR 数量.

UPCOUNT

Update Section 中的 RR 数量.

ADCOUNT

Additional Data Section 中的 RR 数量.

2.3 区域部分 (Zone Section)

Zone Section 的格式与 [RFC1035 4.1.2] 中规定的格式相同, 其字段重新定义如下:

                                  1  1  1  1  1  1
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| |
/ ZNAME /
/ /
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| ZTYPE |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| ZCLASS |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

UPDATE 使用此 Section 表示被更新记录所属的区域. 所有要更新的记录必须位于同一个区域中, 因此 Zone Section 只允许包含且必须包含一条记录. ZNAME 是区域名称, ZTYPE 必须是 SOA, ZCLASS 是该区域的 class.

2.4 先决条件部分 (Prerequisite Section)

此 Section 包含一组 RRset 先决条件, 这些先决条件必须在 Primary Master 服务器收到 UPDATE 数据包时满足. 此 Section 的格式如 [RFC1035 4.1.3] 所规定. 这里可以表达五种可能的语义集合, 先概述如下, 随后逐项说明.

  1. RRset 存在 (值无关). 至少一个具有指定 NAME 和 TYPE 的 RR (位于 Zone Section 指定的区域和 class 中) 必须存在.

  2. RRset 存在 (值相关). 一个具有指定 NAME 和 TYPE 的 RR 集合存在, 并且它与本 Section 中指定的 RRset 具有相同成员以及相同 RDATA.

  3. RRset 不存在. 不得存在具有指定 NAME 和 TYPE 的 RR (位于 Zone Section 表示的区域和 class 中).

  4. 名称正在使用. 至少一个具有指定 NAME 的 RR (位于 Zone Section 指定的区域和 class 中) 必须存在. 注意, 空非终端不会满足此前提条件.

  5. 名称未被使用. 指定 NAME 不拥有任何类型的 RR. 注意, 空非终端会满足此前提条件.

这些语义的语法如下:

2.4.1 - RRset 存在 (值无关) (RRset Exists, Value Independent)

至少一个具有指定 NAME 和 TYPE 的 RR (位于 Zone Section 指定的区域和 class 中) 必须存在.

对于此前提条件, 请求者向本 Section 添加一条 RR, 其 NAME 和 TYPE 等于要求存在的区域 RRset 的 NAME 和 TYPE. RDLENGTH 为零, 因此 RDATA 为空. CLASS 必须指定为 ANY, 用于将此条件与 RDLENGTH 自然为零 (0) 的实际 RR (例如 NULL) 区分开. TTL 指定为零 (0).

2.4.2 - RRset 存在 (值相关) (RRset Exists, Value Dependent)

一个具有指定 NAME 和 TYPE 的 RR 集合存在, 并且它与本 Section 中指定的 RRset 具有相同成员以及相同 RDATA. 虽然 RRset 的排序未定义, 因而对比较没有意义, 但两个集合的范围必须完全相同.

对于此前提条件, 请求者向本 Section 添加一个完整 RRset, 表示要求该 RRset 预先存在. NAME 和 TYPE 是被表示 RRset 的 NAME 和 TYPE. CLASS 是区域的 class. TTL 必须指定为零 (0), 并且在比较 RRset 是否相同时被忽略.

2.4.3 - RRset 不存在 (RRset Does Not Exist)

不得存在具有指定 NAME 和 TYPE 的 RR (位于 Zone Section 表示的区域和 class 中).

对于此前提条件, 请求者向本 Section 添加一条 RR, 其 NAME 和 TYPE 等于要求不存在的 RRset 的 NAME 和 TYPE. 此记录的 RDLENGTH 为零 (0), 因此 RDATA 字段为空. CLASS 必须指定为 NONE, 以将此条件与 RDLENGTH 自然为零 (0) 的有效 RR (例如 NULL RR) 区分开. TTL 必须指定为零 (0).

2.4.4 - 名称正在使用 (Name Is In Use)

名称正在使用. 至少一个具有指定 NAME 的 RR (位于 Zone Section 指定的区域和 class 中) 必须存在. 注意, 空非终端不会满足此前提条件.

对于此前提条件, 请求者向本 Section 添加一条 RR, 其 NAME 等于要求拥有某个 RR 的名称. RDLENGTH 为零, 因此 RDATA 为空. CLASS 必须指定为 ANY, 用于将此条件与 RDLENGTH 自然为零 (0) 的实际 RR (例如 NULL) 区分开. TYPE 必须指定为 ANY, 用于将此情形与 RRset 存在性测试区分开. TTL 指定为零 (0).

2.4.5 - 名称未被使用 (Name Is Not In Use)

名称未被使用. 指定 NAME 不拥有任何类型的 RR. 注意, 空非终端会满足此前提条件.

对于此前提条件, 请求者向本 Section 添加一条 RR, 其 NAME 等于要求不拥有任何 RR 的名称. RDLENGTH 为零, 因此 RDATA 为空. CLASS 必须指定为 NONE. TYPE 必须指定为 ANY. TTL 必须指定为零 (0).

2.5 更新部分 (Update Section)

此 Section 包含要添加到区域或从区域删除的 RR. 此 Section 的格式如 [RFC1035 4.1.3] 所规定. 有四种可能的语义集合, 概述如下, 随后给出细节.

  1. 向 RRset 添加 RR.
  2. 删除 RRset.
  3. 从名称中删除所有 RRset.
  4. 从 RRset 中删除 RR.

这些语义的语法如下:

2.5.1 - 向 RRset 添加 (Add To An RRset)

要添加的 RR 被加入 Update Section, 其 NAME, TYPE, TTL, RDLENGTH 和 RDATA 即为要添加的值, CLASS 与区域 class 相同. Primary Master 会静默忽略任何重复 RR.

2.5.2 - 删除 RRset (Delete An RRset)

向 Update Section 添加一条 RR, 其 NAME 和 TYPE 是要删除的 RRset 的 NAME 和 TYPE. TTL 必须指定为零 (0), Primary Master 不会以其他方式使用它. CLASS 必须指定为 ANY. RDLENGTH 必须为零 (0), 因此 RDATA 必须为空. 如果不存在这样的 RRset, Primary Master 会静默忽略此 Update RR.

2.5.3 - 从名称中删除所有 RRset (Delete All RRsets From A Name)

向 Update Section 添加一条 RR, 其 NAME 是要清除 RRset 的名称. TYPE 必须指定为 ANY. TTL 必须指定为零 (0), Primary Master 不会以其他方式使用它. CLASS 必须指定为 ANY. RDLENGTH 必须为零 (0), 因此 RDATA 必须为空. 如果不存在这样的 RRset, Primary Master 会静默忽略此 Update RR.

2.5.4 - 从 RRset 中删除一条 RR (Delete An RR From An RRset)

要删除的 RR 被加入 Update Section. NAME, TYPE, RDLENGTH 和 RDATA 必须与被删除的 RR 匹配. TTL 必须指定为零 (0), 除此之外 Primary Master 会忽略它. CLASS 必须指定为 NONE, 以将此操作与 RR 添加区分开. 如果不存在这样的 RR, Primary Master 会静默忽略此 Update RR.

2.6 附加数据部分 (Additional Data Section)

此 Section 包含与更新本身相关, 或与此更新要添加的新 RR 相关的 RR. 例如, out of zone glue (由新 NS RR 引用的 A RR) 应在此处给出. 服务器可以使用或忽略 out of zone glue, 由服务器实现者自行决定. 此 Section 的格式如 [RFC1035 4.1.3] 所规定.