来自:http://www.devstore.cn/essay/essayInfo/2104.html
HTTP/2你知多少?HTTP/1.1与TCP是当今Web世界的基础协议,随着互联网行业的飞速发展,HTTP/1.1协议开始无法满足新的需求,为此SPDY协议、QUIC协议和HTTP/2协议应运而生。
1、HTTP协议的问题
互联网平台的产品内容越来越多,为了展现这些内容,Web前端页面引入了更多的图片、CSS和JS脚本,因此浏览器需要访问更多的后端资源。HTTP/1.1协议的连接是单通道模式,一个连接一次只能传输一个资源,如果某个资源应答时间很长就会造成后续资源访问的堵塞。利用CDN技术(把资源分布到多个服务器)或者将服务器端资源进行合并可以改善这些问题,但是会增加开发和部署的复杂度。
移动端的兴起也带来了挑战,移动Web应用(包括Native+Web Hybrid应用)对于交互的响应要求越来越高,HTTP协议的设计擅长处理长文本流的传输,难以应对移动端应用高并发、短信息流的特点。大量的短并发会带来较高的带宽损耗(重复传输的Cookie,HEADER等),进而影响系统的响应效率。
基于HTTP的RESTful API已经成为互联网平台的API标准,为了支撑高并发的API调用,要求Web服务能达到传统Socket服务应用所能具备的高并发、低延迟,同时还要继续保持协议的兼容性。
2、SPDY的设计
SPDY是Google的工程师们为了解决HTTP/1.1的问题设计的新协议,从协议的发音(speedy)可见端倪。
SPDY实现的技术优势包括:
· 在一个TCP连接上并发多个HTTP请求,为HTTP开通了往返多车道。
· 实现了HTTP HEADER的压缩功能,去掉了不必要的HTTP HEADER,减少了HTTP请求的带宽占用。
· 协议简单,容易实现,保持了和HTTPS的兼容性。Web容器更换协议后Web应用不需要二次开发。
· 实现了SERVER PUSH功能,服务器可以在客户端请求资源前主动推送资源给它。
包括Apache、Nginx、Jetty、NodeJS在内的主流服务器都有SPDY协议插件,有的服务器已经内置了SPDY协议支持,Web应用可以不做任何修改就能享受SPDY协议带来的好处,因此很多互联网公司已经开始接纳应用SPDY协议。(Google和大淘宝)
Nginx 1.5以后的版本内置SPDY 3.1支持,只需配置文件从:
listen 443 ssl;
修改为:
listen 443 ssl spdy;
SPDY功能即可开启。
如何验证网站的SPDY支持:
Chrom浏览器的用户可以安装"HTTP/2 and SPDY indicator"插件,安装后访问支持SPDY或HTTP/2的网站地址栏的右侧就会看到绿色(SPDY)或蓝色(HTTP/2)的”闪电“标识。
3QUIC
HTTP协议的实现基于TCP协议,同样也深受TCP三次握手和TCP阀值窗口问题的困扰。
QUIC(Quick UDP Internet Connections)的设计目的是在UDP的基础上实现解决TCP无法解决的问题。从应用设计人员角度看,QUIC与TCP+TLS+SPDY及其类似。
QUIC主要解决这些问题:
· 连接的延迟问题
· 改进阀值控制
· 改进TCP的多路复用丢包问题
· 传输数据错误修复
· 连接迁移
3.1连接的延迟问题
TCP+TLS需要2-3次握手才能开始通讯,而利用QUIC,如果双方通讯过,可以立刻开始传输数据(即使未通讯过,握手的消耗也只有TCP的1/3)。
3.2改进TCP的多路复用丢包问题
由于TCP的流数据特性,如果发生丢包,TCP连接必须等待丢失的packet重新传输完毕后才能完成传输。
QUIC的多路复用处理机制可以让未丢包的数据流无需等待,持续提供给应用。
3.3传输数据错误修复
QUIC引入了类似RAID-4的数据修复包(FEC Packet),传输途中如果出现丢包,可以在接收端根据FEC Packet修复数据。
3.4连接迁移
TCP使用IP地址和端口标记连接,因此一旦IP出现变动(例如WIFI或4G环境下重连),原有TCP连接就会失效,需要重新发起连接。
QUIC使用64 BIT的连接ID来标记连接,因此IP变动的时候可以重用连接ID来标记连接,无需重新发起连接。
QUIC协议目前还没有稳定,只有Chromium项目提供了测试Server和Client实现。
4、HTTP/2的诞生
话说天下分久必合、合久必分,在Google,Microsoft等科技界大佬明争暗斗以后,2014年HTTP 2协议终于诞生了。
HTTP 2主要基于Google的SPDY协议发展而来,其特点包括:
1. 支持非TLS协议
HTTP/2可以在TCP上直接支持,而SPDY必须依赖TLS协议。
2. 使用二进制而不是文本
HTTP/2直接使用二进制定义报文,协议更加简单,理论上也能带来小小的性能提升。
3. 单TCP连接与多路复用
HTTP/1.1为了提升响应性能而采用多连接的方式传输数据,HTTP/2则对单主机只使用一个连接,提高了服务器端的承载能力。
在单个TCP连接上,HTTP/2协议支持带优先级的多路传输。
4. Header压缩
SPDY协议已经开始使用DEFLATE方法来压缩HEADER,但是发现了安全隐患(CRIME attack),HTTP/2引入了新的HPACK压缩算法。Header压缩对于移动应用非常有用,能够有效改善页面的加载。
5. Server Push
并不是提供类似Websocket的双向通信功能,而是类似HTTP/1中的Data URI scheme,将所需要的资源(图片,css,javascript)等和html整合在一起,放到一个响应中一次性取回。
目前支持HTTP/2的服务器列表:
https://github.com/http2/http2-spec/wiki/Implementations
结语
从SPDY、QUIC和HTTP/2的协议发展可以看出,HTTP协议未来的发展是通过报文格式精简,多路复用等技术手段提高服务器并发性能,降低延迟,尤其适合移动端和高并发网站的要求。目前SPDY的服务器端和客户端支持相对成熟,对应用的开发影响不大,商业产品可以开始部署,同时观测多路并发等设计思路对于高并发和网络延迟问题是否能够带来帮助。随着HTTP/2协议的确立,各大服务器产品的支持进度都会加快,可以预见HTTP/2会逐渐成为未来互联网通讯协议的标准。