一, 前言
HTTP 2.0 相比于 HTTP 1.X, 可以说是大幅度提高了 web 的性能.
在 HTTP 1.X 中, 为了性能考虑, 我们会引入雪碧图, 将小图内联, 使用多个域名等等的方式. 这一切都是因为浏览器限制了同一个域名下的请求数量, 当页面中需要请求很多资源的时候, 队头阻塞 (Head of line blocking) 会导致在达到最大请求数量时, 剩余的资源需要等待其他资源请求完成后才能发起请求.
二, HTTP 2.0
感受下 HTTP 2.0 比 HTTP 1.X 到底快了多少, 地址: https://http2.akamai.com/demo
在 HTTP 1.X 中, 因为队头阻塞的原因, 你会发现请求是这样的
在 HTTP 2.0 中, 因为引入了多路复用, 你会发现请求是这样的
三, HTTP 2.0 核心
3.1 二进制传输
HTTP 2.0 中所有加强性能的核心带你在于此 -- 二进制传输.
之前的 HTTP 的版本中, 我们传输数据方式 -- 文本传输.
在 HTTP 2.0 中引入了新的编码机制, 所有传输的数据都会被分隔, 并采用二级制格式编码.
3.2 多路复用
在 HTTP 2.0 中, 有两个非常重要的概念, 分别是帧 (frame) 和流(stream).
帧代表着最小的数据单位, 每个帧会标识出该帧属于哪个流, 流也就是多个帧组成的数据流.
多路复用, 就是在一个 TCP 连接中可以存在多条流. 换句话说, 也就是可以发送多个请求, 对端可以通过帧中的标识知道属于哪个请求. 通过这个技术, 可以避免 HTTP 旧版本中的队头阻塞问题, 极大的提高传输性能.
3.3 Header 压缩
在 HTTP 1.X 中, 我们使用文本的形式传输 header, 在 header 携带 cookie 的情况下, 可能每次都需要重复传输几百到几千的字节.
在 HTTP 2.0 中, 使用了 HPACK 压缩格式对传输的 header 进行编码, 减少了 header 的大小. 并在两端维护了索引表, 用于记录出现过的 header , 后面在传输过程中就可以传输已经记录过的 header 的键名, 对端收到数据后就可以通过键名找到对应的值.
3.4 服务端 push
在 HTTP 2.0 中, 服务端可以在客户端某个请求后, 主动推送其他资源.
可以想象以下情况, 某些资源客户端是一定会请求的, 这时就可以采取服务端 push 的技术, 提前给客户端推送必要的资源, 这样就可以相对减少一点延迟时间. 当然在浏览器兼容的情况下你也可以使用 prefetch .
3.5 QUIC
这是一个谷歌出品的基于 UDP 实现的同为传输层的协议, 目标很远大, 希望替代 TCP 协议.
1, 该协议支持多路复用, 虽然 HTTP 2.0 也支持多路复用, 但是下层仍是 TCP, 因为 TCP 的重传机制, 只要一个包丢失就得判断丢失包并且重传, 导致发生队头阻塞的问题, 但是 UDP 没有这个机制
2, 实现了自己的加密协议, 通过类似 TCP 的 TFO 机制可以实现 0-RTT, 当然 TLS 1.3 已经实现了 0-RTT 了
3, 支持重传和纠错机制(向前恢复), 在只丢失一个包的情况下不需要重传, 使用纠错机制恢复丢失的包. 纠错机制: 通过异或的方式, 算出发出去的数据的异或值并单独发出一个包, 服务端在发现有一个包丢失的情况下, 通过其他数据包和异或值包算出丢失包. 在丢失两个包或以上的情况就使用重传机制, 因为算不出来了.
来源: https://www.cnblogs.com/chengxs/p/10933648.html