转载自:http://www.infoq.com/cn/news/2014/11/http2-develop
HTTP/2,也就是超文本传输协议第2版,是下一代HTTP协议。该版本是自1999年HTML 1.1发布后的首个更新,目前它正由互联网工程任务组(IETF)的Hypertext Transfer Protocol Bis (httpbis)工作小组进行开发。
对于HTTP/2,来自于Google的性能工程师Ilya Grigorik最近发布了一个PPT对此进行了详细的说明。在该呈现中,Ilya Grigorik首先提到了一组数据:目前平均每个Web页面大约会访问12个不同的主机,包含78个不同的请求,传输1232KB的数据,导致一个页面的渲染时间通常会在2.6s至5.6s之间。而在渲染占用的整个时间里面,网络大约占69.5%,JavaScript占6.6%,布局占5.1%,绘制占4.5%,因此网络传输的效率对整体性能有明显的影响。
Ilya Grigorik认为HTTP/1.1在性能方面有明显的缺陷,主要体现在以下几个方面:
a) 并行能力有限
- 每一个源最大只支持6个请求
- 管道在实际使用时不起作用
- 竞争性的TCP流,强制快速重传(Spurious retransmissions)
- 额外的握手、内存缓冲等
b) 客户端请求队列
- 队首阻塞
- 延迟的请求分发
c) 较高的协议负载
- 头信息和Cookies大约要800字节
- HTTP元数据没有压缩
另外,HTTP/1.1只允许由客户端主动发起请求,服务端只能等待客户端发送请求,这对于满足预加载的现状是一种桎梏。
针对这些问题,虽然我们可以通过一些变通的方法进行处理,但是这不可避免的会引发另外的问题。例如,针对请求数的限制我们可以把多个小文件打包到一个大文件中,但是由于并不是每一个页面都需要所有的小文件,所以这样做会造成带宽的浪费。那么HTTP/2是否能够帮助我们解决这些问题呢?它都包含哪些内容呢?
实际上HTTP/2是为了在万维网上进行低延迟的数据传输而设计的一个协议,它提供了HTTP语义的传输优化,支持HTTP/1.1的所有核心特征,并且在其他方面做的更高效。在HTTP/2中,基本的协议单位是帧,每个帧都有不同的类型和用途。例如,报头(HEADERS)和数据(DATA)帧组成了基本的HTTP 请求和响应;其他帧,例如设置(SETTINGS)和推送承诺(PUSH_PROMISE)则用来实现HTTP/2的其他功能。
HTTP/2基于SPDY协议,充分解决了TCP连接的限制。它允许多个并发 HTTP 请求共用一个 TCP会话,而不是为每个请求单独开放连接,这样只需建立一个 TCP 连接就可以传送网页上所有资源,不仅可以减少消息交互往返的时间还可以避免创建新连接造成的延迟,使得 TCP 的效率更高。
针对只能由客户端发起请求的问题,HTTP/2添加了一种新的交互模式,即服务器能够通过复用一个以PUSH_PROMISE帧发送的请求来实现推送。而对于数据冗余问题,在HTTP/2中帧包含的HTTP报头字段是压缩的,同时它还舍弃掉了不必要的头信息,因此能显著地减少请求和响应的大小。
如果你想了解与HTTP/2相关的更多信息,可以查看百度阅读提供的HTTP/2中文版。
对于Ilya Grigorik所分享的内容Hacker News社区上也有一些人发表了自己的看法,byuu认为:
首先Firefox以及一些其他的浏览器只能在TLS上使用HTTP/2,这对很多人而言是一种阻碍。虽然加密非常好,但是SSL证书可能需要一定的成本以及额外的CPU资源。其次,使用一种新的、自定义的压缩算法对头信息进行处理并不一定合适,因为如果头信息只有300字节的数据,那么压缩数据所带来的带宽收益并不一定会比它所消耗的CPU成本高,况且这样还增加了程序的复杂性。最后,byuu认为新协议可能会改变我们既有Web网站的工作方式,如果优化做的不好,那么性能可能会比HTTP/1.1更糟,同时兼容性也会阻碍大家对HTTP/2的采纳。
而kator 则从另一个角度发表了自己的看法:
“我并不怀疑这里有大量可提升的空间,很明显HTTP/2有很多内容来自于SPDY以及其他的一些项目。我担心的是我们现在正在做的事情对那些可以将所有内容塞到一个流中的大公司而言有巨大好处,而对于小公司而言则更多的是劣势。另外,作为一个老家伙,我担心人们会丢失与这些服务对话,或者以文本的方式查看对话的能力。”