浅谈WebSocket - 指南
浅谈WebSocket
在我们日常访问一些网站的时候,我们会点击某个页面,或是点击某个板块,才出现对应的信息。
但是后端有数据更新了,大家需要查看实时的数据的话,此时,需要刷新操作,来重新获取后端返回的数据。
一些普通的网站还好,像一些实时性较强的,比如一些网页游戏、股票网站之类的,难道我们想获取数据,就一直刷新页面吗?显然是不适合的!所以为了处理该问题,WebSocket协议应运而生。
什么是WebSocket协议?
WebSocket是一种在单个TCP连接上进行全双工通信的协议,它由HTML5规范定义,允许客户端和服务器之间
进行双向、实时、低延迟的数据交换。
与传统的HTTP不同,HTTP是客户端发出请求,服务端做出相应,一问一答是形式,而WebSocket在建立连接后,客户端和服务器许可任意时刻互相发送数据,而无需重复建立连接,极大程度下,减少了通信开销。
那么要是WebSocket没有出现之前,没有办法构建实时通信了吗?
显然不是,还是有一些办法的,比如:
1.轮询(polling):客户端定时发送服务器发送请求,询问是否有新数据
连接超时就是2.长轮询(Long polling):客户端发送请求后,服务端保持长时间连接直到有新数据或
3.SSE(Server-Sent-Events):服务器主动单向发送数据到客户端,但仅拥护文本
WebSocket的连接建立:握手过程
WebSocket连接建立始于一个HTTP升级请求,该过程称之为"握手"。
1.客户端发起请求
客户端通过HTTP发送一个包括特殊请求头信息的请求
举例:
Java |
Upgrade : websocket:表示希望升级到WebSocket协议
Connection : Upgrade:表示当前连接必须升级
Sec-WebSocket-Key:客户端随机生成的Base64的编码字符串,用于安全验证
Sec-WebSocket-Version:表示WebSocket当前的版本
Origin:请求来源
2.服务端响应握手
如若,服务端支持WebSocket,会返回一个101状态码
Java |
其中的Sec-WebSocket-Accept 是服务器根据客户端的Sec-WebSocket-Key计算得出来的值
计算方式为:
- 将 Sec-WebSocket-Key与某一固定字符串258EAFA5-E914-47DA-95CA-C5AB0DC85B11 拼接。
- 对拼接结果进行 SHA-1 哈希。
- 将哈希结果进行 Base64 编码。
握手成功后,TCP连接将不再传输HTTP数据,而是进入WebSocket通信模式。
WebSocket的报文格式
通过WebSocket数据以“帧”(Frame)形式传输,一个消息能够由多个帧组成,每个帧都有固定的二进制结构
如图所示:

图片来源:https://www.timefly.cn/learn-websocket-protocol-2/
字段解释:
字段 | 长度 | 说明 |
FIN | 1bit | 最后一片就是是否是消息的终于一个帧。1表示完整消息或 |
RSV1/2/3 | 1bit | 扩展保留位 |
Opcode | 4bits | 操作码,定义帧类型:•0x0:延续帧(Continuation)•0x1:文本帧(UTF-8 编码)•0x2:二进制帧•0x8:关闭连接(Close)•0x9:Ping •0xA:Pong |
MASK | 4bit | 是否启用掩码,此时客户端发送的帧必须为1,服务器发送的帧为0 |
PayLoad Length | 7bit | 有效载荷长度: 0–125:直接表示 126:后接 2 字节(16 位) 127:后接 8 字节(64 位)长度 |
Extended payLoad length | 0/2/8 bytes | 根据PayLoad len 决定是否出现 |
Masking-key | 4bytes | 当Mask=1时存在,用于XOR解码 payload Data |
Payload Data | 变长 | 实际数据内容 |
既然WebSocket是一个长连接,需要网络一直保持畅通状态,但网络状态变化又有多种原因。那么又是如何检测连接是否存活呢?
Ping/Pong 心跳机制:保持连接活跃
大致工作原理:
1.任意一方(通常是服务器)能够发送一个Ping帧(Opcode=0x9)
2.接收方必须立即回复一个Pong帧(Opcode=OxA),内容与Ping帧相同。
3.如若长时间没有收到Pong,可以认为连接已经断开
消息分片
传输的数据过多的话,行拆分为多个帧进行传输
第一帧:FIN=0,Opcode=0x1 或0x2
中间帧:FIN=0,Opcode=0x0(延续帧)
最后一帧:FIN=1,Opcode=0x0
这也允许流式传输大文件和音视频教程
连接关闭流程
关闭连接通过Close帧(Opcode=0x8)完成
一方发送close帧(可带状态码和原因)
另一方收到后应答close帧
双方关闭TCP连接
常见状态码:
- 1000:正常关闭
- 1001:服务端重启
- 1003:不支持的数据类型
- 1007:无效数据(如非 UTF-8)
- 1011:服务器内部错误
Websocket典型应用场景
- 实时聊天室 / IM 平台
- 股票/加密货币行情推送
- 多人在线游戏
- 实时数据监控与可视化
- 协同编辑(如 Google Docs、飞书)
- IoT 设备远程控制
- 实时通知架构
浙公网安备 33010602011771号