跳到主要内容

6.2.1. SUBSCRIBE Request (SUBSCRIBE 请求)

6.2.1. SUBSCRIBE Request (SUBSCRIBE 请求)

SUBSCRIBE 请求以标准的 DSO 12 字节头部 [RFC8490] 开始, 随后是 SUBSCRIBE 主 TLV (Primary TLV)。图 1 示意了 SUBSCRIBE 请求。

MESSAGE ID 字段必须设置为一个唯一值, 客户端不得将该值用于此 DSO 会话上任何其他正在进行的操作。就本文而言, 若客户端已将其用于尚未收到响应的请求, 或已将其用于尚未通过 UNSUBSCRIBE 取消的订阅, 则该 MESSAGE ID 在此会话上视为仍在使用。在 SUBSCRIBE 响应中, 服务器必须原样回显 MESSAGE ID 的值。

其他头部字段必须按 DSO 规范 [RFC8490] 中的描述设置。DNS OPCODE 字段包含 DNS Stateful Operations (6) 的 OPCODE 值。四个计数字段必须为零, 相应的四个部分必须为空 (即不存在)。

DSO-TYPE 为 SUBSCRIBE (0x0040)。

DSO-LENGTH 为后续 DSO-DATA 的长度, 用于指定所请求记录的名称、类型和类 (class)。

SUBSCRIBE 请求的 DSO-DATA 必须恰好包含一个 NAME、TYPE 和 CLASS。由于 SUBSCRIBE 请求通过 TCP 发送, 多个 SUBSCRIBE DSO 请求报文可以连接在单个 TCP 流中并高效打包到 TCP 段中。

若被接受, 订阅将保持有效, 直到客户端使用 UNSUBSCRIBE 取消订阅, 或客户端与服务器之间的 DSO 会话关闭。

给定会话上的 SUBSCRIBE 请求必须唯一。客户端不得发送与同一 DSO 会话上现有活动订阅在名称、类型和类上重复的 SUBSCRIBE 报文。就本匹配而言, 适用已为 US-ASCII 字母建立的 DNS 大小写不敏感规则 [RFC0020] (例如, «example.com» 与 «Example.com» 相同)。若服务器收到此类重复的 SUBSCRIBE 报文, 则为致命错误, 服务器必须立即强制中止连接。

不支持 DNS 通配 (wildcarding)。也就是说, SUBSCRIBE 报文中的星号字符 («») 仅匹配名称中的字面星号 («»), 而不匹配其他内容。同样, SUBSCRIBE 报文中的 CNAME 仅匹配该区域中具有该名称的 CNAME 记录, 而不匹配具有该名称的其他记录类型。

客户端可以订阅在请求时服务器尚未知的记录 (前提是名称落在服务器负责的一个或多个区域之内), 这不是错误。在此情况下, 服务器不得返回 NXDOMAIN。服务器必须接受这些请求, 并在将来找到匹配记录时发送推送通知 (Push Notifications)。

若 TYPE 与 CLASS 均不是 ANY (255), 则为针对给定名称、类型和类的变更的特定订阅。若 TYPE 或 CLASS 中有一个或两个为 ANY (255), 则该订阅按适用情况匹配所有类型和/或所有类。

注: DNS 中一个鲜为人知的特性是, 在 DNS QUERY 请求中, QTYPE 与 QCLASS 为 255 时表示 «ANY», 而非 «ALL」。它们表示服务器应返回其选择的任意匹配记录, 而不一定是全部匹配记录。这可能导致一些令人惊讶且意外的结果, 即查询返回部分有效应答但并非全部, 从而使 QTYPE = 255 (ANY) 的查询不如人们有时想象的那样有用。

与 SUBSCRIBE 一起使用时, TYPE 255 与 CLASS 255 应解释为 «ALL», 而非 «ANY」。在接受 TYPE 或 CLASS 之一或两者为 255 的订阅后, 服务器必须针对所有符合该订阅的记录变更发送推送通知更新 (Push Notification Updates), 而不仅仅是其中一部分。