http优化进程

57 阅读3分钟

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 最核心、最重要且最具颠覆性的多路复用机制

多路复用是通过在协议栈中添加二进制分帧层来实现的,有了二进制分帧层还能够实现请求的优先级、服务器推送、头部压缩等特性,从而大大提升了文件传输效率。

那多路复用是怎么实现的?

image.png

但是 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 上的队头阻塞。

HTTP/3

image.png