HTTP/1.1 应用于 Web 已有15年的历史,协议的缺陷和不足开始显现。nginx
对比过去,如今的 web 页面须要加载更多资源,HTTP1.x 协议规定一个 TCP connection 不能并行发起多个 request 请求,这使得页面在快速加载大量资源时变得困难。web
为处理上述问题,HTTP1.1 协议容许浏览器使用多个 TCP connection 来并行发起多个 request 请求。这种处理方式存在缺陷,使用太多的 connection 会拔苗助长(TCP 拥塞控制会致使网络效率低下),同时也会出现不公平现象(浏览器都设法占用超出它本该分配的网络资源)。浏览器
在 SPDY 协议被 Mozilla 和 nginx 等厂商实现后,相对于 HTTP/1.x 展示出了明显的性能提高,这时 HTTP/2 协议的讨论和指定开始提上议程。服务器
通过一轮提议和投票,最被选择了 SPDY/2 做为 HTTP/2 协议的基础。此后,在工做组和实现者的讨论下 HTTP/2 协议又作出了一系列变动。在这个过程当中,SPDY 协议的核心开发者参与了 HTTP/2 协议的开发,这其中包括 Mike Belshe 和 Roberto Peon。网络
2015年9月,Google 宣布为了支持 HTTP/2 协议,未来再也不支持 SPDY 协议。并发
整体来讲区别有如下几点:工具
二进制协议解析效率更高,更节省网络资源,相对于 HTTP/1.1 协议使用文本格式的空格或空行来解析数据,二进制协议更不容易出错性能
例如, HTTP/1.1 定义了四种不一样解析消息的方式,HTTP/2 只有一种解析方式网站
虽然 HTTP/2 不能经过 telnet 来使用,可是可使用 Wireshark 等工具设计
HTTP/1.x 存在所谓的“头部阻塞”问题,也就是每一个 TCP connection 只能同时发起一个 request 请求。
HTTP/1.1 尝试使用 pipelining 来解决这个问题,这没有彻底陈述清楚该问题(一个大的或者慢的响应会阻塞这以后的其余请求)。同时 pipelining 被证实很难部署,由于许多中间件和服务器不能正确的处理它。
这使得客户只能经过猜想肯定与站点的哪一个链接发起请求,使用实际可用链接数的10倍来加载页面是很常见的,这会严重影响性能,一般会致使请求阻塞。
多路复用容许多个请求和响应的 message 在一个 TCP 链接上并行处理来解决这个问题,甚至可让不一样 message 的内容同时混合在一块儿处理,也就是客户端可使用单个 TCP connection 来加载完整的页面
使用 HTTP/1,浏览器能够在每一个域名上打开四个到八个链接。不少网站同时使用多个子域,这样加载单个页面会打开多达30个 TCP 链接。
一个应用并发使用太多的链接打破了构建 TCP 协议的基础设计,每一个链接会响应大量数据让网络的缓冲区溢出,从而触发 TCP 的拥塞控制和 TCP 重传机制