HTTP/0.9

早期版本,该版本实现较为简单,用于访问站点资源。随万维网的发明而诞生,也被叫做单行(one-line)协议。

  • 仅支持 GET 请求,请求格式为 GET 后跟随 URL 来获取对应资源。且响应体则为纯文本格式,不支持图片传输。

    • Request

      GET /ping
      
    • Response

      <html>
      	<p>Hello, world</p>
      </html>
      
  • 且没有 Header 概念。

  • 无法复用连接(服务端响应后即关闭 TCP 链接)

HTTP/1.0

对请求和响应的元信息进行了扩展,客户端和服务端有更多的获取当前请求的所有信息,进而更好更快的处理请求相关内容。

  • 添加了 POSTHEADER 等请求方式。
  • 协议版本信息现在会随着每个请求发送。
  • 状态码会在响应时发送,通过标准化的状态码可以使浏览器更好的理解请求的执行状态,并调整行为(例如浏览器一般都会自动处理 301 和 302)。
  • 出现了请求头(Request Header)和响应头(Response Header)概念,允许传输元数据使协议更加灵活(例如通过 Content-TypeAccept 来表达期望的行为)。
    • Request

      POST /login HTTP/1.0
      Content-Type: application/json
      Accept: application/json
      
      {
        "username": "xxx",
        "password": "xxx"
      }
      
    • Response

      HTTP/1.0 200 OK
      Content-Type: application/json
      Set-Cookie: token=xxxx
      
      {
      	"token": "xxx"
      }
      
    • 通过 Content-Type 头,使协议具备了传输非文本内容的能力。

HTTP/1.1

该版本完善了 HTTP 协议的基本功能并优化了传输效率,是至今最流行的版本。

  • 引入了持久连接(Persistent connection),即 TCP 连接默认不关闭,可以被多个请求复用,不用声明 Connection: keep-alive(长时间不活动会被自动关闭,客户端可以通过 Connection: close 来主动关闭)。

  • 引入了管道机制(Pipelining),同一个 TCP 连接中客户端可以同时发送多个请求,但响应时需按顺序返回。

  • 支持响应分块,通过 Transfer-Encoding: chunked 标识响应将由数量未知的数据块组成,当收到一个大小为 0 的块时,表示数据发送完成。

    HTTP/1.1 200 OK
    Content-Type: text/plain
    Transfer-Encoding: chunked
    
    25
    This is the data in the first chunk
    
    1C
    and this is the second one
    
    3
    con
    
    8
    sequence
    
    0
    
  • 新增了 PUTPATCHDELETEOPTIONSTRACECONNECT 等请求方式。

  • 添加了 Host 字段,支持将请求发往同一台服务器的不同网站。

HTTP/2

HTTP/2 基于 SPDY 建立,极大的优化传输效率。

  • HTTP/2 将所有传输的信息分割为更小的消息和帧,并采用二进制编码提高传输效率。

    file

  • 在复用 TCP 连接的同时,允许乱序发送和接受通过标识符和 Header 将消息组装起来,优化队头阻塞问题(HTTP 场景)。

  • 支持 Header 压缩,避免重复传输 Header 引发的流量开销。

    file

  • 支持服务端端推送,避免用户需要拿到 html 文件后,才能解析其中包含的 js、css、多媒体资源,阻塞其他资源的获取。若浏览器存在该资源的缓存,可以通过发送 RST_STREAM 帧拒绝接受。

HTTP/3

HTTP/3 基于 QUIC 建立,对原有结构做出了较大的革新。QUIC 实现了基于 UDP 的可靠传输、数据包重传、拥塞控制、TLS 加密(TLS 1.3)、多路复用。

  • 替换 TCP、TLS 为 UDP、QUIC,通过更换 TCP 为 UDP 的方式,优化队头阻塞、减少握手延迟。

    file

  • 支持连接迁移,切换网络环境(例如从 WIFI 切到 4G 流量)后无需重建连接。

References

Head-of-Line Blocking in QUIC and HTTP/3: The Details

HTTP 的发展 - HTTP | MDN

HTTP/2 头部压缩技术介绍