HTTP 协议(Hyper Text Transfer Protocol)和 TCP/IP 协议族内的其他协议相同,用于客户端和服务器之间的通信。
从1997年发布了HTTP1.1直到2015年,HTTP1.1都是主流的版本,但是随着网络的发展HTTP1.1的一些局限性逐渐暴露出来:队首阻塞问题、首部没有压缩增加延迟以及数据非强制压缩等。
2009年,Google开发了SPDY协议,用于增强HTTP协议,该协议得到了多数浏览器厂商的支持。 2015年IEFT通过对SPDY协议标准化推出了HTTP/2,其主要目标是改进传输性能,实现低延迟和高吞吐量,并且与 HTTP 1.1 完全语义兼容。
HTTP/2主要有一下几个新特性:
HTTP/2 所有性能增强的核心,就是引入了二进制分帧层,之前HTTP 1.x在应用层以纯文本的形式进行通信,以换行符作为分割。HTTP/2为了更方便进行一些性能优化,将所有的传输信息分割为更小的消息和帧,并对它们采用二进制格式编码。
HTTP/2引入了几个新概念:
三者的关系是:所有通信都在一个 TCP 连接上完成,此连接可以承载任意数量的双向数据流。每个数据流都有一个唯一的标识符和可选的优先级信息,用于承载双向消息。每条消息都是一条逻辑 HTTP 消息(例如请求或响应),包含一个或多个帧。
根据帧的作用可以将帧分为以下几个类型:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| R | Length (14) | Type (8) | Flags (8) |
+-+-+-----------+---------------+-------------------------------+
|R| Stream Identifier (31) |
+=+=============================================================+
| Frame Payload (0...) ...
+---------------------------------------------------------------+
HTTP/2中每个数据流都可以有一个关联的权重和依赖关系(根据帧类型为PRIORITY标识),这个可以标识资源优先级,服务器可以根据这个决定资源分配(不是强制),可以向每个数据流分配一个介于 1 至 256 之间的整数作为权重。
每个数据流与其他数据流之间可以存在显式依赖关系,依赖关系通过将另一个数据流的唯一标识符作为父项引用进行声明;如果忽略标识符,相应数据流将依赖于“根数据流”。声明数据流依赖关系指出,应尽可能先向父数据流分配资源,然后再向其依赖项分配资源。
上图中流A和B没有依赖关系,权重分别为12和4,则A和B获取资源的比例为3/4、1/4;C依赖于D,则D需要等待C后分配资源。
在 HTTP/1.x 中,如果客户端要想发起多个并行请求以提升性能,则必须使用多个 TCP 连接,HTTP2.0 基于二进制分帧层,可以在共享TCP连接的基础上,交错并行的发送请求和响应,互不影响,解决了 HTTP/1.x 中存在的队首阻塞问题,也消除了并行处理和发送请求及响应时对多个连接的依赖。
流控制是一种阻止发送方向接收方发送大量数据的机制,以免超出后者的需求或处理能力
在 HTTP/1.x 中,此元数据始终以纯文本形式,通常会给每个传输增加 500–800 字节的开销。如果使用 HTTP Cookie,增加的开销有时会达到上千字节。HTTP/2 使用 HPACK 压缩格式压缩请求和响应头部,HPACK 压缩上下文包含一个静态表和一个动态表:
静态字典在规范中定义,并提供了一个包含所有连接都可能使用的常用 HTTP 标头字段(例如,有效标头名称)的列表;
动态字典最初为空,将根据在特定连接内交换的值进行更新(Huffman Coding:用较少的字节表示较多的数据)动态字典上下文有关,需要为每个 HTTP/2 连接维护不同的字典。
所有服务器推送数据流都由 PUSH_PROMISE 帧发起,表明了服务器向客户端推送所述资源的意图,并且需要先于请求推送资源的响应数据传输。推送资源可以:由客户端缓存、在不同页面之间重用、与其他资源一起复用、由服务器设定优先级以及被客户端拒绝。
下图是Akamai公司建立的一个官方演示,用来说明HTTP2.0相比HTTP1.1在性能上的提升,同时请求379张图片,根据Load time可以看出HTTP2在性能上的优势。
HTTP/2的支持情况如下图,可以看到大多数浏览器支持了HTTP/2
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。