HTTP是应用层协议,是基于TCP底层协议而来。css
TCP的机制限定,每创建一个链接须要3次握手,断开链接则须要4次挥手。html
HTTP协议采用“请求-应答”模式,HTTP1.0下,HTTP1.1非Keep-Alive模式下,每一个请求都要新建一个链接,完成以后当即断开链接。若是有新的请求,则要从新建立请求链接(HTTP协议为无链接的协议)。前端
这样难免形成了网络传输数据必定的延迟,1999年推出HTTP1.1,虽然能够经过设置延迟时间,让链接延迟关闭。但仍然有线头阻塞,max-connection最大链接限制了并行请求数量等痛点,难以应对日益增加的大数据实时传输。segmentfault
新一代HTTP2.0协议应运而生,提升HTTP应对高并发场景下的数据传输能力。后端
提出管道化方案解决链接延迟,服务端可设置Keep-Alive来让链接延迟关闭时间,但由于浏览器自身的Max-Connection最大链接限制,同一个域名 (host) 下的请求链接限制(同域下谷歌浏览器是一次限制最多6个链接),只能经过多开域名来实现,这也就是咱们的静态资源选择放到CDN上或其它域名下,来提升资源加载速度。浏览器
pipelining方案须要先后端支持,但绝大部分的HTTP代理器对pipelining的支持并不友好。缓存
pipelining只支持GET/HEAD方式传送数据,不支持POST等其它方式传输。服务器
HTTP是无状态的,客户端/服务端只能经过HEAD的数据维护获取状态信息,这样就形成每次链接请求时都会携带大量冗余的头部信息,头部信息包括COOKIE信息等。网络
HTTP1.X是超文本协议传输。超文本协议传输,发送请求时会找出数据的开头和结尾帧的位置,并去除多余空格,选择最优方式传输。若是使用了HTTPS,那么还会对数据进行加密处理,必定程度上会形成传输速度上的损耗。架构
pipelining经过延迟链接关闭的方案,虽然可同时发起对服务端的多个请求,但服务端的response依旧遵循FIFO(first in first out)规则 依次返回。
举个例子客户端发送了一、二、三、4四个请求,若是1没返回给客户端,那么2,3,4也不会返回。这就是所谓的线头阻塞。高并发高延迟的场景下阻塞明显。
以上三种三种方法虽然能使HTTP1.X协议传输速度提升,但也有对应的不足。
了解完HTTP1.1的痛点,接下来就是咱们新一代的HTTP协议HTTP2.0
SPDY是2012年谷歌推出的是基于SSL/TLS的传输协议,SPDY有下降延迟,多路复用,头部压缩,服务端推送等特色,这些特色也称为了后续HTTP2.0的功能基石,HTTP2.0是SPDY/3 draft的优化版。
HTTP2.0 与 SPDY的区别:
(一个域只要一个TCP链接)实现真正的并发请求,下降延时,提升了带宽的利用率。
客户端/服务端进行渐进更新维护,采用HPACK压缩,节省了报文头占用流量。
两端会共同维护一个head list,每次请求时都会进行检查。
该list包括:
每一个流都有本身的优先级别,客户端可指定优先级。并能够作流量控制。由于HTTP2.0的传世容许请求并发,可是应用场景中咱们要处理一些主要文件的优先级权重,以及资源模块依赖等。因此咱们可经过设置优先级来提升主要文件的权重,使其优先加载请求。
请求不是来自客户端“明确”的请求,是从服务端PUSH_PROMISE帧中提供。例如咱们加载index.html, 咱们可能还须要index.js, index.css等文件。传统的请求只有当拿到index.html,解析html中对index.js/index.css的引入才会再请求资源加载,可是经过服务端数据,能够提早将资源推送给客户端,这样客户端要用到的时候直接调用便可,不用再发送请求。
HTTP2.0 传输协议采用二进制协议,区别与HTTP1.X的超文本协议。更易于帧,数据包的发送接收。HTTP2.0是运行在TCP链接上的应用层协议,接受服务器或发送请求时,会自动将头部信息/request body分红HEAD帧和DATA帧。
客户端/服务端发送/接收数据时,会将数据打散乱序发送,接收数据时接收一端再经过streamID标识来将数据合并。
HTTP2.0理论上支持明文HTTP传输,但由于其前身SPDY是在TLS上,他们的主人Google 和 Firefox 都支持TLS架构,因此须要搭建HTTP2.0 + TLS成了标准。
参考文档
做者:以乐之名 本文原创,有不当的地方欢迎指出。转载请指明出处。