HTTP 协议发展整理

每次发展都是在优化和解决上一代协议存在的问题,并拓展新功能。

HTTP/0.9(1991 年)

HTTP/0.9 是最初的版本,功能非常简单:

  • 只能请求页面:规定服务器只能发送 HTML 和字符串。
  • 单一请求方法:只支持 GET 请求。
  • 无状态码:没有状态码和错误处理机制。
  • 无头部信息:请求和响应都没有头部字段。

HTTP/1.0(1996 年)

HTTP/1.0 是第一个广泛使用的版本,引入了多项重要特性:

  • 支持多种内容类型 :通过 Content-Type 头部增加了图像、视频、二进制文件的传输。
  • 新增请求方法 :支持 POST 和 HEAD 请求。
    • HEAD:仅返回响应头部,不返回响应数据。
  • 引入缓存机制 :通过 ExpiresLast-Modified 等头部实现缓存。
  • 引入状态码:如 200(成功)、404(未找到)、500(服务器错误)等。

存在问题

  • TCP 连接只服务于单次数据发送:每次请求都需要建立新的 TCP 连接,请求完成后立即断开,导致需要频繁连接和中断,性能开销大。

HTTP/1.1(1997 年标准化)

HTTP/1.1 是 HTTP/1.0 的改进版本,解决了 1.0 的主要问题并引入了多项新特性。

  • 支持持久连接 :使 TCP 连接可以多次复用,解决了 HTTP/1.0 频繁建立连接的问题。通过 Connection: keep-alive 头部控制连接复用。
  • 引入管道机制:允许多个请求同时发送,不必等待上个请求结果返回。但服务端仍按顺序返回请求,还是会存在队头阻塞问题。后续浏览器仅支持了 4-8 个并发连接。
  • 断点续传和分块传输 :支持 RangeContent-Range 头部,可以按照对应文件块进行发送。完成响应 200 OK,未完成响应 206 Partial Content
  • 引入 Cookie 头部字段:新增 Cookie 字段,解决无状态协议下的用户登录状态缓存问题。
  • 新增请求方法
    • PUT:更新资源。
    • PATCH:部分更改资源,类似于部分版的 PUT。
    • DELETE:删除指定资源。
    • OPTIONS:询问服务器支持的请求方法、请求类型、请求头,用于 CORS 预检请求。

HTTP/2(2015 年标准化)

HTTP/2 是对 HTTP/1.1 的重大改进,主要解决性能问题。

  • 二进制分帧 :在应用层和传输层之间新增了二进制分帧层,采用二进制提高数据处理速度,将传输信息分帧,并使用二进制编码进行封装。

帧分为头信息帧数据帧

  • 多路复用
    • 允许同时发起多个请求,且无需按顺序返回,解决了 HTTP/1.1 的管道机制问题。
    • 每个请求/响应构建成数据流,每个数据流分成许多二进制帧,二进制帧通过 stream_id 区分自己属于哪个数据流。这样只需要通过单个 TCP 连接就可以传输所有请求数据,避免了队头阻塞的问题,实现并行传输,绕过浏览器的连接数限制
  • 头部压缩:使用 HPACK 算法,客户端和服务器同时维护一张头信息表,在互相发送时只传递表字段索引号,减少数据重复传输的成本。头信息通过 gzip 压缩后再发送。
  • 服务端推送支持:支持服务器主动推送资源到客户端,减少客户端请求次数。主要用于推送静态资源,如 CSS、JavaScript 等。

注意 :这里的服务端推送不是指 SSE(Server-Sent Events),SSE 实际是基于 HTTP/1.1 的技术,这里指的是 Server Push 技术,配合 Push Cache 可以实现特有的缓存机制,浏览器请求文件时,服务器会把相关的文件也推送给客户端,后续客户端发起请求时,会检查 memory、disk,如果都没有命中检查 Push Cache,命中后会直接读取,在 Chrome Dev Tools NetWork 中 Initiator 会显示 Push,Size 会显示 Push Cache。Push Cache 可以通过 nginx 开启。

HTTP/3(2022 年标准化)

HTTP/3 是基于 QUIC 协议的 HTTP 版本,主要解决传输层的问题。

  • QUIC 协议(Quick UDP Internet Connections):QUIC 是基于 UDP 的传输协议,解决了 TCP 传输层协议的问题。
  • 解决 TCP 层队头阻塞问题
    • TCP 协议单个连接内丢包时,会触发重传机制,阻塞同个连接后面的请求。
    • QUIC 支持同时运行多个数据流,数据流丢包只会阻塞当前数据流,不会影响其他流。
  • 缩短连接时间 :不存在三次握手,第一个包就可以包含业务数据,使用 DH(Diffie-Hellman)密钥交换算法(Diffie-Hellman)。
  • 连接迁移
    • 不受四元组影响:客户端IP、客户端Port、服务端IP、服务端Port
    • 四元组其中一个变化后,连接不会异常,仍然可以保持正常连接。使用 64 位随机数 Connection ID 进行连接操作,网络变化后仍稳定。
  • 前向纠错(FEC):通过数据和额外信息进行发送,在单个包出错时,会通过其他包和 FEC 推算出出错包的数据来进行纠错,进行恢复操作。

思考

1. 为什么现在大部分流行的还是 HTTP/2 协议,或者是说 2021 年左右才开始普及?

在企业级项目中,技术选型通常优先考虑稳定性和生态成熟度。

虽然 HTTP/2 在 2015 年已完成标准化,并且浏览器端很早就支持,但由于服务端基础设施升级成本、工程实践复杂度和 HTTP/1.1 足够用的特性,通常不会随意升级 HTTP 协议。

在 2020 年后,云厂商与 CDN 逐步将 HTTP/2 设为默认选项,在后续部署成本显著降低。

加之 HTTP/3 的出现,突显了 HTTP/2 技术成熟与稳定,HTTP/2 才在近几年成为企业项目中的主流协议选择。

总结

  • HTTP/0.9:最初版本,只支持 GET 请求,只能传输 HTML。
  • HTTP/1.0:引入多种内容类型、缓存、状态码,但存在频繁建立连接的问题。
  • HTTP/1.1:支持持久连接、管道机制、断点续传、Cookie,但仍存在队头阻塞问题。
  • HTTP/2:二进制分帧、多路复用、头部压缩,解决了应用层队头阻塞问题。
  • HTTP/3:基于 QUIC 协议,解决传输层队头阻塞问题,支持连接迁移、前向纠错。

演进方向

  • 性能优化:从单次连接到持久连接,从串行到并行传输。

    • HTTP/0.9:单次连接,每次请求都需要建立新的 TCP 连接。
    • HTTP/1.0:单次连接,请求完成后立即断开。
    • HTTP/1.1:支持持久连接(Connection: keep-alive),TCP 连接可以多次复用,同时引入管道机制,允许多个请求同时发送(但仍存在队头阻塞)。
    • HTTP/2:多路复用,通过单个 TCP 连接传输所有请求数据,实现并行传输。
    • HTTP/3:基于 QUIC 协议,支持多数据流并行传输,解决传输层队头阻塞。
  • 传输效率:从文本协议到二进制协议,从重复传输到头部压缩。

    • HTTP/0.9 - HTTP/1.1:文本协议,头部信息重复传输。
    • HTTP/2:二进制分帧,采用二进制编码提高数据处理速度,头部压缩(HPACK 算法),通过索引表减少重复传输。
  • 功能扩展:从简单请求到支持缓存、Cookie、断点续传等。

    • HTTP/0.9:只支持 GET 请求,只能传输 HTML。
    • HTTP/1.0:引入缓存机制(ExpiresLast-Modified)、状态码。
    • HTTP/1.1:引入 Cookie 头部字段、断点续传(RangeContent-Range)、新增 PUT、PATCH、DELETE、OPTIONS 请求方法。
    • HTTP/2:服务端推送支持(Server Push),配合 Push Cache 实现特有缓存机制。

参考内容

相关推荐
love530love2 小时前
【笔记】ComfyUI 启动时端口被占用(PermissionError [winerror 10013])解决方案
人工智能·windows·笔记·stable diffusion·aigc·端口·comfyui
YJlio2 小时前
DiskView 学习笔记(13.3):用扇区视图看磁盘——热点盘块、碎片与健康排查
java·笔记·学习
QT 小鲜肉2 小时前
【Linux命令大全】001.文件管理之mdu命令(实操篇)
linux·运维·服务器·chrome·笔记·microsoft
im_AMBER2 小时前
数据结构 14 【复习】二叉树中序遍历 | 线索二叉树 | 树、森林、二叉树的转换 | 层次遍历二叉树
数据结构·笔记·学习·算法
im_AMBER2 小时前
Leetcode 88 K 和数对的最大数目
数据结构·c++·笔记·学习·算法·leetcode
代码猪猪傻瓜coding3 小时前
IEEE 模版 作者传记间距过大问题
笔记
小龙3 小时前
大模型训练全流程学习笔记
笔记·学习·ai·大模型
全栈游侠3 小时前
GT2933触摸驱动分析 - 初始化(续)
linux·笔记
hetao17338373 小时前
2025-12-25~26 hetao1733837的刷题记录
c++·笔记·算法