6.2.1. SUBSCRIBE Request (SUBSCRIBE リクエスト)
6.2.1. SUBSCRIBE Request (SUBSCRIBE リクエスト)
SUBSCRIBE リクエストは標準の DSO 12 バイトヘッダー [RFC8490] で始まり, 続いて SUBSCRIBE プライマリ TLV (Primary TLV) が来ます。SUBSCRIBE リクエストは図 1 に示されています。
MESSAGE ID フィールドは, クライアントがこの DSO セッション上の他の進行中の操作に使用していない一意の値に設定しなければなりません。ここでの目的上, クライアントがまだ応答を受け取っていないリクエストに使用したか, UNSUBSCRIBE を使用してまだキャンセルしていないサブスクリプションに使用した場合, MESSAGE ID はこのセッション上で使用中とみなされます。SUBSCRIBE レスポンスでは, サーバーは MESSAGE ID の値を変更せずにエコーしなければなりません。
他のヘッダーフィールドは, DSO 仕様 [RFC8490] で説明されているように設定しなければなりません。DNS OPCODE フィールドには, DNS Stateful Operations (6) の OPCODE 値が含まれます。4 つのカウントフィールドはゼロでなければならず, 対応する 4 つのセクションは空 (つまり存在しない) でなければなりません。
DSO-TYPE は SUBSCRIBE (0x0040) です。
DSO-LENGTH は, 続く DSO-DATA の長さであり, 求められているレコードの名前, タイプ, クラス (class) を指定します。
SUBSCRIBE リクエストの DSO-DATA には, 正確に 1 つの 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 レコードにのみ一致し, その名前を持つ他のレコードタイプには一致しません。
クライアントは, リクエスト時点でサーバーに未知のレコードに SUBSCRIBE できます (名前がサーバーが担当するゾーンの 1 つ以上に含まれることを条件とする), これはエラーではありません。この場合, サーバーは NXDOMAIN を返してはなりません。サーバーはこれらのリクエストを受け入れ, 将来マッチするレコードが見つかればプッシュ通知 (Push Notifications) を送信しなければなりません。
TYPE も CLASS も ANY (255) でない場合, これは指定された名前, タイプ, クラスに対する変更への特定のサブスクリプションです。TYPE または CLASS の 1 つまたは両方が ANY (255) の場合, このサブスクリプションは適宜すべてのタイプおよび/またはすべてのクラスに一致します。
注: あまり知られていない DNS の特性として, DNS QUERY リクエストでは QTYPE と QCLASS の 255 は「ANY」を意味し, 「ALL」ではありません。サーバーは選択した任意のマッチングレコードで応答すべきであり, 必ずしもすべてのマッチングレコードではないことを示します。これにより, クエリが有効な応答の一部だけを返しすべてではないなど, 驚くべき結果になり, QTYPE = 255 (ANY) のクエリは人々が想像するほど有用ではなくなります。
SUBSCRIBE と併用する場合, TYPE 255 と CLASS 255 は「ANY」ではなく「ALL」と解釈されるべきです。TYPE または CLASS の 1 つまたは両方が 255 のサブスクリプションを受理した後, サーバーはサブスクリプションに一致するすべてのレコード変更に対してプッシュ通知更新 (Push Notification Updates) を送信しなければなりません。一部だけではありません。