HTTP2协议规范详述
作者:chszs,转载需注明。博客主页:http://blog.csdn.net/chszs
2015年2月19日,HTTP协议规范的标准化组织The Internet Engineering Task Force's HTTP Working Group,正式发布了HTTP 2协议。HTTP协议工作组实际上发布了两个相关的规范:
1)HTTP/2协议
2)HPACK
HPACK是HTTP/2协议Header部分的压缩规范。
HTTP/2协议规范的制定工作是从2012年开始的,是为了响应Google的SPDY协议而制定。
HTTP/1.x协议最大的问题是使用了多个连接来并行地载入资源,因为当客户端和服务器之间使用单个连接来请求网页所需的多种不同的对象(图片、CSS以及JavaScript等)时,这些对象必须按顺序依次传输,一个接一个。如果某个对象需要花很多时间才能完成传输,那么就可能占据大量的服务器的创建时间,而其后的对象都必须等待。
这导致了大多数HTTP/1.x连接仅被用于请求单个的对象。Web客户端根据需求并行地载入它们需要的对象,以至于不得不要求服务器创建多个连接。这使得服务器的开销巨大:它耗光了额外的网络资源,占据了额外的处理时间,而且客户端与服务器之间的每一个连接都需要数个往返通信。
HTTP/2协议直接解决了这个问题。在HTTP/2协议中,在单个TCP连接上,客户端和服务器之间是全双工的数据流的多路复用。每一个流都可以携带一对请求/响应,客户端向服务器发起多个请求时只需使用多路复用即可。而且,所有的数据流彼此是相互独立的。如果某个数据流很慢,HTTP/2连接可以继续传输其它数据流的数据。同样地,客户端可以请求某个很大的对象,再请求某个小对象,那么小对象的响应可能先返回,大对象的响应可能需一段时间后才得到响应。在HTTP/2协议中,无需HTTP/1.x协议的等待和顺序处理。HTTP/2协议规范建议客户端和服务器都需要支持在单个连接上传输至少100种不同的数据流。
HTTP/2协议还有其它的性能和功能方面的改进。传统的HTTP/1.x协议是一个文本协议,其请求和响应都使用了可读的纯文本格式。而HTTP/2协议是一个二进制协议,它把请求和响应拆分成了不可读的顺序帧,在TCP连接上传输。HTTP/2协议还允许服务器直接推送数据流到客户端,无需客户端发起最初的请求。
作为一个二进制协议,HTTP/2协议没有改变HTTP连接的底层语义。每一个请求和响应都仍然包括Header部分和Body部分,Header部分通常用于标识Body部分的元数据信息。不过,HTTP/2协议在表示同样的消息设计时更富有效率。
HTTP/2协议在很大程度上基于了Google的SPDY协议而制定,但是有一些SPDY协议的特性在HTTP/2协议中没有采纳。HTTP/2协议还是需要TLS(Transport Layer Security,传输层安全)来增强隐私和安全。HTTP/2协议在这方面是可选的,既可以在TLS上传输,又可以在纯TCP上传输。但是,目前业界有部分HTTP/2协议的服务提供商宣称自己只支持加密TLS连接的HTTP/2通信,以便保护用户的隐私。
SPDY协议最初在双向传输上还使用了gzip来压缩Header部分。但是在2012年,gzip在Header部分的使用被发现是很危险的,它在遭受攻击时很容易暴露用户的隐私,从而导致犯罪。随后SPDY协议做了改变,停止了gzip压缩的使用。HTTP/2协议规范的第二部分解决了这个问题:HPACK。
HPACK是一种压缩HTTP/2连接的Header部分的方法,可以有效地避免用户隐私的泄露。与gzip不同,HPACK是一种面向通用目标的压缩算法,以满足HTTP/2协议的需求。
随着IETF签署通过了HTTP/2协议,接下来HTTP/2协议将由RFC正式发布。
可以预见,未来各浏览器都将很好地支持HTTP/2协议,Google最新的Chrome 40版将包含对HTTP/2协议的支持,并且Google宣称在2016年年初将会从Chrome浏览器中移除对SPDY协议的支持。这也预示着SPDY协议的寿命在明年将会走到尽头。Mozilla浏览器宣布,Firefox 36版将会支持HTTP/2协议的第14版草案,在Firefox 37或38版将会支持到HTTP/2协议的第16版草案,再往后的版本将会完全支持HTTP/2协议。微软的Windows 10操作系统的技术预览版也包含了对HTTP/2协议的第14版草案的支持,其新的浏览器项目Spartan将会完全替代IE浏览器,提供对HTTP/2协议的完整支持。