Open YIXUNFE opened 9 years ago
HTTP 2.0 来了,从1.1到2.0,递增了一个大版本号,那么 HTTP 2.0 会给我们带来怎么样的技术革新呢?今天我们一起学习了解一下 HTTP 2.0 。
即超文本传输协议2.0版本,虽然协议的名字已经不是那么符合实际了(HTTP 1.0 开始即可传输二进制流等非文本内容)。
我们来看看它的宣言草稿:
HTTP 2.0 应该满足如下条件: 相对于使用 TCP 的 HTTP 1.1,用户在大多数情况下的感知延迟要有实质上、可度量的改进; 解决 HTTP 中的“队首阻塞”问题; 并行操作无需与服务器建立多个连接,从而改进 TCP 的利用率,特别是拥塞控制方面; 保持 HTTP 1.1 的语义,利用现有文档,包括(但不限于)HTTP 方法、状态码、URI,以及首部字段; 明确规定 HTTP 2.0 如何与 HTTP 1.x 互操作,特别是在中间介质上; 明确指出所有新的可扩展机制以及适当的扩展策略。 对现有的 HTTP 部署——特别是 Web 浏览器(桌面及移动)、非浏览器(“HTTP API”)、Web 服务(各种规模),以及中间介质(代理、公司防火墙、“反向”代理及 CDN)而言,最终规范应该满足上述这些目标。类似地,当前和未来对 HTTP/1.x 的语义扩展(如首部、方法、状态码、缓存指令)也应该得到新协议的支持。 —— HTTPbis WG 宣言 HTTP 2.0
HTTP 2.0 应该满足如下条件:
对现有的 HTTP 部署——特别是 Web 浏览器(桌面及移动)、非浏览器(“HTTP API”)、Web 服务(各种规模),以及中间介质(代理、公司防火墙、“反向”代理及 CDN)而言,最终规范应该满足上述这些目标。类似地,当前和未来对 HTTP/1.x 的语义扩展(如首部、方法、状态码、缓存指令)也应该得到新协议的支持。
—— HTTPbis WG 宣言 HTTP 2.0
从宣言看,2.0协议的范围和主要设计要求是改善 HTTP 传输中的性能瓶颈并对现有 HTTP 版本进行扩展而非替代。
目前 HTTP 2.0 的第一个可实现草案已经由 HTTPbis 工作组在今年的7月8日发布。
我们来看看2.0版本带来了哪些性能优化,这些优化又会带来怎样的技术变革。
二进制分帧层的工作就是将传输内容分割成小块的消息和帧,并以二进制格式对其进行编码。这样,客户端与服务端都必须互相了解对方的编码机制。
一个 HTTP 2.0 通信都在一个 TCP 连接上完成,这个连接可以承载任意数量的双向数据流。每个数据流再以消息的形式发送,每个消息由一或多个帧组成。这些帧可以乱序发送,然后再根据每个帧首部的流标识符重新组装。
我们可以将流理解为连接中的虚拟信道,可以承载双向的数据,每个流都有一个唯一的整数标识符。消息则代表一个请求或响应,可以由一或多个帧组成。帧是最小通信单位,承载特定类型的数据,如 HTTP 首部、负荷等等。
图中仅说明了数据流、消息与帧之间的关系,而非他们实际传输中的编码结果
把 HTTP 消息分解为很多独立的帧之后,就可以通过优化这些帧的交错和传输顺序,进一步提升性能。为了做到这一点,每个流都可以带一个31比特的优先值:
有了优先级,客户端和服务器就可以在处理不同流时采取不同的策略,以最优方式发送数据。
现代浏览器为了加快页面加载速度,都会根据资源的类型以及在页面中的位置排定请求的优先次序,甚至通过访问学习,即之前渲染如果被某些资源阻塞,那么同样的资源在下一次访问时可能会被赋予更高的优先级。
以前并行需要开启多个 TCP 连接,HTTP 2.0 仅需要一个连接就可以支持多个流的并行。
实验表明,客户端使用更少的连接肯定可以降低延迟时间。HTTP 2.0 发送的 总分组数量比 HTTP 差不多要少40%。而服务器处理大量并发连接的情况也 变成了可伸缩性问题,因为 HTTP 2.0 减轻了这个负担。 —— HT.TP/2.0 Draft 2
每个来源一个连接显著减少了相关的资源占用:连接路径上的套接字管理工作量少了,内存占用少了,连接吞吐量大了。此外,从上到下所有层面上也都获得了相应的好处:
虽然能指定流的优先级,但是如何分配带宽等资源问题,HTTP 2.0 提供了一个简单的机制:
HTTP 2.0 对于传输中的 HTTP 首部会进行差异化压缩。具体的规则如下:
通常的 Web 应用都由几十个资源组成,客户端需要分析服务器提供的文档才能逐个找到它们。那为什么不让服务器提前就把这些资源推送给客户端,从而减少额外的时间延迟呢?服务器已经知道客户端下一步要请求什么资源了,这时候服务器推送即可派上用场。
相比以前服务器将资源嵌入 HTML 返回的方式,HTTP 2.0 中会将这个过程放在 HTTP 协议本身来实现。这样可以带来几个好处:
“嵌入资源”是针对 HTTP 1.x 的一种流行“优化技巧”,实际上无异于“强制推送”,并且无法对嵌入资源做单独缓存。HTTP 2.0 的推送只能在服务器的响应之前进行,即无法随意发起推送流,并且能避免客户端出现竞态条件,比如下一个请求的资源恰好是服务器打算推送的资源。客户端自身可以拒绝推送的资源,比如已经缓存了该资源。
HTTP 2.0 时代下,哪些技术优化,我们可能不再需要呢?
上面所列可能不全,但只要是关于减少 HTTP 请求,增加并行下载的优化,都将在 HTTP 2.0 普及之后消失。
SPDY 是谷歌开发的一个实验性协议,于2009年年中发布,其主要目标是通过解决 HTTP 1.1 中广为人知的一些性能限制,来减少网页的加载延迟。大致上,这个项目设定的目标如下:
首次发布后不久,谷歌的两位软件工程师 Mike Belshe 和 Roberto Peon 就分享了他们对这个新实验性 SPDY 协议的实现结果、文档和源代码:
目前为止,我们只在实验室条件下测试过 SPDY。最初的成果很激动人心:通过模拟的家庭上网线路下载了25个最流行的网站之后,我们发现性能的改进特别明显,页面加载速度最多快了55%。 —— A 2x Faster Web Chromium Blog
目前为止,我们只在实验室条件下测试过 SPDY。最初的成果很激动人心:通过模拟的家庭上网线路下载了25个最流行的网站之后,我们发现性能的改进特别明显,页面加载速度最多快了55%。
—— A 2x Faster Web Chromium Blog
几年后的2012年,这个新的实验性协议得到了 Chrome、Firefox 和 Opera 的支持,很多大型网站(如谷歌、Twitter、Facebook)都对兼容客户端提供 SPDY 会话。换句话说,SPDY 在被行业采用并证明能够大幅提升性能之后,已经具备了成为一个标准的条件。最终,HTTP-WG(HTTP Working Group)在2012年初把 HTTP 2.0 提到了议事日程,吸取 SPDY 的经验教训,并在此基础上制定官方标准。
这篇文章基本就是照搬书中内容为大家介绍了一下 HTTP 2.0。这里也狠狠推荐一下这本好书——《High Performance Browser Networking 》。中文版由李松峰老师翻译,书名是《Web性能权威指南》,大家可以去各大网站
这本书将Web性能的瓶颈,具体的优化方案,未来的技术演进等都做了非常精彩的讲解,是一本前端开发进阶良书。
认识 HTTP 2.0
HTTP 2.0 来了,从1.1到2.0,递增了一个大版本号,那么 HTTP 2.0 会给我们带来怎么样的技术革新呢?今天我们一起学习了解一下 HTTP 2.0 。
HTTP 2.0 是什么?
即超文本传输协议2.0版本,虽然协议的名字已经不是那么符合实际了(HTTP 1.0 开始即可传输二进制流等非文本内容)。
我们来看看它的宣言草稿:
从宣言看,2.0协议的范围和主要设计要求是改善 HTTP 传输中的性能瓶颈并对现有 HTTP 版本进行扩展而非替代。
目前 HTTP 2.0 的第一个可实现草案已经由 HTTPbis 工作组在今年的7月8日发布。
HTTP 2.0 带来的性能优化
我们来看看2.0版本带来了哪些性能优化,这些优化又会带来怎样的技术变革。
二进制分帧层
二进制分帧层的工作就是将传输内容分割成小块的消息和帧,并以二进制格式对其进行编码。这样,客户端与服务端都必须互相了解对方的编码机制。
流,消息与帧
一个 HTTP 2.0 通信都在一个 TCP 连接上完成,这个连接可以承载任意数量的双向数据流。每个数据流再以消息的形式发送,每个消息由一或多个帧组成。这些帧可以乱序发送,然后再根据每个帧首部的流标识符重新组装。
我们可以将流理解为连接中的虚拟信道,可以承载双向的数据,每个流都有一个唯一的整数标识符。消息则代表一个请求或响应,可以由一或多个帧组成。帧是最小通信单位,承载特定类型的数据,如 HTTP 首部、负荷等等。
图中仅说明了数据流、消息与帧之间的关系,而非他们实际传输中的编码结果
请求优先级
把 HTTP 消息分解为很多独立的帧之后,就可以通过优化这些帧的交错和传输顺序,进一步提升性能。为了做到这一点,每个流都可以带一个31比特的优先值:
有了优先级,客户端和服务器就可以在处理不同流时采取不同的策略,以最优方式发送数据。
每个来源一个连接
以前并行需要开启多个 TCP 连接,HTTP 2.0 仅需要一个连接就可以支持多个流的并行。
每个来源一个连接显著减少了相关的资源占用:连接路径上的套接字管理工作量少了,内存占用少了,连接吞吐量大了。此外,从上到下所有层面上也都获得了相应的好处:
流量控制
虽然能指定流的优先级,但是如何分配带宽等资源问题,HTTP 2.0 提供了一个简单的机制:
首部压缩
HTTP 2.0 对于传输中的 HTTP 首部会进行差异化压缩。具体的规则如下:
服务器推送
通常的 Web 应用都由几十个资源组成,客户端需要分析服务器提供的文档才能逐个找到它们。那为什么不让服务器提前就把这些资源推送给客户端,从而减少额外的时间延迟呢?服务器已经知道客户端下一步要请求什么资源了,这时候服务器推送即可派上用场。
相比以前服务器将资源嵌入 HTML 返回的方式,HTTP 2.0 中会将这个过程放在 HTTP 协议本身来实现。这样可以带来几个好处:
“嵌入资源”是针对 HTTP 1.x 的一种流行“优化技巧”,实际上无异于“强制推送”,并且无法对嵌入资源做单独缓存。HTTP 2.0 的推送只能在服务器的响应之前进行,即无法随意发起推送流,并且能避免客户端出现竞态条件,比如下一个请求的资源恰好是服务器打算推送的资源。客户端自身可以拒绝推送的资源,比如已经缓存了该资源。
前端技术革新
HTTP 2.0 时代下,哪些技术优化,我们可能不再需要呢?
上面所列可能不全,但只要是关于减少 HTTP 请求,增加并行下载的优化,都将在 HTTP 2.0 普及之后消失。
延伸阅读
SPDY 与 HTTP 2.0
SPDY 是谷歌开发的一个实验性协议,于2009年年中发布,其主要目标是通过解决 HTTP 1.1 中广为人知的一些性能限制,来减少网页的加载延迟。大致上,这个项目设定的目标如下:
首次发布后不久,谷歌的两位软件工程师 Mike Belshe 和 Roberto Peon 就分享了他们对这个新实验性 SPDY 协议的实现结果、文档和源代码:
几年后的2012年,这个新的实验性协议得到了 Chrome、Firefox 和 Opera 的支持,很多大型网站(如谷歌、Twitter、Facebook)都对兼容客户端提供 SPDY 会话。换句话说,SPDY 在被行业采用并证明能够大幅提升性能之后,已经具备了成为一个标准的条件。最终,HTTP-WG(HTTP Working Group)在2012年初把 HTTP 2.0 提到了议事日程,吸取 SPDY 的经验教训,并在此基础上制定官方标准。
HTTP 简史
最后
这篇文章基本就是照搬书中内容为大家介绍了一下 HTTP 2.0。这里也狠狠推荐一下这本好书——《High Performance Browser Networking 》。中文版由李松峰老师翻译,书名是《Web性能权威指南》,大家可以去各大网站
这本书将Web性能的瓶颈,具体的优化方案,未来的技术演进等都做了非常精彩的讲解,是一本前端开发进阶良书。