涉及问题
- 说说你对 HTTP/2 的理解
- HTTP1.1 在性能上存在哪些问题
- HTTP/2 是如何提高性能的
出现原因
1. 原有缺陷
在 HTTP1.0 中,采用短连接的形式,即一次请求对应完成一次 TCP 连接建立关闭,如此一来,在 TCP 三次握手四次挥手的过程会浪费很多时间,降低传输效率。
因此,在 HTTP1.1 中引入了长连接,多个请求复用一次 TCP 连接建立与关闭,由此来提升传输效率。
但是,改用长连接后,依然会存在队头阻塞问题,这是由 HTTP 使用的 “请求-应答”模型引起的。
一次请求发送后,必须等待对应的响应抵达后,才能发送下一次请求,所以会造成阻塞。
HTTP1.1 中提出了管道,来缓解这一问题,可以不用等上一次请求的响应抵达,就可发送下一个请求,但是在服务端依然会存在队头阻塞,即如果前一个响应没有发出去,后一个响应依然只能等待。
2. 主要目标及特点
因此,HTTP/2 主要解决 HTTP1.1 传输效率不高的问题,提升性能。
HTTP/2 在语义上几乎与之前一致,如请求方法,状态码等,也没有引入新的协议名,依然使用 http
,https
来表示明文及加密协议,且没有强制要求加密(虽然主流浏览器只支持加密)。
主要的变更集中于报文的传输形式
优化措施
头部压缩,二进制格式 => 减小尺寸
流 => 传输效率
1. 头部压缩
使用 HPACK 算法压缩头部数据:在客户端和服务器两端各维护一份索引表,用索引号表示重复的字符串。
将原有起始行中的一些字段,转换为头字段的形式,在名称前加 :
,和其他头字段做区分。
报文头全部变为键值对形式后,将常用头字段定为“静态表”,同时维护一“动态表”
2. 二进制格式
由原来的纯文本 ASCII 格式变为二进制格式,计算机更容易解析,且体积小
将一个报文分解为多个二进制帧
3. 流
引入流的概念,即二进制帧的双向传输序列,它是虚拟的,实际并不存在。
- 一个流,对应原来的一次请求响应;流之间是彼此独立的,但内部的帧依然是顺序的。因此,是从应用层角度解决队头阻塞问题
- 流可并发,因此可以实现“多路复用”,不需要再借助管道或长连接
- 客户端和服务端都可以创建流,可以用于实现服务器推送,即将可能用到的资源提前发送给客户端,来提高响应速度,对应有 push cache
- 同时,流可以设置优先级,更加灵活
如何升级
-
TCP 连接
-
TLS 连接
-
连接前言
- 请求方法使用 PRI
- 报文为纯文本的 ASCII 编码
PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n