HTTP/2:如何提升网络速度?
HTTP/1.1 为网络效率做了大量的优化,最核心的有如下三种方式:
- 增加持久连接;
- 浏览器为每个域名最多同时维护6个TCP持久连接;
- 使用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 其他特性
- 可以设置请求的优先级
HTTP/2 提供了请求优先级,可以在发送请求时,标上该请求的优先
级,这样服务器接收到请求之后,会优先处理优先级高的请求。 - 服务器推送
HTTP/2 还可以直接将数据提前推送到浏览器。 - 头部压缩
HTTP/2 对请求头和响应头进行了压缩,你可能觉得一个 HTTP 的头文件没有多大,
压不压缩可能关系不大,但你这样想一下,在浏览器发送请求的时候,基本上都是发送
HTTP 请求头,很少有请求体的发送,通常情况下⻚面也有 100 个左右的资源,如果将这 - 个请求头的数据压缩为原来的 20%,那么传输效率肯定能得到大幅提升。
此文章为4月Day26学习笔记,内容来源于极客时间《浏览器原理》,学习使我快乐,每天进步一点点💪💪
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。