了解用于 http/2 请求和升级的 header HTTP2 设置的值

Understanding the value of the header HTTP2-Settings used for http/2 requests and upgrade

我正在编写一个简单的应用程序来确定某些网站是否支持 http/2。

根据我在草稿中阅读的内容:

https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-http2-07#section-3.2

我应该可以做一个 get 请求,比如

GET / HTTP/1.1
Host: server.example.com
Connection: Upgrade, HTTP2-Settings
Upgrade: h2c
HTTP2-Settings: <base64url encoding of HTTP/2 SETTINGS payload>

然后如果他们支持 http/2,响应应该是这样的:

 HTTP/1.1 101 Switching Protocols
 Connection: Upgrade
 Upgrade: HTTP/2.0

 [ HTTP/2.0 connection ...

我正在尝试了解 HTTP2-Settings 请求 header 的确切值。

我希望有人可以解释示例中应包含哪些信息。

HTTP/2 已达到 official standard 的状态。

通过使用明文升级机制确定网站是否支持 HTTP/2 的可能性很小。

原因是浏览器不支持这种升级到 HTTP/2 的方式(他们都更喜欢使用 ALPN 而不是 TLS),因此服务器也不支持。

[免责声明,我是 Jetty 提交者和 Jetty HTTP/2 实施者]。 比如Jetty确实支持这种升级方式(甚至直接HTTP/2),参见例子these tests, but we don't deploy it on our own website, https://webtide.com,原因如上

您不需要在此升级设置框架中发送任何内容,如果您想在服务器有机会回复您 HTTP/2 之前配置服务器,您只想发送它,但通常默认值就可以了。

请记住,作为连接前言的一部分,客户端必须发送另一个 SETTINGS 帧,该帧也可以为空或包含配置参数。通常 HTTP/2 客户端 API,例如 Jetty HTTP2Client 将允许您轻松配置作为前言一部分的 SETTINGS 框架,因为它将在升级机制和 ALPN 机制中使用。

HTTP2-Settings header 的最小有效值是空字符串:

GET / HTTP/1.1
Host: host
Connection: Upgrade, HTTP2-Settings
Upgrade: h2c
HTTP2-Settings:
User-Agent: whatever

否则您需要创建一个 SETTINGS 帧有效负载(仅定义的字节 here, and hence without the 9 octet frame header defined here), and then convert those bytes using base64 as defined here

出于测试的目的,一个空的 HTTP2-Settings header 就可以了,但是正如我所说,您肯定 不会 检测是否网站支持 HTTP/2:您的升级将失败,但该网站可能会通过 ALPN 通过 TLS 支持 HTTP/2。

此站点 http://nghttp2.org/ 接受非加密的 HTTP2 (h2c) 连接,因此:

GET / HTTP/1.1
Host: nghttp2.org
Connection: Upgrade, HTTP2-Settings
Upgrade: h2c
HTTP2-Settings:
User-Agent: whatever

正如 sbordet 所建议的那样,服务器确实产生了“101 切换协议”响应。