跳到主要内容

各版本特性

HTTP 1.0

  • 支持 GET,POST,DELETE,PUT,HEADER 等方式
  • 有请求头和响应头的概念,在通信中指定了 HTTP 协议版本号,以及其他的一些元信息(比如: 状态码、权限、缓存、内容编码)
  • 传输内容格式,图片、音视频资源、二进制等都可以进行传输

问题

  • 无法复用连接。每次发送请求,都需要进行一次 tcp 连接(即 3 次握手 4 次挥手),使得网络的利用率非常低
  • 队头阻塞。HTTP 1.0 规定在前一个请求响应到达之后下一个请求才能发送,如果前一个阻塞,后面的请求也给阻塞的

HTTP 1.1

  • 长连接。新增 Connection 字段,可以设置 keep-alive 值保持连接不断开
  • 管道化。基于上面长连接的基础,管道化可以不等第一个请求响应继续发送后面的请求,但响应的顺序还是按照请求的顺序返回
  • 缓存处理。新增字段 cache-control

问题

  • 虽然管道化,可以一次发送多个请求,但是响应仍是顺序返回,仍然无法解决队头阻塞的问题

HTTP 2

  • 头部压缩
  • 二进制分帧
  • 多路复用。在共享 TCP 链接的基础上同时发送请求和响应
  • 服务器推送。服务器可以额外的向客户端推送资源,而无需客户端明确的请求

头部压缩

由于 HTTP 是无状态的,每一个请求都需要头部信息标识这次请求相关信息,所以会造成传输很多重复的信息,当请求数量增大的时候,消耗的资源就会慢慢积累上去。所以 HTTP 2 可以维护一个头部信息字典,差量进行更新头信息,减少头部信息传输占用的资源。

二进制分帧

HTTP 1.x 的解析是基于文本,HTTP 2 之后将所有传输的信息分割为更小的消息和帧,并对它们采用二进制格式的编码,提高传输效率

多路复用

在共享 TCP 链接的基础上同时发送请求和响应,基于二进制分帧,在同一域名下所有访问都是从同一个 tcp 连接中走,http 消息被分解为独立的帧,乱序发送,服务端根据标识符和首部将消息重新组装起来。