HTTP(Hypertext Transfer Protocol)是用于传输超文本的协议。各版本的主要区别体现在性能优化、数据传输方式以及支持的功能上。
每一次协议的更新都是对旧协议的改进:
1. HTTP1.0
发布于1996年
- 无连接(Connectionless):每次请求都会建立一个新的 TCP 连接,请求完成后关闭连接。
- 无状态(Stateless):服务器无法保存请求间的上下文信息。
- 单请求:一次请求只能获取一个资源,无法同时请求多个资源。
局限性:
- 建立和关闭连接成本高,延迟大。
- 每次请求都会重新建立 TCP 连接,浪费带宽。
- 没有明确的缓存控制机制,依赖响应头中的
Expires
。
2. HTTP1.1
发布于1997年
- 长连接(Persistent Connection):默认启用
Connection: keep-alive
,在一个 TCP 连接中可以发送多个请求,减少连接建立和关闭的开销。 - 管道化(Pipelining):支持在同一个连接中同时发送多个请求,但服务器必须按顺序响应,存在“队头阻塞”(Head-of-line blocking)问题。
- 更好的缓存支持:引入了
Cache-Control
和ETag
,提供了更灵活的缓存机制。 - 分块传输编码(Chunked Transfer Encoding):支持动态生成内容时分块传输,不需要提前知道响应体大小。
- 新增方法和状态码:新增 HTTP 方法如
PUT、DELETE、OPTIONS、TRACE
。新增状态码如100
Continue、206
Partial Content。 - 虚拟主机支持:使用
Host
字段支持一个服务器托管多个域名。
局限性:
- 存在队头阻塞。
- 单个 TCP 连接的性能受限,适合并发量较低的场景。
3. HTTP2.0
在HTTP/1.x中,数据是以文本形式传输的,而在HTTP/2中,所有的通信数据都被封装成了二进制格式的帧(Frame)。这也是实现多路复用最根本的原因。
发布于2015年
- 二进制分帧(Binary Framing):HTTP/2 将所有数据分为二进制帧(Frame),实现数据传输的流(Stream)化。二进制格式更高效,解析速度快。
- 多路复用(Multiplexing):在一个 TCP 连接中同时发送多个请求和响应,无需按顺序等待,解决了 HTTP/1.x 的队头阻塞问题。
- 头部压缩(Header Compression):使用 HPACK 算法压缩头部,减少传输数据量,特别适合重复头部(如 User-Agent)的请求。
- 服务器推送(Server Push):服务器可以主动将资源(如 CSS、JS 文件)推送到客户端,减少请求的往返次数。
- 流优先级:客户端可以为流设置优先级,优化资源加载顺序。
4. HTTP 3.0
HTTP 3.0第一个草案于2020年发布。它是 HTTP 2.0的建议继承者。它使用 QUIC
代替 TCP 作为底层传输协议,从而消除了传输层中的 队头阻塞(Head of Line Blocking, HOL)
QUIC 是基于 UDP 的。它在传输层将流作为一等公民引入。QUIC 流共享相同的 QUIC 连接,因此不需要额外的握手和缓慢启动来创建新的 QUIC 流,但 QUIC 流是独立交付的,因此在大多数情况下,影响一个流的数据包丢失不会影响其他流。
简单来说,QUIC协议就是基于UDP重新实现了一遍HTTP2的特性。
用一个等式来描述就是 QUIC = UDP + TLS + HTTP2
🔍QUIC 协议详解
🔍说说 HTTP1.0/1.1/2.0 的区别?
🔖更多阅读:
🔍HTTP请求中的安全性和幂等性
🔍OPTIONS 预检请求是什么?
🔍什么是 DNS?DNS 的三种查询方式?