HTTP的前世今生详解( 二 )

OPTIONS 方法,其主要用于 CORS – Cross Origin Resource Sharing 应用 。HTTP/1.1 应该分成两个时代,一个是 2014 年前,一个是 2014 年后,因为 2014 年 HTTP/1.1 有了一组 RFC(7230 /7231/7232/7233/7234/7235),这组 RFC 又叫“HTTP/2 预览版” 。其中影响 HTTP 发展的是两个大的需求:

  • 一个需要是加大了 HTTP 的安全性,这样就可以让 HTTP 应用得广泛,比如,使用 TLS 协议 。
  • 另一个是让 HTTP 可以支持更多的应用,在 HTTP/1.1 下,HTTP 已经支持四种网络协议:
    • 传统的短链接 。
    • 可重用 TCP 的的长链接模型 。
    • 服务端 push 的模型 。
    • WebSocket 模型 。
自从 2005 年以来,整个世界的应用 API 越来多,这些都造就了整个世界在推动 HTTP 的前进,我们可以看到,自 2014 的 HTTP/1.1 以来,这个世界基本的应用协议的标准基本上都是向 HTTP 看齐了,也许 2014 年前,还有一些专用的 RPC 协议,但是 2014 年以后,HTTP 协议的增强,让我们实在找不出什么理由不向标准靠拢,还要重新发明轮子了 。
HTTP/2虽然 HTTP/1.1 已经开始变成应用层通讯协议的一等公民了,但是还是有性能问题,虽然 HTTP/1.1 可以重用 TCP 链接,但是请求还是一个一个串行发的,需要保证其顺序 。然而,大量的网页请求中都是些资源类的东西,这些东西占了整个 HTTP 请求中最多的传输数据量 。所以,理论上来说,如果能够并行这些请求,那就会增加更大的网络吞吐和性能 。
另外,HTTP/1.1 传输数据时,是以文本的方式,借助耗 CPU 的 zip 压缩的方式减少网络带宽,但是耗了前端和后端的 CPU 。这也是为什么很多 RPC 协议诟病 HTTP 的一个原因,就是数据传输的成本比较大 。
其实,在 2010 年时,Google 就在搞一个实验型的协议,这个协议叫 SPDY,这个协议成为了 HTTP/2 的基础(也可以说成 HTTP/2 就是 SPDY 的复刻) 。HTTP/2 基本上解决了之前的这些性能问题,其和 HTTP/1.1 最主要的不同是:
  • HTTP/2 是一个二进制协议,增加了数据传输的效率 。
  • HTTP/2 是可以在一个 TCP 链接中并发请求多个 HTTP 请求,移除了 HTTP/1.1 中的串行请求 。
  • HTTP/2 会压缩头,如果你同时发出多个请求,他们的头是一样的或是相似的,那么,协议会帮你消除重复的部分 。这就是所谓的 HPACK 算法(参看 RFC 7541 附录 A)
  • HTTP/2 允许服务端在客户端放 cache,又叫服务端 push,也就是说,你没有请求的东西,我服务端可以先送给你放在你的本地缓存中 。比如,你请求 X,我服务端知道 X 依赖于 Y,虽然你没有的请求 Y,但我把把 Y 跟着 X 的请求一起返回客户端 。
对于这些性能上的改善,在 Medium 上有篇文章你可看一下相关的细节说明和测试“HTTP/2: the difference between HTTP/1.1, benefits and how to use it”
当然,还需要注意到的是 HTTP/2 的协议复杂度比之前所有的 HTTP 协议的复杂度都上升了许多许多,其内部还有很多看不见的东西,比如其需要维护一个“优先级树”来用于来做一些资源和请求的调度和控制 。如此复杂的协议,自然会产生一些不同的声音,或是降低协议的可维护和可扩展性 。所以也有一些争议 。尽管如此,HTTP/2 还是很快地被世界所采用 。
HTTP/2 是 2015 年推出的,其发布后,Google 宣布移除对 SPDY 的支持,拥抱标准的 HTTP/2 。过了一年后,就有 8.7%的网站开启了 HTTP/2,根据 这份报告,截止至本文发布时(2019 年 10 月 1 日 ),在全世界范围内已经有 41%的网站开启了 HTTP/2 。
HTTP/2 的官方组织在 Github 上维护了一份各种语言对 HTTP/2 的实现列表,大家可以去看看 。

推荐阅读