メインコンテンツまでスキップ

4. HTTP 交換 (The HTTP Exchange)

4.1. HTTP リクエスト (The HTTP Request)​

DoH クライアントは HTTP GET または POST メソッドと本節のその他の要件を使用して、単一の DNS クエリを HTTP リクエストとしてエンコードします。DoH サーバーは URI テンプレートを使用してリクエストが使用する URI を定義します。

本文書で定義された URI テンプレートは、HTTP メソッドが POST の場合は変数なしで処理されます。HTTP メソッドが GET の場合、単一の変数「dns」が DNS リクエストの内容(第 6 節で説明)として定義され、base64url [RFC4648] エンコーディングを使用します。

DoH サーバーは POST と GET の両方のメソッドを実装しなければなりません (MUST)。

POST メソッドを使用する場合、DNS クエリは HTTP リクエストのメッセージボディとして含まれ、Content-Type リクエストヘッダーフィールドがメッセージのメディアタイプを示します。

DoH クライアントは、応答で理解できるコンテンツタイプを示すために HTTP Accept リクエストヘッダーフィールドを含めるべきです (SHOULD)。

HTTP キャッシュの親和性を最大化するために、DNS メッセージヘッダーの ID フィールドを含むメディアフォーマット(例:「application/dns-message」)を使用する DoH クライアントは、各 DNS リクエストで DNS ID として 0 を使用すべきです (SHOULD)。

4.1.1. HTTP リクエストの例 (HTTP Request Examples)​

これらの例は [RFC7540] の HTTP/2 スタイルフォーマットを使用します。

GET メソッドを使用した www.example.com のクエリの例:

:method = GET
:scheme = https
:authority = dnsserver.example.net
:path = /dns-query?dns=AAABAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQAB
accept = application/dns-message

POST メソッドを使用した同じクエリの例:

:method = POST
:scheme = https
:authority = dnsserver.example.net
:path = /dns-query
accept = application/dns-message
content-type = application/dns-message
content-length = 33

<33 bytes represented by the following hex encoding>
00 00 01 00 00 01 00 00 00 00 00 00 03 77 77 77
07 65 78 61 6d 70 6c 65 03 63 6f 6d 00 00 01 00
01

4.2. HTTP レスポンス (The HTTP Response)​

本文書で定義された唯一のレスポンスタイプは「application/dns-message」ですが、将来他のレスポンスフォーマットが定義される場合があります。

DoH サーバーは「application/dns-message」リクエストメッセージを処理できなければなりません (MUST)。

DoH サーバーは「application/dns-message」レスポンスを提供できるべきです (SHOULD)。

「application/dns-message」コンテンツタイプを使用する場合、レスポンスメッセージボディには完全な DNS レスポンス(すべてのヘッダーフィールドを含む)が含まれます。DoH サーバーはレスポンスの DNS ヘッダーの「クエリ識別子」(QID) フィールドをゼロに設定しなければなりません (MUST)。DoH クライアントは DNS レスポンスの QID フィールドを無視しなければなりません (MUST)。

4.2.1. DNS と HTTP エラーの処理 (Handling DNS and HTTP Errors)​

DNS レスポンスが成功しない場合でも、DoH サーバーは DNS レスポンスとともに HTTP 成功ステータスコード(2xx)を返します。

サーバーがリクエストを解決できない場合、通常 HTTP 4xx エラーを返します。クライアントはこれを DNS SERVFAIL レスポンスとして扱うべきです (SHOULD)。

DoH クライアントは HTTP リダイレクトを処理しなければなりません (MUST)。

4.2.2. HTTP レスポンスの例 (HTTP Response Example)​

:status = 200
content-type = application/dns-message
content-length = 64
cache-control = max-age=128

<64 bytes represented by the following hex encoding>
00 00 81 80 00 01 00 01 00 00 00 00 03 77 77 77
07 65 78 61 6d 70 6c 65 03 63 6f 6d 00 00 01 00
01 03 77 77 77 07 65 78 61 6d 70 6c 65 03 63 6f
6d 00 00 01 00 01 00 00 00 80 00 04 5d b8 d8 22

この例の DNS レスポンスは www.example.com の IPv4 アドレスが 93.184.216.34 であり、この情報の TTL が 128 秒であることを示しています。