首页/协议速查/WebSocket
🔌

WebSocket 全双工长连接

网络协议
服务器主动推送的实时通道:监控面板/远程控制的理想传输。
🧩 核心原理
📈 时序 / 工作过程图
WebSocket 握手与双向通信HTTP 升级握手 → 全双工长连接客户端浏览器服务器设备/网关HTTP Upgrade: websocket101 Switching Protocols双向数据帧(任意方向随时发)一次握手后保持长连接,服务器可主动推送 → 实时监控/远程控制帧结构:FIN+opcode(1文本/2二进制/8关闭)+掩码+长度+载荷
⚙️ 配置 / 使用要点
  1. 客户端:HTTP Upgrade 请求带随机Key
  2. 服务器算 Sec-WebSocket-Accept = base64(SHA1(key+GUID))
  3. 帧解析:按opcode分发文本/二进制/关闭
  4. 客户端掩码:客户端发帧必须掩码(32位)
  5. 断开检测:PING定时器+重连
🛠️ 项目示例
WebSocket 握手响应计算(服务器侧)
// 服务器计算 Accept:
const char* GUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
char input[128];
snprintf(input, sizeof(input), "%s%s", sec_key, GUID);
// accept = base64( SHA1(input) )
// 响应:
// HTTP/1.1 101 Switching Protocols
// Upgrade: websocket
// Connection: Upgrade
// Sec-WebSocket-Accept: <accept>
// 之后双方按帧协议收发,任意方向随时可发
❓ 面试高频
WebSocket和HTTP区别?
HTTP请求-响应单向、每次带头开销;WebSocket一次握手后全双工低开销实时推送
客户端为什么要掩码?
协议规定客户端→服务器帧必须掩码(防缓存投毒历史原因),服务器→客户端不掩码
怎么检测连接断开?
TCP层检测不到静默断开;用PING/PONG心跳+超时判定,或应用层保活消息
✅ 自查清单 (点击勾选,本地保存)
0/0
知道升级握手流程
知道101状态码
知道帧结构与掩码
知道双向实时特性
会心跳保活