WebSocket(WebSock)协议介绍
WebSocket(ws)协议 是一种在单个 TCP 连接上实现全双工(双向)通信的计算机通信协议,专门为浏览器应用提供高效的实时数据交换。它于 2011 年被 IETF 标准化为 RFC 6455,并由 WHATWG 维护为 WebSockets 规范。它解决了传统 HTTP 协议在实时通信场景下的痛点(如短轮询或长轮询的高开销、连接资源浪费),允许客户端和服务器在连接建立后随时双向发送文本或二进制消息,无需每次请求。
工作原理(协议栈)
- 握手阶段(Opening Handshake):使用 HTTP 兼容方式建立连接。
- 数据传输阶段:二进制帧协议(Frame-based),支持文本(UTF-8)和二进制消息。
- 关闭阶段(Closing Handshake):显式关闭连接。
协议升级(Handshake)
- 客户端发送 GET 请求(含 Upgrade: websocket、Connection: Upgrade 等头)。
- 服务器返回 101 Switching Protocols 确认。
示例客户端请求
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== (16 随机 Base64 字节)
Origin: http://example.com
Sec-WebSocket-Version: 13
- 服务器计算
Sec-WebSocket-Accept(SHA-1 + “258EAFA5-E914-47DA-95CA-C5AB0DC85B11” 后 Base64 编码),确认后切换协议。 - 握手成功后,切换到专用二进制帧通信。
数据帧(Data Framing)
- 每个消息由一个或多个帧组成(文本/二进制)。
- 关键字段:opcode(操作码,0x1=文本、0x2=二进制、0x8=关闭、0x9=ping、0xA=pong)、掩码(客户端发送数据时必须)、Payload Length、Extension Data、Application Data。
- 客户端发送时必须掩码(Masking)数据,防止代理/中间设备修改;服务器不掩码。
- 支持分片(Fragmentation)、控制帧(Ping/Pong 用于心跳)。
- 最大 Payload 长度:64KB(可扩展)。
URI与端口
- 非加密:
ws://(端口 80) - 加密(推荐):
wss://(端口 443,TLS 保护) - 语法与通用 URI 类似,无 Fragment。
优势
- 低延迟:全双工,消息无队首阻塞(可监控
bufferedAmount)。 - 高效率:单连接双向,无 HTTP 头重复。
- 兼容:同源策略、Origin 验证、防火墙友好。
- 跨浏览器支持好,适合实时应用(聊天、游戏、股票、IoT)。
应用场景
- 即时聊天(Web 端)
- 实时游戏/多玩家协作
- 股票/仪表盘推送
- IoT 设备通信
- 前端实时更新(如直播)
与 HTTP/2/3 关系:WebSocket 可在 HTTP/2(多路复用 + 二进制帧)或 HTTP/3(QUIC)上运行,提供更高效的底层传输。