HTTP/1.X

HTTP/1.0

HTTP/1.0 是无状态且无连接的协议:

  • 无连接:浏览器每次请求都需要建立 TCP 连接,服务器每次处理完请求后立即断开连接;
  • 无状态:服务器不跟踪不记录请求的过程;

    无状态可以通过 Cookie 或者 Session 机制来解决。

无连接会导致两个问题:连接无法复用和队头堵塞(head of line blocking)。

  • 连接无法复用:每次发送请求时,需要进行一次 TCP 连接然后释放。这种无连接的特性会导致网络的利用率极低。
  • 队头阻塞:因为 HTTP/1.0 规定下一个请求必须在前一个请求的响应到达之后才能发送。如果上一个请求的响应一直不到达,那么下一个请求就永远无法发送,导致后面的请求阻塞。

HTTP/1.1

HTTP/1.1 相比 HTTP/1.0 的改进点:

  • 新增请求方式:PUTDELETEOPTIONSTRACECONNECT

  • 支持长连接:即 TCP 连接默认不关闭,可以被多个请求复用,并且支持同时打开多个 TCP 请求。请求和响应报文中都会包含 Connection 头,表示客户端和服务器通信时对于长连接如何处理。

    Connection: keep-alive:默认值,表示保持长连接。
    Connection: close:客户端或服务器想要断开长连接,当前使用的长连接会在请求处理结束后关闭。客户端进行新的请求需要创建新的 TCP 连接。
    对于同一个域名,大多数浏览器只支持同时建立 6 个TCP长连接。

  • 管道机制:在同一个 TCP 连接上可以传送多个 HTTP 请求和响应,但是服务器必须按照客户端请求的先后顺序发送响应结果。管道机制将先进先出的队列机制从客户端(请求队列)迁移到了服务器(响应队列)。

    虽然 HTTP/1.1 使用了管道机制,但是服务器仍然需要按顺序返回响应内容,所以仍存在“队头阻塞”问题。

HTTP/2.0

HTTP/2.0 的新特性主要包含:二进制分帧层、多路复用、首部压缩和服务器推送。

使用 HTTP/2.0 时,HTTP 同一时间内的最大连接数量由服务器和客户端之间协商,默认为 100。

HTTP/2.0 涉及到帧、流和消息三种新概念:

  • 帧:HTTP/2.0 中数据通信的最小单位消息,来自不同数据流的帧可以交错发送,然后再根据每个帧头的数据流标识符重新组装。
  • 流:连接中存在的一个虚拟通道。流可以承载双向消息,每个流都有一个唯一标识符和可选优先级信息。
  • 消息:是和逻辑请求或响应对应的完整的一系列帧。

二进制分帧层

在二进制分帧层中, HTTP/2.0 会将所有传输的信息分割为更小的消息(message)和帧(frame),并对它们采用二进制格式的编码 ,其中 HTTP/1.x 的首部信息会被封装到 HEADERS frame,而相应的请求首部信息被封装到 DATA frame。
image.png

多路复用

HTTP/2.0 中的一个 TCP 连接中可以承载任意数量的双向数据流,即单个连接中实现了多流并行。数据流以消息的形式发送,消息由一个或者多个帧组成,多个帧则可以乱序发送,再根据每个帧的首部流表示重新组装。image.png
多路复用的优点:

  • 同个域名只需要占用一个 TCP 连接,消除了因多个 TCP 连接而带来的延时和内存消耗。
  • 单个连接上可以并行交错地请求和响应,之间互不干扰。
  • 在 HTTP/2.0 中,每个请求都可以带一个 31bit 的优先值,0 表示最高优先级, 数值越大优先级越低。有了这个优先值,客户端和服务器就可以在处理不同的流时采取不同的策略,以最优的方式发送流、消息和帧。

服务器推送

HTTP/2.0 在客户端请求一个资源时,会把相关的资源一起发送给客户端,客户端就不需要再次发起请求了。例如客户端请求 page.html 页面,服务端就把 script.js 和 style.css 等与之相关的资源一起发给客户端。
image.png

首部压缩

HTTP/1.1 的首部带有大量信息,而且每次都要重复发送。

HTTP/2.0 要求客户端和服务器同时维护和更新一个包含之前见过的首部字段表,从而避免了重复传输。

不仅如此,HTTP/2.0 也使用 Huffman 编码对首部字段进行压缩。
image.png

HTTP/2.0 和 HTTP/1.X 的区别

  • HTTP/1.X 基于文本的,传输是一个整体。HTTP/2.0 基于二进制流,分解为独立的帧,交错发送。
  • HTTP/1.X 按照请求发送的顺序返回响应。HTTP/2.0 多路复用可以不按顺序响应。
  • HTTP/1.X 将同一个页面的资源分散到不同域名下,获取资源需要开启多个 TCP 连接。HTTP/2.0 同域名下所有通信都在单个 TCP 连接上完成。
  • HTTP/1.X 单个 TCP 连接在同一时刻只能处理一个请求,即两个请求的生命周期不能重叠。HTTP/2.0单个 TCP 同一时刻可以发送多个请求和响应。

参考

  1. HTTP/1.0、1.1、2.0 协议的特性及区别
  2. 如何优雅的谈论 HTTP/1.0/1.1/2.0
  3. 深入理解 http/1.x、http/2 和 https