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 实现特有缓存机制。

参考内容

相关推荐
要做朋鱼燕10 小时前
【AES加密专题】3.工具函数的编写(1)
笔记·密码学·嵌入式·aes
嵌入式知行合一11 小时前
时间管理方法论
笔记
儒雅的晴天11 小时前
git笔记
笔记·git
半夏知半秋11 小时前
kcp学习-通用的kcp lua绑定
服务器·开发语言·笔记·后端·学习
中屹指纹浏览器12 小时前
指纹浏览器底层沙箱隔离技术实现原理与架构优化
经验分享·笔记
e***985714 小时前
TCP/IP协议栈全解析:从原理到实战
网络·网络协议·tcp/ip
小裕哥略帅14 小时前
PMP知识--五大过程组
笔记·学习
Aliex_git14 小时前
提示词工程学习笔记
人工智能·笔记·学习
0和1的舞者14 小时前
力扣hot100-链表专题-刷题笔记(二)
笔记·算法·leetcode·链表·职场和发展
航Hang*14 小时前
Photoshop 图形与图像处理技术——第9章:实践训练6——滤镜特效
图像处理·笔记·学习·ui·photoshop