# HTTP2

TIP

HTTP2 采用二进制格式传输,解析更高效,HTTP1.x 采用文本格式。
基于 Google 的 SPDY 协议,注重性能改善。
HTTP3 基于 Google 的 QUIC(Quick UDP Internet Connection)协议,基于 UDP HTTP3

# HTTP2 改进内容

提高了 HTTP1.x 的性能,在兼容 1.x 的基础上,进一步减少了网络延迟。

特点:多路复用,二进制分帧,首部压缩(SPDY),服务器推送,强化安全

# 多路复用 github

允许同时发起多重请求-响应
多路复用代替了 HTTP1.x 的序列和阻塞机制。同域名下的请求都会通过同一个 TCP 连接并完成。在 HTTP1.x 中,并发请求会创建多个 TCP 连接,浏览器会控制在 6-8 个连接,同一个连接下面的请求,需要等待前面的请求结束才能开始执行。
多路复用使用一个连接,消除了 TCP 连接带来的延时和内存消耗,请求之间也不会相互影响(帧数据上带有唯一标识,接收到后可进行拼装),可以不用等待前面的请求结束,就发起请求或者接收响应。

# 二进制分帧

帧代表着最小的数据单位,每个帧会标识出该帧属于哪个流,流也就是多个帧组成的数据流。

TCP 慢启动, TCP 会随着时间进行自我调谐,起初会限制最大连接速度,后续数据传输成功,会随着时间推移提高传输速度。

另外之前传输信息都是通过明文传输,便于开发调试,但是机器解析起来,对于大小写、空白符、回车、换行等可能会有歧义。

使用二进制,可以严格规定字段大小、顺序、标志位等,避免歧义。

在应用层(HTTP2)和传输层(UDP 或 TCP)只不过之间增加一个二进制分帧层。
二进制分帧层会将传输的信息分割为更小的消息和帧,并进行二进制编码。

# 首部压缩/头部压缩

减少数据传输。

报文头部的信息,常常都是一些重复或者众所周知的信息,传输的信息可能只占了很小的一部分,这些头部信息却是有几百上千字节。

并不是使用传统的压缩算法,而是专门开发了 HPACK 算法,在客户端和服务器两端,各自维护了一份索引表字典,用索引表示重复的字符串,还用哈夫曼编码压缩证书和字符串。

# 服务器推送

服务器还没有收到响应的请求,就把各种资源推送给浏览器。

# 强化安全

HTTP2 必须要加密。

# HTTP1.1 变更点

  • 增加了缓存管理
  • 允许持久连接
  • 允许数据分块,方便传输大文件
  • 强制 Host 头,支持互联网托管