Skip to main content

3. Starting HTTP/2 (启动HTTP/2)

生成HTTP请求的实现需要发现服务器是否支持HTTP/2。

HTTP/2使用 [HTTP] 第4.2节中定义的 "http" 和 "https" URI方案,与HTTP/1.1 [HTTP/1.1] 使用相同的默认端口号。这些URI不包含有关上游服务器 (Upstream Server,客户端希望与之建立连接的直接对等方) 支持哪些HTTP版本的任何指示。

确定HTTP/2支持的方法对于 "http" 和 "https" URI是不同的。"https" URI的发现在第3.2节中描述。"http" URI的HTTP/2支持只能通过带外方式 (Out-of-Band Means) 发现,并且需要如第3.3节所述的先验知识 (Prior Knowledge)。

3.1. HTTP/2 Version Identification (HTTP/2版本标识)

本文档中定义的协议有两个标识符。基于任一标识符创建连接意味着使用本文档中描述的传输、帧和消息语义。

  • 字符串 "h2" 标识HTTP/2使用传输层安全性 (Transport Layer Security, TLS) 的协议;参见第9.2节。此标识符用于TLS应用层协议协商 (Application-Layer Protocol Negotiation, ALPN) 扩展 [TLS-ALPN] 字段以及标识基于TLS的HTTP/2的任何地方。

    "h2" 字符串序列化为ALPN协议标识符,作为两字节序列: 0x68, 0x32。

  • "h2c" 字符串以前用作HTTP升级机制的Upgrade头字段 ([HTTP] 第7.8节) 中使用的令牌。这种用法从未广泛部署,本文档已将其废弃。同样适用于与升级到 "h2c" 一起使用的HTTP2-Settings头字段。

3.2. Starting HTTP/2 for "https" URIs (为"https" URI启动HTTP/2)

向 "https" URI发出请求的客户端使用TLS [TLS13] 和ALPN扩展 [TLS-ALPN]。

基于TLS的HTTP/2使用 "h2" 协议标识符。客户端禁止 (MUST NOT) 发送 "h2c" 协议标识符,服务器也禁止选择它;"h2c" 协议标识符描述的是不使用TLS的协议。

一旦TLS协商完成,客户端和服务器都必须 (MUST) 发送连接前言 (Connection Preface, Section 3.4)。

3.3. Starting HTTP/2 with Prior Knowledge (使用先验知识启动HTTP/2)

客户端可以通过其他方式了解到特定服务器支持HTTP/2。例如,客户端可以配置为知道服务器支持HTTP/2。

知道服务器支持HTTP/2的客户端可以建立TCP连接并发送连接前言 (Section 3.4),然后发送HTTP/2帧。服务器可以通过连接前言的存在来识别这些连接。这仅影响通过明文TCP建立HTTP/2连接;基于TLS的HTTP/2连接必须 (MUST) 在TLS中使用协议协商 [TLS-ALPN]。

同样,服务器必须 (MUST) 发送连接前言 (Section 3.4)。

如果没有额外的信息,先前对HTTP/2的支持并不是给定服务器将支持未来连接的HTTP/2的强信号。例如,服务器配置可能会更改,集群服务器中的实例之间的配置可能不同,或者网络条件可能会更改。

3.4. HTTP/2 Connection Preface (HTTP/2连接前言)

在HTTP/2中,每个端点都需要发送连接前言 (Connection Preface),作为对所用协议的最终确认,并为HTTP/2连接建立初始设置。客户端和服务器各自发送不同的连接前言。

客户端连接前言以24个八位字节的序列开始,十六进制表示为:

0x505249202a20485454502f322e300d0a0d0a534d0d0a0d0a

也就是说,连接前言以字符串 "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n" 开始。此序列必须 (MUST) 后跟一个SETTINGS帧 (Section 6.5),该帧可以 (MAY) 为空。客户端将客户端连接前言作为连接的第一批应用数据八位字节发送。

注意: 选择客户端连接前言是为了使大部分HTTP/1.1或HTTP/1.0服务器和中介不会尝试处理后续帧。请注意,这并未解决 [TALKING] 中提出的问题。

服务器连接前言由可能为空的SETTINGS帧 (Section 6.5) 组成,该帧必须 (MUST) 是服务器在HTTP/2连接中发送的第一个帧。

作为连接前言的一部分从对等方接收的SETTINGS帧必须 (MUST) 在发送连接前言后被确认 (参见第6.5.3节)。

为了避免不必要的延迟,客户端被允许在发送客户端连接前言后立即向服务器发送额外的帧,而无需等待接收服务器连接前言。但是,重要的是要注意,服务器连接前言SETTINGS帧可能包含必然会改变客户端与服务器通信方式的设置。收到SETTINGS帧后,客户端应该遵守已建立的任何设置。在某些配置中,服务器可能在客户端发送额外帧之前传输SETTINGS,从而提供避免此问题的机会。

客户端和服务器必须 (MUST) 将无效的连接前言视为类型为PROTOCOL_ERROR的连接错误 (Connection Error, Section 5.4.1)。在这种情况下,可以 (MAY) 省略GOAWAY帧 (Section 6.8),因为无效的前言表明对等方没有使用HTTP/2。