HTTP 2.0 与HTTP1.1的差别

前面的话

在说HTTP2.0前,先说一说发展到HTTP1.1做了哪些升级。

HTTP1.1的升级

目前使用最广泛的HTTP1.1做了哪些重大升级?

  • 默认长连接。HTTP1.0也提供长连接,但是默认是短连接,要想长连接必须将头部的connection设置为keep-alive。而HTTP1.1默认开启connection:keep-alive,不用设置。
  • 强制设置Host请求首部字段Host字段是HTTP1.1唯一一个强制要求设置的字段。
  • 管线化(pipelining):不同等待响应,就可以发送下一个请求。
  • 缓存处理的扩展:HTTP1.1增加的Cache-control可以控制缓存行为,并且支持断点续传。
  • 带宽优化:HTTP1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了 ,并且不支持断点续传。HTTP1.1增加了range请求头部字段,允许客户端只请求服务器某个对象的一部分资源。返回206状态码表示请求一部分资源成功,否则返回200的状态码,并且返回对象的全部资源。

小结:
在 HTTP/1.1 时代主要增加了:
(1)默认长连接:建立连接后,在一定时间内不会断开,其他请求都可以使用这条连接。
(2)pipelining 管线化:通过这个管道,浏览器的多个请求可以同时发到服务器,但是服务器必须按照客户端请求的先后顺序依次回送相应的结果,以保证客户端能够区分出每次请求的响应内容。

HTTP1.1的瓶颈

HTTP1.1有很多优点,但是其标准会使其成为发展的瓶颈。

  • 队头阻塞(Head of line blocking):虽然HTTP1.1支持管线化,允许一次发起多个请求,但是服务器会按照请求的顺序依次响应。一旦响应某个请求出现了阻塞,那么后面的请求即使已经处理完毕了,仍然需要等待阻塞的请求处理完毕。
  • 多个TCP连接: 虽然http1.1支持管道化,但是很多浏览器根本不支持它。(因为它真的很鸡肋)。HTTP1.1的请求并发还是基于多个TCP连接,但建立tcp连接的本较高,比较耗时。
  • 头部信息冗余,每一次请求都会带上一些相同的首部。头部数据都是以纯文本的形式发送的,通常会给每个请求增加500~800字节的负荷。
  • 请求只能从客户端开始。客户端不能接受除响之外的指令。

SPDY时代

SPDY的出现就是为了消除HTTP1.1协议的瓶颈,它并没有改写HTTP协议, 而是以会话层的形式加入到应用层与传输层之间,控制对数据的流动,但是还是采用HTTP建立通信连接。

SPDY的设计:
HTTP 2.0 与HTTP1.1的差别

使用SPAY协议之后,HTTP协议获得了以下功能:

  • 多路复用(multiplexing):通过单一的TCP连接,可以无限制处理多个HTTP请求。所以请求的处理都在一条TCP连接上完成,因此TCP的处理效率得到提高。解决了(head of line blocking)的问题。

  • 请求优先级(request priorityzation): SPDY不仅可以无限制的并发处理请求,还可以给请求逐个分配优先级顺序。这样重要的请求就会优先响应。

  • header压缩:HTTP1.1的头部是冗余的,SPDY协议会采用合适的压缩算法压缩HTTP请求和响应的首部。这样,通信产生的数据包数量和发送的字节数就更少了。

  • 推送功能(server push):SPDY协议支持服务器主动向客户端推送数据的功能。
    到底推送了什么?比如客户端请求了一个index.html文件,服务器会将客户端所需要的资源伴随index.html文件一起发送给客户端,不必等待客户端请求。

    普通的客户端请求:
    HTTP 2.0 与HTTP1.1的差别
    服务器推送:
    HTTP 2.0 与HTTP1.1的差别

HTTP2.0时代

二进制分帧层

HTTP2.0是SPDY的升级版,它的核心就是在应用层与传输层之间添加一层二进制分帧层HTTP2.0是二进制协议,他采用二进制格式传输数据而不是1.x的文本格式

HTTP2.0设计:
HTTP 2.0 与HTTP1.1的差别
上面的图中清晰的表达了HTTP1.1与HTTP2.0的区别,1.1是以文本格式进行传输,而2.0是将消息分为两个帧(HEADERS与 DATA两种帧类型)来传输。并且每个帧采用二进制编码。 首部信息被封装在HEADERS帧,实体信息则封装在DATA帧中。

  • 帧:这个新协议通信的最小单位。
  • 消息:指HTTP的消息,请求、响应等,由一个或多个帧组成。
  • 流:是连接中的一个虚拟信道,可承载双向的消息(一个或者多个),每个流都有一个唯一的整数标识符。

HTTP2.0功能

与SDPY协议的功能相似:

  • 多路复用:HTTP2建立一个TCP连接,一个连接上面可以有任意多个流,消息分割成一个或多个帧在流里面传输。帧传输过去之后,在进行重组,形成一个完整的请求和响应。

HTTP 2.0 与HTTP1.1的差别

  • 请求优先级:为并发的请求设置优先级,重要的请求会先响应。

  • 压缩头部:HTTP1.x中采用文本格式传输,每个传输会增加500~800字节的开销。每次请求都要带上向cookie、user-agent这样相同的首部。HTTP采用HPACK压缩格式来压缩首部。在浏览器与服务器之间:
    (1) 维护一份相同的静态字典,包含常见的头部名称,以及常见的头部值
    (2) 维护一份相同的动态字典,可以动态的添加内容
    (3) 通过静态Huffman编码对传输的首部字段进行编码

    静态字典(一部分):
    HTTP 2.0 与HTTP1.1的差别
    所以我们在传输首部字段的时候,例如要传输method:GET,我们只要传输静 态字典里面的method:GET对应的索引值就可以,一个字节就搞定了。假如像user-agent、cookie这种静态字典里面只有首部名称而没有值的首部,第一次传输需要在静态字典中加入值,值会采用静态Huffman编码来减小体积。

    第一次传输过user-agent之后,浏览器和服务器就会把它添加到自己的动态字典 中,后续的传输就可以只传输一个索引就行了。

  • 服务器推送:以SPDY一样,支持服务器主动向客户端推送数据的功能。

HTTP1.1的合并请求是否用于HTTP2.0

答案是:没有必要。
HTTP2.0采用多路复用,一个TCP连接可以 并行传输多个请求,并且HTTP消息都分解为互不依赖的帧来传输,经典的队头阻塞的问题解决了。而HTTP1.1合并请求的原因也是为了防止过多的HTTP请求带来的阻塞问题。现在HTTP2.0已经可以解决这问题,所有合并请求就没有必要了。

总结

HTTP1.0

  • 无状态、无连接

HTTP1.1

  • 持久连接
  • 管线化
  • 增加缓存处理(如cache-control)
  • 增加Host字段、支持断点续传

HTTP2.0

  • 二进制分帧层
  • 多路复用
  • 头部压缩
  • 请求优先级
  • 服务器推送

参考文章: