了解用于 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 的值的主要内容,如果未能解决你的问题,请参考以下文章
如何将 HTTP 请求升级到 Websocket (Autobahn & Twisted Web)