via: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报头字段是压缩的,同时它还舍弃掉了不必要的头信息,因此能显著地减少请求和响应的大小。