websocket握手是单向协议升级而非双向同步,客户端发起http升级请求,服务器返回101状态码即完成切换;sec-websocket-key/accept用于防伪验证,非同步信号;数据传输全程异步,仅关闭连接时需双向确认。

WebSocket 的同步握手机制,本质不是“双方协商时间”或“等待对方确认后才发数据”,而是通过一次标准 HTTP 升级请求 + 响应完成协议切换,之后通信即进入全双工、无同步依赖的实时状态。真正需要同步的,只发生在连接建立和关闭这两个边界时刻。
握手是单向升级,不是双向协商
客户端发起 GET 请求,携带 Upgrade: websocket 和 Connection: Upgrade 头,表明“我想把这条已建立的 TCP 连接,从 HTTP 切换为 WebSocket”。服务器收到后,若支持且校验通过(如验证 Sec-WebSocket-Key),就返回 HTTP/1.1 101 Switching Protocols ——这不是“我同意了,现在开始同步”,而是“协议已切换,连接现在就是 WebSocket 了”。此时双方无需再互相确认,即可立即发送首帧数据。
Sec-WebSocket-Key/Accept 是防伪造,不是同步信号
客户端生成随机 Base64 密钥(如 dGhlIHNhbXBsZSBub25jZQ==),服务端将其与固定 magic string 258EAFA5-E914-47DA-95CA-C5AB0DC85B11 拼接,SHA-1 哈希后再 Base64 编码,得到 Sec-WebSocket-Accept 值返回。这个过程目的只有一个:证明服务端确实收到了原始请求、没有被中间人篡改,并非用于协调收发节奏。只要 Accept 值匹配,客户端就知道握手有效,可放心后续通信。
WebSocket 8.18.2 是该协议规范的一个重要迭代版本,主要优化了连接稳定性与数据传输效率。它通过全双工通信机制,允许客户端与服务器在单一长连接上实时交换数据,大幅降低传统 HTTP 轮询的开销。该版本增强了心跳保活、自动重连及二进制帧传输能力,适用于即时通讯、在线游戏及金融行情推送等低延迟场景,为开发者提供更可靠的实时网络交互基础。
数据传输阶段完全异步,不依赖 ACK 同步
连接建立后,client 和 server 可随时独立发送 WebSocket 帧(文本或二进制),无需等待对方“准备好”或“回一个确认”。TCP 层本身负责底层可靠传输(含丢包重传、顺序保证),WebSocket 帧层不定义应用级 ACK 机制。也就是说:
- client 发一帧,server 收到即处理,不需 client 等待“已接收”通知;
- server 同时也能主动推一帧,client 收到即响应,也不需 server 先等 client 空闲;
- 双方各自维护自己的发送队列和接收缓冲区,速率由自身逻辑控制。
关闭连接才需显式双向确认
当任一方调用 close(),会先发一个 WebSocket 关闭帧(opcode=8),对方收到后应回一个关闭帧作为响应,然后各自关闭底层 TCP 连接。这一步是唯一要求“你关了,我确认关”的同步环节,对应 TCP 四次挥手。但注意:它只作用于连接终结,不影响正常通信期间的数据流节奏。










