Websocket概念
WebSocket 是一种全双工通信协议(full-duplex),基于 TCP 连接,允许客户端(如浏览器)和服务器之间建立持久化的双向通信通道。
全双工的概念
全双工是指通信系统中双方可以同时发送和接收数据的传输模式。也就是说,数据可以在两个方向上同时双向流动,而不需要轮流或等待对方完成发送。 WebSocket 的全双工(full-duplex)通信是指在单个持久 TCP 连接上,客户端和服务器可以同时独立地发送和接收数据,而无需等待对方完成传输。这不同于 HTTP 的半双工模式(请求-响应轮流)。 WebSocket 基于 RFC 6455(2011 年标准化)实现这一特性,其核心在于利用 TCP 的天然全双工能力,并在应用层添加轻量帧协议。
底层基础:TCP 的全双工特性
1.TCP 本身就是全双工协议:它在连接的两端维护独立的发送和接收缓冲区。
2.一旦 TCP 连接建立,双方可以同时向对方写入数据(send),操作系统和网络栈会独立处理两个方向的流量。 WebSocket 直接复用这个单个 TCP 连接,避免了 HTTP 每次请求都需要新建连接或轮询的开销。
协议升级 http->websocket
1.WebSocket 以标准 HTTP 请求开始(兼容现有基础设施,如代理和防火墙)。
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
2.服务器如果支持,则响应 HTTP 101
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
3.握手完成后,连接“升级”为 WebSocket 协议,底层 TCP 连接保持打开。此后不再使用 HTTP 头,开销极低。
数据传输:帧(Frame)协议实现异步双向发送
握手后,所有数据以帧形式传输(二进制或文本)。
帧结构(简化): FIN 位:表示是否为消息的最后一帧(支持分片大消息)。
Opcode:区分文本帧、二进制帧、控制帧(Ping/Pong、Close)。
Mask 位:客户端发送的帧必须掩码(masking,防止代理缓存中毒),服务器发送的不需掩码。
Payload length + Masking-key + Payload data。
关键点(RFC 6455 Section 5.2):
任何一方可在任何时间发送数据帧(在握手完成且未发送 Close 帧前)。
发送和接收是独立的:一方发送不阻塞接收,操作系统在两个线程/事件循环中处理读写。
这实现了真正的全双工:服务器可以主动“推送”消息给客户端,而无需客户端先请求。
与传统 HTTP 实时方案对比
- 轮询(Polling) :客户端反复请求,半双工、高延迟。
- 长轮询(Long Polling) :服务器挂起响应直到有数据,但仍需多次连接。
- WebSocket:单个连接、低开销、真正同时双向。