http/2理解(1)

  • 在 HTTP/2 中,强制使用 SSL/TLS。但是在 RFC 中并没有强制,其允许纯文本的HTTP/2,但是当前所有实现HTTP/2的 Web浏览器都只支持加密。
  • 客户端无法预知服务端是否支持HTTP/2.0 的情况下使用HTTP升级机制发起“http” URI请求。客户端发起一个http1.1请求,其中包含识别HTTP/2的升级报头字段与h2c token。HTTP/1.1必须包含一个确切的HTTP2-Settings中的报头字段。

例如:

GET /index.htm HTTP/1.1
Host: www.timiguo.com
Connection: Upgrade, HTTP2-Settings
Upgrade: h2c
HTTP2-Settings: <base64url encoding of HTTP/2 SETTINGS payload>

不支持HTTP/2的服务端对请求返回一个不包含升级的报头字段的响应:

HTTP/1.1 200 OK
Content-Length: 50
Content-Type: text/html

支持HTTP/2的服务端可以返回一个101(转换协议)响应来接受升级请求。在101空内容响应终止后,服务端可以开始发送HTTP/2帧。这些帧必须包含一个发起升级的请求的响应。

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

[ HTTP/2 connection ...]
  • 客户端可以通过其他方式判断服务端是否支持HTTP/2。例如,AltSvc定义一种机制让HTTP头字段进行广播。
  • 在建立TCP连接并且检测到HTTP/2会被各个对等端使用后,每个端点必须发送一个连接序言最终确认并作为建立HTTP/2连接的初始设置参数。
    客户端连接序言以24个字节的序列开始,以十六进制表示是:
0x505249202a20485454502f322e300d0a0d0a534d0d0a0d0a

转成字符串就是PRI * HTTP/2.0rnrnSMrnrn

PRI * HTTP2.0


SM

这个序列后跟着一个设置帧,其可为空帧。客户端在收到101转换协议响应(升级成功指示)后马上发送客户端连接序言,或者作为TLS连接的第一个应用数据字节。如果在预先知道服务器支持HTTP/2的情况下启动HTTP/2连接,客户端连接序言在连接建立后发送。
服务端连接序言包含一个有可能是空的设置(SETTING)帧,它必须在HTTP/2连接中首个发送。

为了避免不必要的延迟,允许客户端在发送客户端连接序言之后立即发送其他额外的帧,不需要等待收到服务端连接序言。不过需要注意的是,服务端连接序言设置(SETTINGS)帧可能包含一些关于期望客户端如何与服务端通信的所必须修改的参数。在收到这些设置(SETTINGS)帧之后,客户端应当遵守所有设置的参数。

添加新评论