giftiaのblog

http 的成长史

· giftia

http1.0

  • 无状态,无连接:每次请求都是独立的,服务器不会记录客户端的状态。
  • 短连接:每次发送请求都需要重新建立 TCP 连接(三次握手),完成后立即断开,导致性能浪费。
  • 无host头域:HTTP/1.0 请求中没有 Host 字段,无法支持同一 IP 地址下的多个域名(虚拟主机)。
  • 不允许断点续传:只能传输整个对象,无法只传输文件的一部分。

http1.1

  • 长连接:默认启用 Connection: keep-alive,允许在一个 TCP 连接上发送多个请求,减少了连接建立的开销。
  • 请求管道化:支持在同一个连接中同时发送多个请求,但服务器仍需按顺序响应,存在队头阻塞问题。
  • 增加缓存处理:引入了 Cache-Control 和 ETag 等字段,优化了缓存管理。
  • 增加Host字段:支持虚拟主机(同一 IP 地址下的多个域名)。
  • 支持断点续传:通过 Range 请求头实现部分内容传输。

http2.0

  • 二进制分帧:将 HTTP 报文分为更小的帧进行传输,客户端和服务器通过帧的标识符重新组装报文。
  • 头部压缩:使用 HPACK 算法对头部进行压缩,客户端和服务器维护一个头部索引表,减少重复头部的传输。
  • 多路复用:在一个 TCP 连接中可以同时处理多个请求,每个请求对应一个独立的流(Stream),解决了 HTTP/1.1 的队头阻塞问题。
  • 服务器推送:服务器可以主动向客户端推送资源,而无需客户端显式请求。

http3.0

  • 基于QUIC协议:QUIC 是 Google 开发的基于 UDP 的传输协议,减少了 TCP 的三次握手和 TLS 握手时间。
  • 解决队头阻塞问题:HTTP/3.0 使用独立的流(Stream),即使某个流丢包,也不会阻塞其他流的传输。
  • 优化了重传策略:重传包和原包的编号不同,降低了重传计算的开销。
  • 连接迁移:使用 64 位随机数标识连接,而不是依赖 TCP 的四元组(IP + 端口),支持客户端在网络切换(如 Wi-Fi 到 4G)时保持连接。
  • 更高效的流量控制:提供更灵活的流量控制机制,提升传输效率。

各版本对比

特性HTTP/1.0HTTP/1.1HTTP/2.0HTTP/3.0
连接方式短连接长连接长连接基于 QUIC 的长连接
数据传输格式文本文本二进制分帧二进制分帧
多路复用不支持不支持支持支持
队头阻塞存在存在TCP 层队头阻塞无队头阻塞
头部压缩不支持不支持支持(HPACK)支持(QPACK)
服务器推送不支持不支持支持支持
传输协议TCPTCPTCPQUIC(基于 UDP)
安全性不安全不安全安全(TLS)安全(TLS)

参考: https://zhuanlan.zhihu.com/p/266578819