HTTP/1.0 中引入了请求头和响应头。在支持多种类型文件下载的基础之上,
HTTP/1.0 还提供了 Cache 机制、用户代理、状态码等一些基础信息。但随着技术和需求的发展,人们对文件传输的速度要求越来越高,
HTTP/1.1,增加了持久连接方法来提升连接效率,
HTTP/1.1 还引入了 Cookie、虚拟主机的支持、对动态内容的支持等特性。虽然 HTTP/1.1 在 HTTP/1.0 的基础之上做了大量的优化,但是由于一些效率问题始终很难解决,所以最终还是被 HTTP/2 所取代,
我们知道 HTTP/1.1 为网络效率做了大量的优化,最核心的有如下三种方式:
- 增加了持久连接;
- 浏览器为每个域名最多同时维护 6 个 TCP 持久连接;
- 使用 CDN 的实现域名分片机制。
但是 HTTP/1.1对带宽的利用率却并不理想,
- 第一个原因,TCP 的慢启动。
- 第二个原因,同时开启了多条 TCP 连接,那么这些连接会竞争固定的带宽。
- 第三个原因,HTTP/1.1 队头阻塞的问题。
HTTP/2
该图就是 HTTP/2 最核心、最重要且最具颠覆性的多路复用机制
多路复用是通过在协议栈中添加二进制分帧层来实现的,有了二进制分帧层还能够实现请求的优先级、服务器推送、头部压缩等特性,从而大大提升了文件传输效率。
那多路复用是怎么实现的?
但是 HTTP/2 依然是基于 TCP 协议的,而 TCP 协议依然存在数据包级别的队头阻塞问题,那么你觉得 TCP 的队头阻塞是如何影响到 HTTP/2 性能的呢?
HTTP/2 并没有解决 TCP 的队首阻塞问题,它仅仅是通过多路复用解决了以前 HTTP1.1 管线化请求时的队首阻塞。
比如 HTTP/1.1 时代建立一个 TCP 连接,三个请求组成一个队列发出去,服务器接收到这个队列之后会依次响应,一旦前面的请求阻塞,后面的请求就会无法响应。
HTTP/2 是通过分帧并且给每个帧打上流的 ID 去避免依次响应的问题,对方接收到帧之后根据 ID 拼接出流,这样就可以做到乱序响应从而避免请求时的队首阻塞问题。但是 TCP 层面的队首阻塞是 HTTP/2 无法解决的(HTTP 只是应用层协议,TCP 是传输层协议),TCP 的阻塞问题是因为传输阶段可能会丢包,一旦丢包就会等待重新发包,阻塞后续传输,这个问题虽然有滑动窗口(Sliding Window) 这个方案,但是只能增强抗干扰,并没有彻底解决。
在 TCP 传输过程中,由于单个数据包的丢失而造成的阻塞称为 TCP 上的队头阻塞。