WebSocket 工作原理

发布于:2025-07-01 ⋅ 阅读:(16) ⋅ 点赞:(0)

在这里插入图片描述

连接关闭
数据传输阶段
请求头包含
有效
无效
数据帧
数据帧
控制帧
控制帧
控制帧
控制帧
Close帧 (Opcode:8)
Code: 1000, Reason: Normal
Close帧 (Opcode:8)
响应关闭
关闭TCP连接
客户端
双向通信通道建立
服务器
FIN:1, Opcode:1 (文本帧)
Payload: Hello!
FIN:1, Opcode:2 (二进制帧)
Payload:
Ping帧 (Opcode:9)
Payload: 心跳数据
Pong帧 (Opcode:10)
Payload: 相同数据
客户端
TCP连接建立
发送HTTP升级请求
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Key: x3JJHMbDL...
服务器
验证请求
HTTP 101 Switching Protocols
Sec-WebSocket-Accept: HSmrc0sMl...
返回400错误
协议升级成功
连接终止

系统工作流程详解:

1. 连接建立阶段 (握手)
1. TCP三次握手
2. 发送升级请求
3. 验证并响应
客户端
服务器
GET /chat HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
  • 关键机制
    • 基于 HTTP 的协议升级机制
    • Sec-WebSocket-KeySec-WebSocket-Accept 的加密握手验证
    • 101 状态码表示协议切换成功
    • 保持原有 TCP 连接不关闭
2. 数据传输阶段
帧类型
UTF-8编码
文本帧: 1
二进制帧: 2
原始数据
Ping: 9
心跳检测
Pong: 10
心跳响应
Close: 8
关闭连接
数据帧结构
消息结束标志
保留位
帧类型
掩码标志
应用数据
帧头: 2-14字节
FIN:1位
RSV:3位
Opcode:4位
Mask:1位
Payload Len:7/16/64位
Masking-Key:0/4字节
Payload Data
  • 核心特性
    • 帧分片:大数据可分片传输(FIN=0表示还有后续帧)
    • 掩码机制:客户端→服务器数据必须掩码(安全设计)
    • 双工通道:双向独立数据传输
    • 低延迟:平均延迟 < 50ms(HTTP轮询 > 200ms)
3. 心跳机制 (保活)
Server Client Ping帧 (Opcode=9) 收到Ping后必须在 500ms内响应 Pong帧 (Opcode=10) 未收到Pong则 判定连接失效 Server Client
  • 作用
    • 检测连接活性
    • 防止 NAT/防火墙超时断开
    • 默认间隔:30-60秒(可配置)
4. 连接关闭流程
Client Server Close帧 (状态码+原因) 收到Close帧后必须 返回Close响应 Close帧 (回显相同状态码) 关闭TCP连接 关闭TCP连接 Client Server
  • 关闭状态码
    • 1000:正常关闭
    • 1001:端点离开
    • 1002:协议错误
    • 1003:接收到非法数据
    • 1006:异常关闭

系统特性总结表

特性 WebSocket HTTP轮询
连接类型 持久化单TCP连接 短连接/长轮询
通信模式 全双工双向 半双工请求-响应
头部开销 2-14字节/帧 500+字节/请求
服务器推送 原生支持 需hack实现
延迟特性 毫秒级 秒级
适用场景 高频交互实时应用 低频数据获取
连接建立成本 1次TCP+1次握手 多次TCP连接

典型数据流示例

[客户端]  FIN=1, Opcode=1, Payload="你好!"
[服务器]  FIN=1, Opcode=1, Payload="收到消息!"
[服务器]  FIN=1, Opcode=9, Payload="ping123"
[客户端]  FIN=1, Opcode=10, Payload="ping123"
[客户端]  FIN=1, Opcode=8, Payload="code=1000"
[服务器]  FIN=1, Opcode=8, Payload="code=1000"

这个流程图系统展示了 WebSocket 从握手建立连接、数据帧结构设计、心跳保活机制到优雅关闭的全过程,突出了其相比传统 HTTP 在实时通信场景下的核心优势。


网站公告

今日签到

点亮在社区的每一天
去签到