了解用于 http/2 请求和升级的标头 HTTP2-Settings 的值

Posted

技术标签:

【中文标题】了解用于 http/2 请求和升级的标头 HTTP2-Settings 的值【英文标题】:Understanding the value of the header HTTP2-Settings used for http/2 requests and upgrade 【发布时间】:2015-08-04 17:07:04 【问题描述】:

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

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

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

我应该能够做一个获取请求,例如

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 请求标头的值。

我希望有人能解释一下示例中应该包含哪些信息。

【问题讨论】:

【参考方案1】:

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

使用明文升级机制来确定网站是否支持 HTTP/2 的运气将非常有限。

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

[免责声明,我是 Jetty 提交者和 Jetty HTTP/2 实现者]。 例如,Jetty 确实支持这种升级方式(甚至直接 HTTP/2),例如参见 these tests,但由于上述原因,我们不将其部署在我们自己的网站 https://webtide.com 上。

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

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

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

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

否则您需要创建一个 SETTINGS 帧有效负载(仅定义 here 的字节,因此没有定义 here 的 9 字节帧头),然后使用 base64 将这些字节转换为定义here。

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

【讨论】:

【参考方案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 Switching Protocols”响应。

【讨论】:

以上是关于了解用于 http/2 请求和升级的标头 HTTP2-Settings 的值的主要内容,如果未能解决你的问题,请参考以下文章

http2 客户端无法解析 HTTP 升级响应标头

HTTP2.0 简介

如何将 HTTP 请求升级到 Websocket (Autobahn & Twisted Web)

用于检测 Google Chrome 的预加载请求的 HTTP 标头

为啥 HTTP/2 客户端拒绝包含连接头的请求?

哪些请求标头可用于浏览器/客户端指纹?