对于 HTTP/0.9:
GET /
对于 HTTP/1.0:
GET / HTTP/1.0
对于 HTTP/1.1:
GET / HTTP/1.1
Host: example.com
HTTP/2 的请求行是什么?它是类似于:
GET / HTTP/2.0
还是 HTTP/2?
答案1
都不是;没有这样的请求行,因为 HTTP/2 (RFC 7540)不使用线条而是使用框架(第 4 节) 进行通信。在这些帧内,使用 HTTP 标头字段 (第 8.1.2 节)。
客户端首先必须知道服务器是否支持HTTP/2。
对于 HTTP (第 3.2 节),这是通过
Upgrade: h2c
标题完成的:> GET / HTTP/1.1 > Host: server.example.com > Connection: Upgrade, HTTP2-Settings > Upgrade: h2c > HTTP2-Settings: <base64url encoding of HTTP/2 SETTINGS payload> > < HTTP/1.1 101 Switching Protocols < Connection: Upgrade < Upgrade: h2c < [ HTTP/2 connection ...
立即开始使用 HTTP/2连接前言, 因为先前知识(第 3.4 节)。
现在HTTP/2 客户端连接前言(第 3.5 节)可能是您正在寻找的等效项,因为通信总是以 24 个八位字节的序列开头:
0x505249202a20485454502f322e300d0a0d0a534d0d0a0d0a
IE
PRI *m HTTP/2.0\r\n\r\nSM\r\n\r\n
之后,使用以下方式在帧中交换标头字段:报头压缩(第4.3节):
标头列表是零个或多个标头字段的集合。在通过连接传输时,标头列表使用 HTTP 标头压缩序列化为标头块 [压缩],然后将序列化的报头块分成一个或多个八位字节序列(称为报头块片段),并在有效载荷内传输
HEADERS
(第 6.2 节),PUSH_PROMISE
(第 6.6 节), 或者CONTINUATION
(第 6.10 节) 框架。
多个 HTTP/1.1 请求和响应的 HTTP/2 等效示例如下:第 8.1.3 节例如
GET /resource HTTP/1.1 HEADERS Host: example.org ==> + END_STREAM Accept: image/jpeg + END_HEADERS :method = GET :scheme = https :path = /resource host = example.org accept = image/jpeg