HTTP 0.9
背景
诞生最早的传输协议 HTTP 0.9,主要为了学术交流,需求很简单——用来在网络之间传递 HTML 超文本内容,被称为 超文本传输协议
特性
- 只传递 HTML 超文本内容
- 只有请求行,没有请求头和请求体
- 服务器只返回数据,没有返回头信息
- 返回文件内容是以 ASCII 字符流来传输
HTTP 1.0
背景
万维网的高速发展带来了很多新的需求,浏览器中不但展示的是HTML文件,还包括js、css、图片、音频、视频…
特性
- 引入请求头、响应头、响应体
- 支持多种类型的文件传输下载,如 js、css、图片…
- 引入浏览器 Catch 机制、状态码、用户代理、基础信息统计
- 每次HTTP通信都要建立一次TCP连接
HTTP 1.1
背景
为了解决每次请求都要建立TCP连接,和额外添加了一些其他的功能,来满足当时互联网的发现需要。
特性
- 一个TCP连接可以传输多个HTTP请求
- HTTP 1.1 默认开启持久连接
- 同一域名默认开启6个TCP持久连接
- 队头阻塞问题?不成熟的管线化技术(失败告终)
- 引入 Cookie,安全机制
- 虚拟主机的支持
- 动态类容支持特性
HTTP/2
背景
为了解决HTTP 1.1 遗留的问题
- 多路复用机制
- 一个域名只使用一个 TCP 长连接,可以并行发送请求给服务器(引入二进制分帧层实现多路复用)。
- 二进制传输
- HTTP1.x根据不同文本做不同解析,由于文本的多样性,考虑的场景必然很多。HTTP 2.0采用二进制 0 or 1 进制传输,着实方便。
- 服务器推送
- 服务端会将index.html可能用到的资源,如css、js 一并推送到客户端,省去了资源发起请求,建立连接等操作时间,极大地提升速度。
- 头部压缩
- 由于HTTP1.x的header每次请求都会带上大量相同的信息,假设有100请求,如果将100请求头压缩为原来的20%,传输效率得到大幅提升。
- HTTP2.0可以维护一个字典,差量更新HTTP头部,大大降低因头部传输产生的流量。
设置请求优先级
-
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 缺点)
- TCP 的对头阻塞
- 在 TCP 传输过程中,由于单个数据包的丢失而造成的阻塞称为 TCP 上的队头阻塞
- 当HTTP 2.0发生了2%的丢包率,它的传输效率不及 HTTP 1.1。
- TCP 建立连接的延时
- 我们把一个数据包从浏览器发送到服务器,服务器返回到浏览器的时间称为 RTT。
- 1个 RTT 时间是:浏览器和服务器的物理距离较近时为 10 毫秒内,较远时大约 30 ~ 40 毫秒
- 三次握手,消耗大约 1.5 个 RTT
- TLS 消耗大约 1 ~ 2 个 RTT
- TCP 协议僵化
- 中间设备的僵化,如路由器、交换机…,他们很少升级,升级过的TCP协议发送的数据包给到他们,它会因为不认识而丢弃他们。
- 操作系统也是导致 TCP 协议僵化的另外一个原因,操作系统都滞后软件的更新。
QUIC 协议
- QUIC 协议
- 由于设备层的僵化,中间设备只认识 TCP、 UDP,所以选了一个折中方法 UDP,HTTP/3 基于 UDP 实现了:
- 实现了类似 TCP 的流量控制、传输可靠性等功能(重传、拥塞控制…)
- 集成了 TLS 加密功能(使用TLS1.3,为了减少握手时 RTT 的个数 )
- 实现了 HTTP/2 中的多路复用功能 (同一物理连接上可以有多个独立的逻辑数据流(如下图)。实现了数据流的单独传输,就解决了 TCP 中队头阻塞的问题。)
- 由于设备层的僵化,中间设备只认识 TCP、 UDP,所以选了一个折中方法 UDP,HTTP/3 基于 UDP 实现了:
- **实现了快速握手功能 **(由于 QUIC 是基于 UDP 的,可以快速使用 0~1 个 RTT 建立连接)
http 2 和 http 3 协议栈对比图
- QUIC 总结:由于是改动了底层协议,UDP 同样存在中间设备僵化,实现大面积使用还有很长的路要走。