HTTP/2是不是必须基于TLS/SSL协议

  • IETF标准不要求必须基于TLS/SSL协议
  • 浏览器要求必须基于TLS/SSL协议
  • 在TLS层ALPN(Application Layer Protocol Negotiation)扩展做协商,只认HTTP/1.x的代理服务器不会干扰HTTP/2
  • shema:http://和https//默认基于80和443端口
  • h2:基于TLS协议运行的HTTP/2被称为h2
  • h2c:直接在TCP协议之上运行的HTTP/2被称为h2c。

image.png

基于TLS HTTP2升级

1.TLS 通讯过程
1.1 TLS 通讯步骤
image.png

1.2 TLS 流程示意图
image.png

Tips:关于 TLS 协议会在后续文章详细介绍,这里只是简单说明一下。

2.抓包分析
这里以新浪首页 sina.com.cn 为例,抓取到的报文步骤如下:

步骤1:Client Hello

image.png

Tips:Client Hello 报文中的 ALPN 表示客户端告诉服务端支持哪些协议,如图中有 h2(基于TLS的HTTP/2)和 HTTP/1.1。

步骤2:Server Hello, Change Cipher Spec, Encrypted Extensions, Finished

image.png

Tips:Server Hello 报文中的 ALPN 表示服务端告诉客户端支持哪些协议,如图中有 h2(基于TLS的HTTP/2)。

步骤3:Change Cipher Spec, Finished

image.png

步骤4:客户端发送 Magic 帧

image.png

Tips:这是一个固定值,Magic 帧的值PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n,十六进制 ASCII 表示为 0x505249202a20485454502f322e300d0a0d0a534d0d0a0d0a,它发送完毕之后紧跟 SETTING 帧。

步骤5:客户端发送 SETTING 帧

image.png

Tips:SETTING 帧可以是空的。

步骤6:服务端确认 SETTING 帧

image.png

步骤7:服务端发送 SETTING 帧

image.png

步骤8:客户端确认 SETTING 帧

image.png

Tips:完成以上步骤即可建立 HTTP/2 的链接