http 1.1 的缺陷
pipeling 和 线头阻塞
http 1.1 提出了pipeling的概念,把多个HTTP 请求放到一个TCP链接中一一发送,而在发送过程中不需要等待服务器对前一个请求的响应。
然而,客户端还是要按照发送请求的顺序来接收响应。如果前一个请求非常耗时,后续请求会被阻塞住,就存在了线头阻塞(head-of-line blocking)的问题。
优化方案
-
域名分片
为了减少线头阻塞带来的延迟,浏览器会选择另开一个TCP连接。目前浏览器可以喝每个主机建立6-8个连接。因此很多网站会选择把不同资源放到不同域名的主机上增加同时建立的连接数,这也会带来另一个好处: 传输主站外的资源可以不使用cookie.
-
拼接 多个小js文件合成大文件
-
内联
-
Spriting
HTTP2
起源
HTTP2 起源于Google牵头开发的SPDY的成功. SPDY依赖TLS HTTP2将TLS标记成可选,然而,Firefox和Chrome明确表示,他们只会实现基于TLS的http2.
协议
二进制帧
http2会发送有着不同类型的二进制帧,规范中一共定了10种不同的帧。二进制帧包含以下公共字段:
- Type
- Length
- Flags
- Stream Identifier
- frame payload
多路复用的流
- 流: Stream Identifier将http上传输的帧都关联为一个流。
- 并发,全双工:每个单独的http2连接都可以包含多个并发的流。流的多路复用意味着在同一连接中来自各个流的数据包会被混在一起。
- 优先级和依赖性: 每个流都有权重,资源有限时,服务器根据优先级选择发送顺序
头部压缩
HTTP是无状态协议,所有服务器需要的信息都包含在头部,头部过大影响速度。 HTTP2的压缩右HPACK实现, HPACK中维护一个静态映射表,给每个头部状态一个编码,减小体积。
服务器推送
当服务器预先知道客户端需要的资源时可以主动向客户端推送数据。 服务器推送需要客户端显示的允许服务器提供该功能。并且,客户端能通过发送RST_STREAM帧来中断推送。