当前位置: 首页 > news >正文

HTTP 协议升级(HTTP Upgrade)机制

在这里插入图片描述

概述

简单来说,HTTP 协议升级(HTTP Upgrade) 是一种机制,让客户端和服务器从普通的 HTTP 连接“切换”到另一个协议连接,比如 WebSocket。
详细解释:

  • HTTP 是请求-响应协议:客户端发请求,服务器回应,连接短暂。

  • 有些应用需要持续双向通信,比如 WebSocket,这时候用 HTTP 的升级机制“切换”协议,连接保持,双方都可以主动发消息。

说明

HTTP 协议升级的工作原理

客户端发送 HTTP 请求时,带上 Upgrade 头,表明想把当前的 HTTP 连接升级为别的协议。

服务器收到请求后,检查是否支持升级协议。

如果支持,服务器返回 101 Switching Protocols 状态码,表示同意升级。

连接协议正式切换,后续通信不再是 HTTP,而是升级后的协议(比如 WebSocket)。

WebSocket 协议升级示例

客户端请求头示例:

http
GET /chat HTTP/1.1
Host: example.com
Upgrade: websocket                <-- 请求升级为 websocket 协议
Connection: Upgrade               <-- 表示升级连接
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==    <-- 用于握手校验的随机值
Sec-WebSocket-Version: 13        <-- WebSocket协议版本

服务器响应头示例:

http
HTTP/1.1 101 Switching Protocols  <-- 101状态码,表示切换协议
Upgrade: websocket                <-- 确认升级为 websocket
Connection: Upgrade              <-- 确认升级连接
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=  <-- 根据客户端Key计算的响应值

重点:

HTTP/1.1 101 Switching Protocols <-- 101状态码,表示切换协议
Upgrade: websocket <-- 确认升级为 websocket
Connection: Upgrade <-- 确认升级连接
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk= <-- 根据客户端Key计算的响应值

总结

为什么需要升级?

HTTP 是短连接,适合请求响应场景;WebSocket 是长连接,支持实时双向通信。升级机制让它们能平滑过渡,不需要新开连接。

什么时候需要短连接什么时候需要长连接

项目🔁 短连接(Short Connection)🔄 长连接(Long Connection)
连接方式每次通信建立一次连接,完成后立即断开建立一次连接,长期保持
协议常用类型HTTP/1.0、HTTP/1.1(非 keep-alive)WebSocket、MQTT、TCP Socket
是否保持连接❌ 否✅ 是
通信方向单向,请求-响应双向,任意一方可主动发送
实时性一般,依赖每次连接高,连接建立后可实时通信
适合频率低频,偶尔请求高频,频繁数据交换
连接开销每次连接都要建立/关闭,三次握手开销大一次性建立,后续通信无握手开销
服务端资源消耗资源少,每次请求独立处理资源多,连接需维护(如内存、线程、文件句柄)
连接管理难度简单,连接即用,断开即释放复杂,需要心跳、断线重连等机制
安全性安全性高,连接短,攻击窗口小攻击窗口长,需额外做连接限制
典型应用场景网页加载、API 请求、上传下载、上报数据聊天、音视频、实时游戏、物联网、股票推送

我最近开发的项目都是智能音箱类,需要频繁请求服务器资源,进行连续对话和问答,这种就需要长连接去减小开销。这里我做详细的原理描述,方便理解代码逻辑,实际开发过程中这种应该有芯片厂商去提供完整的底层实现库

http://www.dtcms.com/a/318876.html

相关文章:

  • winform中的listbox实现拖拽功能
  • 基于ubuntu搭建gitlab
  • KDE Connect
  • 一篇文章入门TCP与UDP(保姆级别)
  • 02电气设计-安全继电器电路设计(让电路等级达到P4的安全等级)
  • C语言strncmp函数详解:安全比较字符串的实用工具
  • 合约收款方式,转账与问题安全
  • 怎么进行专项分析项目?
  • 上证50期权持仓明细在哪里查询?
  • C语言(08)——整数浮点数在内存中的存储
  • LINUX-批量文件管理及vim文件编辑器
  • 浅析 Berachain v2 ,对原有 PoL 机制进行了哪些升级?
  • AutoMQ-Kafka的替代方案实战
  • JAVA第六学:数组的使用
  • 【C++】哈希表原理与实现详解
  • 基于langchain的两个实际应用:[MCP多服务器聊天系统]和[解析PDF文档的RAG问答]
  • 智能制造的中枢神经工控机在自动化产线中的关键角色
  • 行业应用案例:MCP在不同垂直领域的落地实践
  • 二叉树算法之【中序遍历】
  • OpenAI重磅发布:GPT最新开源大模型gpt-oss系列全面解析
  • SpringBoot请求重定向目标地址不正确问题分析排查
  • 六类注定烂尾的甲方软件外包必看!这类甲方不要理-优雅草卓伊凡
  • 上门家教 app 用户端系统模块设计
  • 区块链简介
  • C++位图(Bitmap)与布隆过滤器(Bloom Filter)详解及海量数据处理应用
  • java excel转图片常用的几种方法
  • 分布式接口限流与防重复提交实现方案
  • 快速搭建vue3+flask实现一个异物检测项目
  • RP2040下的I2S Slave Out,PIO状态机(四)
  • MT信号四通道相关性预测的Informer模型优化研究