HTTP 0.9

背景

诞生最早的传输协议 HTTP 0.9,主要为了学术交流,需求很简单——用来在网络之间传递 HTML 超文本内容,被称为 超文本传输协议

特性

  1. 只传递 HTML 超文本内容
  2. 只有请求行,没有请求头和请求体
  3. 服务器只返回数据,没有返回头信息
  4. 返回文件内容是以 ASCII 字符流来传输

HTTP 1.0

背景

万维网的高速发展带来了很多新的需求,浏览器中不但展示的是HTML文件,还包括js、css、图片、音频、视频…

特性

  1. 引入请求头、响应头、响应体
  2. 支持多种类型的文件传输下载,如 js、css、图片…
  3. 引入浏览器 Catch 机制、状态码、用户代理、基础信息统计
  4. 每次HTTP通信都要建立一次TCP连接

HTTP 1.1

背景

为了解决每次请求都要建立TCP连接,和额外添加了一些其他的功能,来满足当时互联网的发现需要。

特性

  1. 一个TCP连接可以传输多个HTTP请求
  2. HTTP 1.1 默认开启持久连接
  3. 同一域名默认开启6个TCP持久连接
  4. 队头阻塞问题?不成熟的管线化技术(失败告终)
  5. 引入 Cookie,安全机制
  6. 虚拟主机的支持
  7. 动态类容支持特性

HTTP/2

背景

为了解决HTTP 1.1 遗留的问题

  1. TCP慢启动
  2. 多条TCP连接竞争宽带
  3. 队头阻塞问题:一个域名只维持6个TCP连接,超过6个请求就需要等待

    特性

  • 多路复用机制
    • 一个域名只使用一个 TCP 长连接,可以并行发送请求给服务器(引入二进制分帧层实现多路复用)。
  • 二进制传输
    • HTTP1.x根据不同文本做不同解析,由于文本的多样性,考虑的场景必然很多。HTTP 2.0采用二进制 0 or 1 进制传输,着实方便。
  • 服务器推送
    • 服务端会将index.html可能用到的资源,如css、js 一并推送到客户端,省去了资源发起请求,建立连接等操作时间,极大地提升速度。
  • 头部压缩
    • 由于HTTP1.x的header每次请求都会带上大量相同的信息,假设有100请求,如果将100请求头压缩为原来的20%,传输效率得到大幅提升。
    • HTTP2.0可以维护一个字典,差量更新HTTP头部,大大降低因头部传输产生的流量。
  • 设置请求优先级

    • 对于浏览器非常重要的资料,HTTP2.0 提供了设置请求的优先级,服务器收到优先级高的请求会优先处理返回。

      多路复用机制实现

  • 请查看

    HTTP 2.0 缺点

  • HTTP 2.0 虽然解决了 HTTP 1.1 TCP慢启动、多条 TCP连接带宽竞争 和 对头阻塞(应用请求层面的),但是 TCP协议依然存在 数据包级别的对头阻塞问题。这是因为 HTTP 2.0 数据包传输时,如果发生了丢包现象,TCP 连接就会处于暂停状态,等待触发 TCP协议的重发机制,这严重影响了HTTP 2.0 的传输性能;当HTTP 2.0发生了2%的丢包,它的传输效率不及 HTTP 1.1。

HTTP/3

背景

为了解决HTTP 2.0 遗留的问题(HTTP 2.0 缺点

  1. TCP 的对头阻塞
    • 在 TCP 传输过程中,由于单个数据包的丢失而造成的阻塞称为 TCP 上的队头阻塞
    • 当HTTP 2.0发生了2%的丢包率,它的传输效率不及 HTTP 1.1。
  2. TCP 建立连接的延时
    1. 我们把一个数据包从浏览器发送到服务器,服务器返回到浏览器的时间称为 RTT。
    2. 1个 RTT 时间是:浏览器和服务器的物理距离较近时为 10 毫秒内,较远时大约 30 ~ 40 毫秒
    3. 三次握手,消耗大约 1.5 个 RTT
    4. TLS 消耗大约 1 ~ 2 个 RTT
  3. TCP 协议僵化
    1. 中间设备的僵化,如路由器、交换机…,他们很少升级,升级过的TCP协议发送的数据包给到他们,它会因为不认识而丢弃他们。
    2. 操作系统也是导致 TCP 协议僵化的另外一个原因,操作系统都滞后软件的更新。

QUIC 协议

  1. QUIC 协议
    1. 由于设备层的僵化,中间设备只认识 TCP、 UDP,所以选了一个折中方法 UDP,HTTP/3 基于 UDP 实现了:
      • 实现了类似 TCP 的流量控制、传输可靠性等功能(重传、拥塞控制…)
      • 集成了 TLS 加密功能(使用TLS1.3,为了减少握手时 RTT 的个数 )
      • 实现了 HTTP/2 中的多路复用功能 (同一物理连接上可以有多个独立的逻辑数据流(如下图)。实现了数据流的单独传输,就解决了 TCP 中队头阻塞的问题。)

image.png

  1. - **实现了快速握手功能 **(由于 QUIC 是基于 UDP 的,可以快速使用 0~1 RTT 建立连接)

image.png
http 2 和 http 3 协议栈对比图

  1. QUIC 总结:由于是改动了底层协议,UDP 同样存在中间设备僵化,实现大面积使用还有很长的路要走。