跳到主要内容

3. Server Behavior (服务器行为)

3. 服务器行为 (Server Behavior)

服务器收到 UPDATE 请求后, 如果不识别 UPDATE 操作码或识别但未实现, 将向请求者发出 NOTIMP 信号。否则, 处理继续如下。

3.1 处理区域部分 (Process Zone Section)

检查区域部分以确保其中恰好有一个 RR, 且该 RR 的 ZTYPE 为 SOA, 否则向请求者发出 FORMERR 信号。接下来, 检查 ZNAME 和 ZCLASS 以确认所命名的区域是此服务器的权威区域之一, 否则向请求者发出 NOTAUTH 信号。如果服务器是区域从服务器, 请求将被转发到主主服务器。

if (zcount != 1 || ztype != SOA)
return (FORMERR)
if (zone_type(zname, zclass) == SLAVE)
return forward()
if (zone_type(zname, zclass) == MASTER)
return update()
return (NOTAUTH)

3.2 处理先决条件部分 (Process Prerequisite Section)

检查先决条件部分以确认所有先决条件都被区域的当前状态满足。

3.2.1. 对于此部分中 CLASS 为 ANY 的 RR, 测试 TTL 和 RDLENGTH 是否均为零 (0), 否则向请求者发出 FORMERR 信号。如果 TYPE 为 ANY, 测试区域中是否至少有一个 RR 的 NAME 与先决条件 RR 的 NAME 相同, 否则向请求者发出 NXDOMAIN 信号。如果 TYPE 不是 ANY, 测试区域中是否至少有一个 RR 的 NAME 和 TYPE 与先决条件 RR 的相同, 否则向请求者发出 NXRRSET 信号。

3.2.2. 对于此部分中 CLASS 为 NONE 的 RR, 测试 TTL 和 RDLENGTH 是否均为零 (0), 否则向请求者发出 FORMERR 信号。如果 TYPE 为 ANY, 测试区域中是否没有 NAME 与先决条件 RR 的 NAME 相同的 RR, 否则向请求者发出 YXDOMAIN 信号。如果 TYPE 不是 ANY, 测试区域中是否没有 NAME 和 TYPE 与先决条件 RR 相同的 RR, 否则向请求者发出 YXRRSET 信号。

先决条件部分中使用的元值表

CLASSTYPERDATA含义
ANYANY名称在使用中
ANYrrsetRRset 存在 (值无关)
NONEANY名称未在使用中
NONErrsetRRset 不存在
zonerrsetrrRRset 存在 (值相关)

3.4 处理更新部分 (Process Update Section)

更新部分被解析为 RR, 这些 RR 按顺序处理。

3.4.2.1. 如果在处理此部分期间发生任何系统故障 (例如内存不足条件或持久存储中的硬件错误), 向请求者发出 SERVFAIL 信号, 并撤销在此事务期间对区域应用的所有更新。

3.4.2.5. 向请求者发出 NOERROR 信号。

更新部分中使用的元值表

CLASSTYPERDATA含义
ANYANY从名称中删除所有 RRset
ANYrrset删除 RRset
NONErrsetrr从 RRset 中删除 RR
zonerrsetrr向 RRset 添加

3.7 向请求者发送响应 (Send Response to Requestor)

此时, 必须组装响应消息并发送回请求者。响应代码为 NOERROR, 除非发生某些处理或权限错误, 在这种情况下发送适当的 RCODE。

3.8 通知从服务器 (Signal Slaves)

主主服务器应使用 DNS NOTIFY (参见 [RFC1996]) 等机制通知任何已知的从服务器区域已更新。