🌐 1. HTTP 概述
HTTP(HyperText Transfer Protocol)
- 是一种 基于请求-响应模式 的 无状态 协议。
- 客户端(通常是浏览器)发送请求,服务器处理后返回响应,然后连接关闭。
- 每一次交互都要 重新建立连接(HTTP/1.x)。
- HTTP/1.1 中支持 Keep-Alive,可在短时间内复用连接,但仍是 一次请求一次响应。
- 主要用于 静态/动态页面加载、API 请求 等。
特点:
✅ 简单、成熟、广泛支持
✅ 有中间代理、缓存、负载均衡等完善的配套生态
❌ 无法做到 服务器主动向客户端推送 数据
❌ 高频率交互需要不断发起新的 HTTP 请求,效率低下
🔗 2. WebSocket 概述
WebSocket
- 是一种 全双工(Full-duplex) 、基于 TCP 的协议。
- 设计初衷:解决浏览器和服务器之间实时、低延迟通讯的需求。
- 先通过 HTTP(S) 发起一次握手(upgrade 请求),升级协议为 WebSocket。
- 握手成功后,客户端和服务器之间会 保持长连接,可以双向自由传输数据,直到任意一方关闭连接。
特点:
✅ 一次连接后可持续通信,不需要反复建立/关闭连接
✅ 支持服务器主动向客户端推送消息
✅ 高效、低延迟、节省带宽开销(头部信息比 HTTP 小得多)
❌ 需要服务器和中间件支持 WebSocket 协议(代理、负载均衡需特殊配置)
❌ 连接数量过多时对服务器压力较大(需要合适的架构设计)
🔎 3. 工作方式对比
| 维度 | HTTP | WebSocket |
|---|---|---|
| 连接生命周期 | 一次请求-响应后关闭 | 长连接,持续通信 |
| 通信模式 | 单向:客户端主动发起请求,服务器被动响应 | 双向:客户端和服务器都能主动发消息 |
| 头部开销 | 请求/响应有完整的 HTTP 头部,内容较大 | 握手后头部极小,数据帧简单 |
| 实时性 | 实时性差,需频繁发请求(轮询/长轮询) | 实时性强,消息可即时传达 |
| 适用场景 | 页面加载、REST API、文件下载等 | 聊天室、在线游戏、实时行情、直播弹幕等 |
📡 4. 连接过程
HTTP
- 客户端发送请求
- 服务器处理并返回响应
- 连接关闭(或保持短时连接)
WebSocket
-
客户端通过 HTTP(S) 发起带有
Upgrade: websocket的握手请求:GET /chat HTTP/1.1 Host: server.example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: xxxxx Sec-WebSocket-Version: 13 -
服务器响应 101 Switching Protocols,协议升级完成:
HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: yyyyy -
后续通过此 TCP 连接 自由收发二进制/文本数据帧。
🎯 5. 使用场景
🔵 HTTP:
- 浏览器访问网页
- RESTful API 调用
- 文件上传/下载
- 低频次交互
🟢 WebSocket:
- 聊天应用(微信、Slack 等)
- 实时股票/期货行情
- 多人在线游戏状态同步
- 实时协作(共享文档编辑)
- 直播弹幕
🚦 6. 两者关系
- WebSocket 并不是要“替代” HTTP,而是 补充。
- WebSocket 握手基于 HTTP 完成,因此必须依赖 HTTP/HTTPS 作为初始载体。
- WebSocket 更适合 需要实时、低延迟 交互的场景,HTTP 更适合 一次性或低频次 的请求-响应场景。