HTTP2
http1.1存在的问题
进步
- 增加了持久链接
- 浏览器为每个域名最多同步维护6个TCP持久链接
- 使用CDN实现域名分片机制 // todo: 不知道是什么 需要看看
缺点
- 对带宽的利用率并不理想
原因:
- TCP慢启动,推迟了宝贵的首次渲染页面的时长。
- 同时开启了多条 TCP 连接,那么这些连接会竞争固定的带宽
- HTTP/1.1 队头阻塞的问题
原因:
- 在 HTTP/1.1 中使用持久连接时,虽然能公用一个 TCP 管道,但是在
一个管道中同一时刻只能处理一个请求
,在当前的请求没有结束之前,其他的请求只能处于阻塞状态。这意味着我们不能随意在一个管道中发送请求和接收内容
。
http2的解决方案
一个域名使用一个TCP长连接来传输数据
,整个页面的资源下载过程只需要一次慢启动,同时避免来多个TCP长连接竞争带宽所带来的问题。- 多路复用,每个请求有一个对应的ID,浏览器接收到之后,会筛选出相同 ID 的内容,将其拼接为完整的 HTTP 响应数据
http2的多路复用

http2添加了一个二进制分帧层
过程
- 浏览器准备好请求数据,包括
请求行,请求头
,POST请求,还有请求体
- 经过二进制分帧层,被转换为一个个带有
请求ID编号的帧
,通过协议栈将其发给服务器 - 然后服务器处理该请求,并将处理的响应行、响应头和响应体分别发送至二进制分帧层
- 二进制分帧层会将这些响应数据转换为一个个带有请求 ID 编号的帧,经过协议栈发送给浏览器
- 浏览器接收到响应帧之后,会根据 ID 编号将帧的数据提交给对应的请求
http2的其他特性
- 可以设置请求的优先级,浏览器可以查看Priority优先级
- 服务器推送,接收到HTML请求后,
附带将要使用的CSS文件和JS文件一并发送给浏览器
,具体配置实现 - 头部压缩,打开network后可以看到很多
:authority
之类的请求头