http1.X与2.0

HTTP

HTTP 1.X

  1. HTTP是创建在TCP协议上的,HTTP协议的瓶颈及优化都是基于TCP协议自己的特性。web

  2. TCP创建链接时有三次握手 会有1.5RTT的延迟,为了不每次请求都经历握手待来的延迟,应用层会选择不一样策略的http长链接。算法

HTTP 1.0 链接不能复用以及有head of line blocking问题。

http1.0协议头里能够设置Connection:Keep-Alive。在header里设置Keep-Alive能够在必定时间内复用链接,具体复用时间的长短能够由服务器控制,通常在15s左右。到http1.1以后Connection的默认值就是Keep-Alive,若是要关闭链接复用须要显式的设置Connection:Close。
<br />
head of line blocking会由于一个request没有到达服务器或者一个response由于网络没有及时返回而影响后续全部请求。

链接复用问题

tcp长连接
http long-polling

客户端在初始状态会发送一个polling请求到服务器,服务器并不会立刻返回业务数据,而是等待有新的业务数据产生时返回。因此链接会被保持,一旦结束立刻又会发起一个新的polling请求,反复如此。安全

http streaming

与long-polling不一样,server并不会结束初始的streaming请求,而是持续的经过这个通道返回最新的业务数据,但这个通道时单向的。服务器

web socket

与传统的 tcp socket链接类似,也是基于tcp协议,并提供双向的数据通道。cookie

解决head of line blocking

http pipelining

让每一个请求不用等待其余请求的response返回以后才发出,而是几乎在同一时间把request发送给服务器。网络

SPDY

http 1.X存在诸多问题,在尝试了各类优化手段后提出的SPDY方案。socket

SPDY目标

  • 下降延迟,客户端的单链接单请求,server的FIFO响应队列都是延迟的大头。
  • http最初设计都是客户端发起请求,而后server响应,server没法主动push内容到客户端。
  • 压缩http header,http1.x的header愈来愈膨胀,cookie和user agent很容易让header的size增至1kb大小,甚至更多。并且因为http的无状态特性,header必须每次request都重复携带,很浪费流量。

SPDY基础功能

  • 多路复用。多路复用经过多个请求stream共享一个tcp链接的方式,解决了http 1.x hold of line blocking 的问题,下降了延迟同时提升了带宽的利用率。
  • 请求优先级。多路复用带来一个新的问题,在链接共享的基础上可能致使一些关键请求被阻塞。
  • header压缩。 http1.X的 header不少时候都是重复多余的。选择合适的压缩算法能够减少包的大小和数量。

SPDY高级功能

  • server推送。 http1.x只能由客户端发起请求,而后服务器被动的发送response。开启server push以后,server经过X-Associated-Content header告知客户端会有新的内容推送过来。
  • server暗示。 和server push不一样的是,server hint并不会主动推送内容,只是告诉有新的内容产生,内容的下载仍是须要客户端主动发起请求。server hint经过X-Subresources header来通知。

HTTP 2.0

  • 客户端向server发送request这种基本模式不会变。
  • 老的scheme不会变,使用http://和https://的服务和应用不会要作任何更改。
  • 使用http1.x的客户端和服务器能够无缝的经过代理方式转接到http2.0 上
  • 不识别http2.0的代理服务器能够将请求降级到http1.x

HTTP 2.0主要改动

新的二进制格式

http 1.x是明文协议,格式由strat line,header,body组成。须要作协议解析来识别这3哥部分,http1.x的解析是基于文本的,而文本格式解析存在自然缺陷,二进制比文本格式更方便且健壮。


http 2.0的格式定义更接近tcp。由Length,Type,Flags,Stream ID,Payload5个部分组成。tcp

  • length定义了整个frame的开始到结束
  • type定义frame的类型
  • flags用bit位定义了一些重要的参数
  • stream id用做流控制
  • payload就是request的正文

链接共享

stream id 做用就是链接共享机制,一个request对应一个stream并分配一个id,这样一个链接上能够有多个stream,每一个stream的frame随机混杂在一块儿,接收方根据stream id将frame再归属到各自不一样的request里面。每一个stream均可以设置优先级和依赖。优化

header压缩

http2.0使用encoder来减小须要传输的header大小,通信双方各自cache一份header fields表,避免重复header传输,减小传输大小。加密

压缩算法选择

SPDY/2使用的是gzip 压缩算法,后来出现BREACHCRIME 2种攻击方式,即便走SSL的SPDY也能够破解内容,http2.0采用HPACK的压缩算法。

重置链接表现

对于http 1.x来讲,是经过设置tcp segment里的reset flag来通知对端关闭链接。http2.0引入RST_STREAM 类型的frame,能够在不断开链接的前提下取消某个request的stream。

流量控制

http2.0 经过相似receive window的作法,数据的接收方经过告知对方本身的flow window大小代表本身还能接收多少数据。只有Data类型的 frame才有流量控制功能。

服务推送

http2.0 经过push的方式将客户端需求的内容预先推送过去,也叫cache push。若是客户端退出,需取消server push,能够经过发送RST_STREAM类型的frame来作到。

Nagle Algorithm/TCP Delayed Ack

Nagle Algorithm/TCP Delayed Ack是一组对立的算法。http2.0能够经过TCP_NODELAY禁用Nagle或TCP_QUICKACK禁用ACK。官方推荐设置TCP_NODELAY

更安全的SSL

HTTP2.0使用了tls的拓展ALPN来作协议升级,除此以外加密这块还有一个改动,HTTP2.0对tls的安全性作了近一步增强

相关文章
相关标签/搜索