HTTP不同版本之间比较

HTTP版本之间的比较

HTTP协议

HTTP协议(超文本传输协议,HyperText Transfer Protocol),用于提供一种接收和发布HTML页面的方法,默认使用80端口(HTTPS默认使用443端口)。HTTP协议基于TCP连接,因为TCP连接慢启动的特性,所以连接的重用比重新建立连接要好。

HTTP1.0

HTTP1.0是一种无状态,无连接的应用层协议,规定浏览器和服务器保持短暂连接,浏览器每次请求都要断开TCP连接。

HTTP1.0的的两个特点是短连接和队头阻塞(head of line blocking)。

  • 短连接:HTTP1.0短链接指定是浏览器每次请求需要与服务器建立一个TCP新连接。这样每次请求都要经历建立连接,启动和释放连接过程,连接无法复用,这样网络的利用率比较低。
  • 队头阻塞:由于HTTP1.0规定下一个请求必须在前一个请求到达之前才能发送,所以假设前一个请求一直不到达,下一个请求就不发送,同样后面的健康请求也阻塞。

HTTP1.1

HTTP1.1为了解决HTTP1.0的缺点,引入了一些新的特性:

  • 长连接: 允许HTTP设备在事务处理结束后保持TCP连接在打开状态,以便未来的HTTP请求重用现在的连接,直到客户端或者服务器决定将其关闭为止。服务端按照FIFO原则来处理不同请求。
  • Host Header:1.1扩充了请求头Host-Header,1.0版本不支持Host请求字段,导致WEB浏览器无法使用主机头名明确表示访问服务器上的WEB站点,这样无法使WEB服务器在同一个IP地址和端口号上使用不同的主机名来创建多个虚拟的WEB站点。而1.1改变了这个缺陷。
  • 缓存处理:加入了新的字段cache-control,支持断点续传。
  • 请求管道化:基于HTTP1.1的长连接,使得请求管线化成为可能。管线化使得请求能“并行”传输,比如响应主体是一个html页面,页面中包含了许多img,这里keep-alive起了很大的作用,能够“并行发送多个请求”。但是服务器必须按照客户端的先后顺序一次送回相应结果。可见,HTTP1.1还是无法解决队头阻塞(head of line blocking)的问题。同时“管道化”技术存在各种各样的问题,所以很多浏览器要么根本不支持它,要么就直接默认关闭,并且开启的条件很苛刻…而且实际上好像并没有什么用处。实际上比如谷歌浏览器采用另一种做法,允许我们同时打开6-8个TCP连接。
  • 范围请求:可以返回部分内容,响应码206(Partial Content

HTTP2.0

  • 多路复用:

    • 流:已经建立连接上的双向字节流。
    • 消息:与逻辑消息对应的完整的一系列数据帧。
    • 帧(Frame): HTTP2.0通信的最小单位。

    上图可以看出所有的HTTP2.0通信都在一个TCP连接上完成,这个连接可以承载任意数量的双向数据流。每个数据流以消息的形式发送,而消息由一个或者多个帧组成。这些帧可以乱序发送,然后按照stream id重新组装。

    此外,多路复用可能导致关键请求被阻塞,HTTP2.0中每个数据流都可以设置优先级和依赖。

    可以看出,多路复用在一个TCP上进行任意数量的HTTP请求,这个强大的功能则是基于“二进制分帧”的特性。

  • 头部压缩:

    HTTP1.x中,头部元数据都是以纯文本的形式发送的,通常会给每个请求增加500-800字节的负荷。

    比如说cookie,默认情况下,浏览器会在每次请求的时候,把cookie附在header上面发送给服务器。(由于cookie比较大且每次都重复发送,一般不存储信息,只是用来做状态记录和身份认证)

    HTTP2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields表,既避免了重复header的传输,又减小了需要传输的大小。高效的压缩算法可以很大的压缩header,减少发送包的数量从而降低延迟。

  • 服务器推送:

    服务器可以额外向客户端推送资源,无需客户端明确请求。

参考文献

如何优雅的谈论HTTP/1.0/1.1/2.0

HTTP1.0 HTTP1.1 HTTP2.0 主要特性对比

http协议不同版本之间的对比(1.0 1.1 2.0)

HTTP协议几个版本的比较