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 信号。
先决条件部分中使用的元值表
| CLASS | TYPE | RDATA | 含义 |
|---|---|---|---|
| ANY | ANY | 空 | 名称在使用中 |
| ANY | rrset | 空 | RRset 存在 (值无关) |
| NONE | ANY | 空 | 名称未在使用中 |
| NONE | rrset | 空 | RRset 不存在 |
| zone | rrset | rr | RRset 存在 (值相关) |
3.4 处理更新部分 (Process Update Section)
更新部分被解析为 RR, 这些 RR 按顺序处理。
3.4.2.1. 如果在处理此部分期间发生任何系统故障 (例如内存不足条件或持久存储中的硬件错误), 向请求者发出 SERVFAIL 信号, 并撤销在此事务期间对区域应用的所有更新。
3.4.2.5. 向请求者发出 NOERROR 信号。
更新部分中使用的元值表
| CLASS | TYPE | RDATA | 含义 |
|---|---|---|---|
| ANY | ANY | 空 | 从名称中删除所有 RRset |
| ANY | rrset | 空 | 删除 RRset |
| NONE | rrset | rr | 从 RRset 中删除 RR |
| zone | rrset | rr | 向 RRset 添加 |
3.7 向请求者发送响应 (Send Response to Requestor)
此时, 必须组装响应消息并发送回请求者。响应代码为 NOERROR, 除非发生某些处理或权限错误, 在这种情况下发送适当的 RCODE。
3.8 通知从服务器 (Signal Slaves)
主主服务器应使用 DNS NOTIFY (参见 [RFC1996]) 等机制通知任何已知的从服务器区域已更新。