HTTP/2:如何提升网络速度?

HTTP/1.1 为网络效率做了大量的优化,最核心的有如下三种方式:

  1. 增加持久连接;
  2. 浏览器为每个域名最多同时维护6个TCP持久连接;
  3. 使用CDN的实现域名分片机制。

HTTP/1.1 的主要问题
HTTP/1.1对带宽的利用率却并不理想
主要是由于以下三个原因导致的:

  • 第一个原因,TCP 的慢启动。
  • 第二个原因,同时开启了多条 TCP 连接,那么这些连接会竞争固定的带宽。
  • 第三个原因,HTTP/1.1 队头阻塞的问题。

HTTP/2 的多路复用

如何解决HTTP/1.1的问题?
虽然 TCP 有问题,但是我们依然没有换掉 TCP 的能力,所以我们就要想办法去规避 TCP
的慢启动和 TCP 连接之间的竞争问题。

  • 基于此,HTTP/2 的思路就是一个域名只使用一个 TCP ⻓连接来传输数据,这样整个⻚面
    资源的下载过程只需要一次慢启动,同时也避免了多个 TCP 连接竞争带宽所带来的问题。
  • HTTP/2 需要实现资源的并行请求,也就是任何时候都可以将请求发送给服务器,而并不需要等待其他请求的完成,然后服务器也可以随时返回处理好的请求资源给浏览器。

总结:
一个域名只使用一个 TCP ⻓连接和消除队头阻塞问题。

多路复用的实现

HTTP/2 添加了一个二进制分帧层,那我们就结合图来分析下 HTTP/2的请求和接收过程。
首先,浏览器准备好请求数据,包括了请求行、请求头等信息,如果是 POST 方法,那么还要有请求体。
这些数据经过二进制分帧层处理之后,会被转换为一个个带有请求ID编号的帧,通过协议栈将这些帧发送给服务器。
服务器接收到所有帧之后,会将所有相同 ID 的帧合并为一条完整的请求信息。
然后服务器处理该条请求,并将处理的响应行、响应头和响应体分别发送至二进制分帧层。
同样,二进制分帧层会将这些响应数据转换为一个个带有请求 ID 编号的帧,经过协议栈发送给浏览器。
浏览器接收到响应帧之后,会根据 ID 编号将帧的数据提交给对应的请求。

通过引入二进制分帧层,就实现HTTP的多路复用技术。

HTTP/2 其他特性

  1. 可以设置请求的优先级
    HTTP/2 提供了请求优先级,可以在发送请求时,标上该请求的优先
    级,这样服务器接收到请求之后,会优先处理优先级高的请求。
  2. 服务器推送
    HTTP/2 还可以直接将数据提前推送到浏览器。
  3. 头部压缩
    HTTP/2 对请求头和响应头进行了压缩,你可能觉得一个 HTTP 的头文件没有多大,
    压不压缩可能关系不大,但你这样想一下,在浏览器发送请求的时候,基本上都是发送
    HTTP 请求头,很少有请求体的发送,通常情况下⻚面也有 100 个左右的资源,如果将这
  4. 个请求头的数据压缩为原来的 20%,那么传输效率肯定能得到大幅提升。
此文章为4月Day26学习笔记,内容来源于极客时间《浏览器原理》,学习使我快乐,每天进步一点点💪💪

豪猪
4 声望4 粉丝

undefined