Skip to main content

3. 连接建立与管理 (Connection Setup and Management)

3.1. 发现 HTTP/3 端点 (Discovering an HTTP/3 Endpoint)

HTTP 依赖于权威响应 (authoritative response) 的概念: 在响应消息产生时, 根据目标资源的状态, 由目标 URI 中标识的源服务器 (或在其指导下) 确定为该请求最合适的响应。[HTTP] 的第 4.3 节讨论了如何定位 HTTP URI 的权威服务器。

"https" 方案将权威与拥有客户端认为对 URI 的权威组件标识的主机可信的证书相关联。在 TLS 握手中收到服务器证书后, 客户端必须使用 [HTTP] 第 4.3.4 节中描述的过程验证该证书是否与 URI 的源服务器可接受匹配。如果证书无法针对 URI 的源服务器进行验证, 客户端禁止将该服务器视为该源的权威服务器。

客户端可以尝试通过将主机标识符解析为 IP 地址、在指定端口上与该地址建立 QUIC 连接 (包括如上所述验证服务器证书), 以及通过该安全连接向服务器发送针对 URI 的 HTTP/3 请求消息来访问具有 "https" URI 的资源。除非使用其他机制来选择 HTTP/3, 否则在 TLS 握手期间在应用层协议协商 (ALPN; 参见 [RFC7301]) 扩展中使用令牌 "h3"。

连接问题 (例如, 阻止 UDP) 可能导致无法建立 QUIC 连接; 在这种情况下, 客户端应当尝试使用基于 TCP 的 HTTP 版本。

服务器可以在任何 UDP 端口上提供 HTTP/3 服务; 替代服务广告总是包含显式端口, 并且 URI 包含显式端口或与方案关联的默认端口。

3.1.1. HTTP 替代服务 (HTTP Alternative Services)

HTTP 源可以通过 Alt-Svc HTTP 响应头字段或 HTTP/2 ALTSVC 帧 ([ALTSVC]) 使用 "h3" ALPN 令牌来广告等效的 HTTP/3 端点的可用性。

例如, 源可以在 HTTP 响应中通过包含以下头字段来指示 HTTP/3 在同一主机名的 UDP 端口 50781 上可用:

Alt-Svc: h3=":50781"

在收到指示 HTTP/3 支持的 Alt-Svc 记录后, 客户端可以尝试与指定的主机和端口建立 QUIC 连接; 如果此连接成功, 客户端可以使用本文档中描述的映射发送 HTTP 请求。

3.1.2. 其他方案 (Other Schemes)

尽管 HTTP 独立于传输协议, 但 "http" 方案将权威与在权威组件中标识的任何主机的指定端口上接收 TCP 连接的能力相关联。由于 HTTP/3 不使用 TCP, 因此 HTTP/3 不能用于直接访问由 "http" URI 标识的资源的权威服务器。但是, 诸如 [ALTSVC] 之类的协议扩展允许权威服务器识别也是权威的其他服务, 这些服务可能可以通过 HTTP/3 访问。

在对方案不是 "https" 的源发出请求之前, 客户端必须确保服务器愿意为该方案提供服务。对于方案为 "http" 的源, [RFC8164] 中描述了一种实验性方法来完成此操作。未来可能会为各种方案定义其他机制。

3.2. 连接建立 (Connection Establishment)

HTTP/3 依赖于 QUIC 版本 1 作为底层传输。未来的规范可能会定义将其他 QUIC 传输版本与 HTTP/3 一起使用。

QUIC 版本 1 使用 TLS 版本 1.3 或更高版本作为其握手协议。HTTP/3 客户端必须支持一种机制, 以便在 TLS 握手期间向服务器指示目标主机。如果服务器由域名 ([DNS-TERMS]) 标识, 则客户端必须发送服务器名称指示 (SNI; [RFC6066]) TLS 扩展, 除非使用指示目标主机的替代机制。

QUIC 连接按照 [QUIC-TRANSPORT] 中的描述建立。在连接建立期间, 通过在 TLS 握手中选择 ALPN 令牌 "h3" 来指示 HTTP/3 支持。可以在同一握手中提供对其他应用层协议的支持。

虽然与核心 QUIC 协议相关的连接级选项在初始加密握手中设置, 但特定于 HTTP/3 的设置在 SETTINGS 帧中传送。在 QUIC 连接建立后, 每个端点必须在其各自的 HTTP 控制流的初始帧上发送 SETTINGS 帧。

3.3. 连接重用 (Connection Reuse)

HTTP/3 连接在多个请求之间是持久的。为了获得最佳性能, 预计客户端在确定不再需要与服务器进行进一步通信之前 (例如, 当用户离开特定网页时) 或直到服务器关闭连接之前, 不会关闭连接。

一旦存在到服务器端点的连接, 此连接可以被重用于具有多个不同 URI 权威组件的请求。要将现有连接用于新源, 客户端必须使用 [HTTP] 第 4.3.4 节中描述的过程验证服务器为新源服务器提供的证书。这意味着客户端需要保留服务器证书以及验证该证书所需的任何其他信息; 不这样做的客户端将无法为其他源重用连接。

如果证书因任何原因对于新源不可接受, 则禁止重用该连接, 并且应当为新源建立新连接。如果证书无法验证的原因可能适用于已与该连接关联的其他源, 则客户端应当重新验证这些源的服务器证书。例如, 如果证书验证失败是因为证书已过期或被撤销, 这可能用于使该证书用于建立权威的所有其他源失效。

客户端不应当向给定的 IP 地址和 UDP 端口打开多个 HTTP/3 连接, 其中 IP 地址和端口可能来自 URI, 选定的替代服务 ([ALTSVC]), 配置的代理, 或其中任何一个的名称解析。客户端可以使用不同的传输或 TLS 配置向同一 IP 地址和 UDP 端口打开多个 HTTP/3 连接, 但应当避免创建具有相同配置的多个连接。

鼓励服务器尽可能长时间地保持打开的 HTTP/3 连接, 但如有必要, 允许终止空闲连接。当任一端点选择关闭 HTTP/3 连接时, 终止端点应当首先发送 GOAWAY 帧 (第 5.2 节), 以便两个端点都可以可靠地确定先前发送的帧是否已被处理, 并优雅地完成或终止任何必要的剩余任务。

不希望客户端重用特定源的 HTTP/3 连接的服务器可以通过在响应请求时发送 421 (Misdirected Request) 状态码来指示它对请求不具有权威性; 参见 [HTTP] 的第 7.4 节。