HTTP/2 的请求行是什么?

ImB*_*ime 1 requestheader http2

对于 HTTP/0.9:

GET /
Run Code Online (Sandbox Code Playgroud)

对于 HTTP/1.0:

GET / HTTP/1.0
Run Code Online (Sandbox Code Playgroud)

对于 HTTP/1.1:

GET / HTTP/1.1
Host: example.com
Run Code Online (Sandbox Code Playgroud)

HTTP/2 的请求行是什么?是不是像这样:

GET / HTTP/2.0
Run Code Online (Sandbox Code Playgroud)

还是 HTTP/2?

Esa*_*nen 5

两者都不; 没有这样的请求行,因为 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 ...
    
    Run Code Online (Sandbox Code Playgroud)
  • 对于 HTTPS(第 3.3 节),h2 使用TLS-ALPN ( RFC 7301 ) 中的协议标识符

  • 由于先验知识第 3.4 节),立即从 HTTP/2连接序言开始。

现在,HTTP/2 客户端连接前言第 3.5 节)可能与您正在寻找的等效,因为通信始终以 24 个八位字节的序列开始:

  • 0x505249202a20485454502f322e300d0a0d0a534d0d0a0d0a

    IE PRI *m HTTP/2.0\r\n\r\nSM\r\n\r\n

之后,使用报头压缩第 4.3 节)在帧中交换报头字段:

标题列表是零个或多个标题字段的集合。当通过连接传输时,使用 HTTP 标头压缩 [ COMPRESSION ]将标头列表序列化为标头块。序列化的报头块然后被分成一个或多个八位字节序列,称为报头块片段,并在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
Run Code Online (Sandbox Code Playgroud)