概述
HTTP(超文本传输协议)自 1991 年诞生以来,经历了多个版本的演进,从 HTTP/1.0 到 HTTP/3.0,每一次升级都为了解决前一版本的性能瓶颈与网络时代的需求变化。下面我将从特性、性能优化点、技术实现方式和区别角度,系统对比这四个版本。
HTTP/1.0
http1.0最大的特点是非持久连接,它诞生于1996年,这在早期简单的网页应用来说非常实用,简单来说就是一次HTTP请求对应一次TCP连接,在HTTP请求一来一回结束之后,这条TCP连接就会废弃掉,也就是进行四次挥手 但随着网页应用内容逐渐丰富,信息量的增大,打个比方,这种非持久链接的协议就显得力不从心了,所以就有了接下来HTTP1.1的改进
打个比方,连获取一张图片都要去开一个TCP连接,现在的网页一个页面都不知道有多少张图片,这个效率可想而知
HTTP 1.1
解决短链接问题
http1.1的出现就是为了解决HTTP1.0的痛点,也就是它具备了持久连接的功能,多个请求都可以复用一个TCP连接,避免重复建立连接。它的表现是在请求头上加上Conection:keep-alive这么一个请求头。此后多个HTTP请求都可以复用这一个TCP连接,这无疑是极大地提高了效率。
额外的优化
同时http1.1还做了一些额外的优化
- 支持HOST头:允许一个服务器部署多个网站(也就是虚拟主机)
- 支持管道化:允许了多个请求并行发送,这极大提高了网络请求的效率,同时可以处理多个请求,但是对应请求的响应,必须要顺序返回,这就引出了HTTP1.1一个很大的问题:队头阻塞
- 缓存控制:引入了Cache-Control,ETag,If-Modified-Since等字段,这就属于HTTP缓存的部分了,借助CDN,Cookie等
又出现了一些问题
但是在请求量增大的时候,它又开始显现出了一个很致命的问题,那就是队头阻塞
队头阻塞就是多个请求并行发送时,第一个发送出去的请求就必须要第一个接收到响应,否则是不会反映给应用程序的,可以理解成每次发一个HTTP请求就有一个HTTP请求入队,之后处理响应的程序就按照队头的请求进行处理响应,如果第一个请求的响应的传输总是失败,这就意味着由于头部的请求已知没有被处理响应,导致后面的请求即使能够处理响应了,但是还是被第一个请求阻塞住了,这就是队头阻塞的由来
那么接下来HTTP2就会去解决这个问题,它是通过一个叫做帧机制来去解决了这个问题
HTTP2.0
帧机制
核心概念:
| 名称 | 含义 |
|---|---|
| 流(Stream) | 一个独立的双向数据流(表示一次 HTTP 请求/响应对) |
| 消息(Message) | 一次完整的请求或响应,由多个帧组成 |
| 帧(Frame) | HTTP/2 的最小单位,所有通信都由帧构成 |
-
HTTP 请求/响应 会被拆分成一个个 frame(帧);
-
每个帧都有自己的类型(HEADERS、DATA等)和所属的 stream ID;
-
这些帧通过一个 TCP 连接按序发送,帧之间可以交错;
-
比如:
- 请求 A 的 HEADERS 帧 -> 请求 B 的 HEADERS 帧 -> 请求 A 的 DATA 帧 -> 请求 B 的 DATA 帧……
- 这就实现了多个请求/响应交错进行 → 多路复用。
但仔细想想,这其实还是会有队头阻塞问题,不过是TCP层面的,如果TCP窗口内需要的数据包久久没有发送过来,但是后面的数据包发送过来了,这就意味着后面的数据包又是白发。
其它的优化
-
完全二进制协议(Binary Protocol) :相比文本协议,更高效解析与传输。
-
一个连接多路复用(Multiplexing) :多个请求和响应复用一个 TCP 连接,无队头阻塞(HTTP 层面)。
-
头部压缩(HPACK) :通过静态+动态字典压缩头部字段,减少冗余传输。
-
服务器推送(Server Push) :服务端可以提前推送资源给客户端。
-
优先级和依赖机制:可以控制请求/响应的优先级。
HTTP3
为了解决TCP层面的队头阻塞,HTTP3直接将TCP换掉了,直接用了一个新的协议:QUIC,对于这个QUIC协议本篇不做详尽的解释,这里只列举QUIC的一些特性,通过这些特性QUIC就可以很好地解决掉这个TCP的队头阻塞问题
HTTP3特性
-
基于 QUIC(UDP之上的传输协议) :替代 TCP,解决 TCP 的队头阻塞。
-
连接迁移支持:由于基于 UDP 和连接 ID,移动网络下换 IP(如 WiFi 切 4G)时连接不丢失。
-
内建 TLS 1.3 加密:加密集成于 QUIC 协议本身,不再是 TCP 之上加 TLS,握手更快。
-
多路复用:内置支持,彻底消除 HTTP 层和传输层的队头阻塞问题。
-
更快握手:1-RTT 甚至 0-RTT 连接建立。
由于东西太新 HTTP3是2022年发布的,对于一些比较老旧的设备,它的防火墙、CDN、代理对UDP的支持是不那么理想的