6.2.2. SUBSCRIBE Response (SUBSCRIBE 响应)
6.2.2. SUBSCRIBE Response (SUBSCRIBE 响应)
SUBSCRIBE 响应以标准的 DSO 12 字节头部 [RFC8490] 开始。头部中的 QR 位设置为表示这是一个响应。头部后面可以跟随一个或多个可选的 Additional TLV, 例如 Retry Delay Additional TLV。SUBSCRIBE 响应如图 2 所示。
MESSAGE ID 字段必须回显 SUBSCRIBE 请求的 MESSAGE ID 字段中给出的值。这是客户端知道正在响应哪个请求的方式。
其他头部字段必须按 DSO 规范 [RFC8490] 中的描述设置。DNS OPCODE 字段包含 DNS Stateful Operations (6) 的 OPCODE 值。四个计数字段必须为零, 相应的四个部分必须为空 (即不存在)。
SUBSCRIBE 响应消息不得包含 SUBSCRIBE TLV。如果客户端收到包含 SUBSCRIBE TLV 的 SUBSCRIBE 响应消息, 则处理响应消息, 但必须静默忽略 SUBSCRIBE TLV。
在 SUBSCRIBE 响应中, RCODE 指示订阅是否被接受。支持的 RCODE 如下:
| 助记符 | 值 | 描述 |
|---|---|---|
| NOERROR | 0 | SUBSCRIBE 成功。 |
| FORMERR | 1 | 服务器由于格式错误的请求而未能处理请求。 |
| SERVFAIL | 2 | 服务器由于服务器问题而未能处理请求。 |
| NOTIMP | 4 | 服务器不实现 DSO。 |
| REFUSED | 5 | 服务器出于策略或安全原因拒绝处理请求。 |
| NOTAUTH | 9 | 服务器对请求的名称不具有权威性。 |
| DSOTYPENI | 11 | 不支持 SUBSCRIBE 操作。 |
表 1: SUBSCRIBE 响应代码
本文档仅为 SUBSCRIBE 响应指定这些 RCODE 值。发送 SUBSCRIBE 响应的服务器应该使用这些值之一。请注意, NXDOMAIN 不是响应 SUBSCRIBE 请求的有效 RCODE。但是, 未来的情况可能会创建 SUBSCRIBE 响应中其他 RCODE 值合适的情况, 因此客户端必须准备好接受和处理具有任何其他非零 RCODE 错误值的 SUBSCRIBE 响应。
如果服务器在 SUBSCRIBE 响应中发送非零 RCODE, 这意味着:
a. 客户端 (至少部分) 配置错误, 或 b. 服务器资源耗尽, 或 c. 服务器上存在其他未知故障。
在任何情况下, 客户端都不应立即重试对该服务器的订阅。如果返回了多个 SRV 记录, 如第 6.1 节第 9 段第 7 项所述, 可以立即尝试后续服务器。
如果客户端对该服务器有其他成功的订阅, 即使可能拒绝额外的订阅, 这些订阅仍然保留。客户端和服务器都不需要关闭连接, 尽管任何一端都可以选择这样做。
如果服务器发送非零 RCODE, 则它应该在响应中附加一个 Retry Delay Additional TLV [RFC8490], 指定客户端再次尝试此操作之前的延迟。下面给出了不同 RCODE 值的延迟的推荐值。这些推荐值既适用于服务器应放置在 Retry Delay Additional TLV 中的默认值, 也适用于如果服务器不提供 Retry Delay Additional TLV, 客户端应假定的默认值。
对于 RCODE = 1 (FORMERR), 延迟可以是实现者选择的任何值。建议值为 5 分钟, 以降低来自有缺陷的客户端的高负载风险。
对于 RCODE = 2 (SERVFAIL), 应根据服务器过载级别及该过载的预期持续时间来选择延迟。默认情况下, 建议值为 1 分钟。如果发生更严重的服务器故障, 则延迟可能会根据遇到的具体问题而更长。
对于 RCODE = 4 (NOTIMP), 它发生在不实现 DNS Stateful Operations [RFC8490] 的服务器上, 服务器不太可能在接下来的几分钟内开始支持 DSO, 因此重试延迟应该为 1 小时。请注意, 在这种情况下, 不实现 DSO 的服务器不太可能在其响应中放置 Retry Delay Additional TLV, 因此此推荐值特别适用于客户端应默认假定的内容。
对于 RCODE = 5 (REFUSED), 它发生在实现 DNS Push Notifications 但当前配置为不允许 DNS Push Notifications 的服务器上, 重试延迟可以是实现者选择和/或操作员配置的任何值。
如果被查询的服务器在该区域的 "_dns-push-tls._tcp.<zone>" SRV 记录中列出, 则这是一个配置错误, 因为此服务器被宣传为支持此区域的 DNS Push Notifications, 但服务器本身当前未配置为执行该任务。由于配置错误可能随时被修复, 重试延迟不应设置得太高。默认情况下, 建议值为 5 分钟。
对于 RCODE = 9 (NOTAUTH), 它发生在实现 DNS Push Notifications 但未配置为对请求的名称具有权威性的服务器上, 重试延迟可以是实现者选择和/或操作员配置的任何值。
如果被查询的服务器在该区域的 "_dns-push-tls._tcp.<zone>" SRV 记录中列出, 则这是一个配置错误, 因为此服务器被宣传为支持此区域的 DNS Push Notifications, 但服务器本身当前未配置为执行该任务。由于配置错误可能随时被修复, 重试延迟不应设置得太高。默认情况下, 建议值为 5 分钟。
对于 RCODE = 11 (DSOTYPENI), 它发生在实现 DSO 但不实现 DNS Push Notifications 的服务器上, 服务器不太可能在接下来的几分钟内开始支持 DNS Push Notifications, 因此重试延迟应该为 1 小时。
对于其他 RCODE 值, 服务器应根据该错误条件适当地设置重试延迟。默认情况下, 建议值为 5 分钟。
对于 RCODE = 9 (NOTAUTH), 时间延迟适用于对同一区域内其他名称的请求。对其他区域内名称的请求不受延迟的约束。对于所有其他 RCODE, 时间延迟适用于对该服务器的所有后续请求。
在发送错误响应后, 服务器可以允许会话保持打开状态, 或者可以在其后跟随 DSO Retry Delay 操作 (使用 Retry Delay Primary TLV) 指示客户端按 DSO 规范 [RFC8490] 中的描述关闭会话。客户端必须正确处理这两种情况。请注意, DSO Retry Delay 操作 (使用 Retry Delay Primary TLV) 与上面提到的 Retry Delay Additional TLV 不同。