Aller au contenu principal

5. HTTP Integration (HTTP集成)

5.1. Cache Interaction (缓存交互)

DoH交换与HTTP缓存 [RFC7234] 兼容。DoH响应的指定新鲜度生命周期必须 (MUST) 小于或等于DNS响应的Answer部分中最小的TTL。否则,缓存可能会提供比DNS定义的更陈旧的响应。如果Answer部分中的TTL小于HTTP响应新鲜度生命周期,则DNS响应可能被刷新 (通过通常的HTTP缓存过期和验证),而DoH客户端返回的DNS响应可以使用原始的较短的TTL。

从DoH查询中派生的HTTP缓存键必须 (MUST) 只包含URI和请求媒体类型 (例如"application/dns-message"中的Content-Type请求头字段)。例如,包括Accept请求头字段会导致语义上等效查询的缓存条目不必要的重复。但是,根据HTTP规范,像"Authorization"这样的头应该影响HTTP缓存。

DoH客户端可以 (MAY) 由于任何原因(包括但不限于私有HTTP缓存语义和新获得的DNS别名知识)选择在HTTP缓存新鲜度过期之前保留HTTP响应的缓存副本。DoH客户端可以 (MAY) 将DNS TTL更新为与HTTP缓存新鲜度一致,只要DNS TTL小于或等于HTTP缓存新鲜度。

对DNS查询的HTTP条件请求 [RFC7232] 的响应可以 (MAY) 将非错误DNS响应重新验证为缓存条目。重新验证响应的DNS TTL应该 (SHOULD) 反映响应时间的新鲜度,而不是原始响应的剩余生命周期。客户端可能需要在接收到304 (Not Modified) 响应时获取新的响应以获得更新的TTL。

对DNS查询的Range请求 [RFC7233] 不适用,因为响应内容不适合分块传输。

DoH服务器可以 (MAY) 使用HTTP服务器推送 (见5.3节) 来提前向DoH客户端提供响应,但服务器推送的响应的缓存策略与非推送响应相同。

HTTP重定向 (如第4.2.1节所述) 会改变有效请求的URI,因此改变了用于HTTP缓存的键。

DoH客户端必须 (MUST) 能够处理Vary响应头字段 [RFC7231]。这可能包括不缓存对此类响应的查询响应。

示例:新鲜度生命周期计算

如果DNS响应中有三条记录的TTL分别为200、300和400秒,则HTTP响应的Cache-Control头中的max-age必须小于或等于200秒:

Cache-Control: max-age=200

如果DoH客户端收到一个HTTP缓存响应,其Age头字段指示该响应已缓存50秒,则客户端可以使用该响应,但DNS记录的有效TTL应该减去50秒。

5.2. HTTP/2

对HTTP/2 [RFC7540] 的使用允许DoH客户端和DoH服务器之间的连接被复用,减少了额外DNS查询的开销并提高了性能。可并行查询的数量等于服务器的HTTP/2 SETTINGS_MAX_CONCURRENT_STREAMS参数。

HTTP/2连接的流控制也提供了对查询大小的一些控制。最小的流级窗口大小是65,535字节。DoH交换最小应该 (SHOULD) 提供65,535字节的窗口大小,以避免对小于或等于65,535字节的DNS响应产生延迟。

必须 (MUST) 使用HTTP/2服务器推送 (见5.3节) 时,必须在声明该推送流之前打开双向流以进行正常的HTTP请求/响应交换。

5.3. Server Push (服务器推送)

HTTP/2服务器推送允许DoH服务器在客户端请求之前向DoH客户端提供DNS响应。这可以改进性能。例如,当客户端查询一个名称的A记录时,服务器可以推送相同名称的AAAA记录。

如果推送的响应不会立即被使用,它将与其他HTTP响应一样被添加到HTTP缓存中,并受相同的缓存控制策略约束。

DoH客户端必须 (MUST) 能够从服务器接收推送的响应,但不需要使用它们。DoH客户端可以 (MAY) 对是否接受推送的响应实施限制,例如限制可以同时待处理的推送响应数量。

使用推送的响应需要DoH客户端能够将推送的响应与未来的查询关联起来。为此,当请求和推送的响应具有相同的媒体类型时,DoH客户端可以 (MAY) 将推送的响应与通过GET方法进行的未来查询关联起来,前提是推送的响应的URI与该查询的URI匹配。

5.4. Content Negotiation (内容协商)

为了允许其他格式的可能性,DoH客户端可以在HTTP Accept请求头字段中包含HTTP Accept头字段。此类请求应该 (SHOULD) 包括"application/dns-message"媒体类型,以确保与DoH的最小互操作性。

正如第4.1节中指出的,在这些交换中使用Accept头字段也具有HTTP缓存影响,这可能不受欢迎。

使用HTTP Accept头字段时,DoH服务器应该 (SHOULD) 返回一个Vary响应头字段,其值至少包括"Accept"。

服务器可能无法响应Accept头字段中请求的格式。DoH客户端必须 (MUST) 准备好处理这种情况。