HTTP/2
HTTP/1的缺陷
-
队头阻塞
- 1.1版本实现了管道化,允许一次发送一组请求
- 但是响应的返回必须按照顺序
- 如果第一个请求时间很长,后面的请求的响应都会被堵塞
- TCP慢启动导致原本就具有突发性和短时性的 HTTP 连接变的十分低效
-
消息首部无法压缩
- 例如有cookie,首部会很大
- 会占据请求的很大部分
HTTP/2的优化
-
二进制协议
- HTTP/1的解析是基于文本分割的
- 每一行的结尾会有分隔符(\r\n)
- 一次只能处理一个请求,完成前不能中断
- 无法预估一次解析需要预留多少内存(一行多长)
- HTTP/2的请求和响应由一个HEADERS帧和许多DATA帧构成
- 帧的大小固定
- 帧的大小固定
- HTTP/1的解析是基于文本分割的
- 首部压缩
-
多路复用
- 客户端向某个域名的服务器请求页面的过程中,只会创建一条TCP连接,即使这页面可能包含上百个资源
- 虽然只有一条TCP连接,但是在逻辑上分成了很多stream
- TCP连接的复用避免了多次慢启动
-
服务端推送
- 当一个客户端请求资源X,而服务器知道它很可能也需要资源Z的情况下,服务器可以在客户端发送请求前,主动将资源Z推送给客户端