WebSocket

WebSocket 总结

一、是什么?

WebSocket 是一种全双工、持久连接 的网络通信协议,位于 OSI 第七层(应用层),在 TCP 之上运行。它允许客户端和服务器在单个 TCP 连接上同时双向发送消息,无需像 HTTP 那样每次请求都要重新建立连接。


二、核心特点

特点 说明
全双工 双方可随时主动发送消息,没有"请求-响应"的强制顺序
持久连接 握手成功后,连接保持开放,直到任意一方主动关闭
低延迟 省去了 HTTP 重复的握手头开销,消息边界清晰,无粘包问题
协议内建控制帧 支持 Ping/Pong(心跳)、关闭帧等,无需应用层额外设计
基于 TCP 可靠传输,自带序列号和重传机制
跨端口复用 与 HTTP 共享 80/443 端口,便于穿透防火墙

三、与 HTTP 的关系

  • 非替代,而是升级 :WebSocket 握手使用 HTTP 的 Upgrade 机制,握手成功后协议切换。
  • 相同之处
    • URL 模式:ws://(类似 http://)、wss://(类似 https://,使用 TLS 加密)。
    • 握手阶段可携带自定义 Header(如 AuthorizationCookie)。
  • 不同之处
    • HTTP 是半双工(请求→响应结束),WebSocket 是全双工。
    • HTTP 每个请求都有头部开销,WebSocket 头部只有 2~14 字节。
    • WebSocket 不粘包(基于帧),HTTP 基于文本的行/空行边界。

四、握手过程(简化)

  1. 客户端发送 HTTP 请求(升级到 WebSocket):

    复制代码
    GET /chat HTTP/1.1
    Host: example.com
    Upgrade: websocket
    Connection: Upgrade
    Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
    Sec-WebSocket-Version: 13
  2. 服务器响应 101 Switching Protocols

    复制代码
    HTTP/1.1 101 Switching Protocols
    Upgrade: websocket
    Connection: Upgrade
    Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
  3. 握手完成,TCP 连接保持,进入数据帧传输阶段。


五、数据帧格式(核心)

字段 长度 说明
FIN 1 bit 是否为消息最后一帧(0=分片,1=完整)
RSV1-3 3 bits 扩展保留,通常为 0
Opcode 4 bits 帧类型:1=文本,2=二进制,8=关闭,9=Ping,10=Pong,0=续帧
MASK 1 bit 是否掩码(客户端→服务器必须为 1)
Payload len 7 bits 载荷长度提示:0-125 直接表示,126 后跟 2 字节,127 后跟 8 字节
Extended Payload Len 0, 2, 8 字节 当 Payload len 为 126 或 127 时提供实际长度
Masking Key 0 或 4 字节 若 MASK=1,则存在,用于解码载荷
Payload Data 变长 实际应用数据(文本或二进制)

关键点

  • 客户端发出的帧必须掩码(MASK=1),服务器收到的帧如果未掩码则断开连接。
  • 服务器→客户端的帧禁止掩码(MASK=0)。
  • 掩码算法:payload[i] = original[i] XOR maskingKey[i % 4]

六、粘包问题

WebSocket 不会粘包 。因为每个帧头部明确给出了 Payload Len,接收端可以精确切分消息。应用层收到的 receive 回调一定对应一次完整的 send(除非分片帧,但框架已自动重组)。


七、常用控制帧

帧类型 用途
Close (0x8) 关闭连接。载荷前 2 字节为状态码(如 1000=正常关闭),后续可跟 UTF-8 原因字符串。
Ping (0x9) 探测连接存活。接收方必须立即回复 Pong(载荷与 Ping 相同)。
Pong (0xA) 对 Ping 的响应。

八、iOS 开发中的实现

  • 官方 APIURLSessionWebSocketTask(iOS 13+),封装了帧构建、掩码、自动 Ping/Pong 等。
  • 无需手撕帧头 ,只需调用 send()receive()sendPing() 等方法。
  • 手动实现(学习/底层控制)时需处理:掩码、载荷长度扩展、字节序转换、分片重组等。

九、典型应用场景

  • 即时聊天(微信、QQ、钉钉)
  • 实时行情推送(股票、币价)
  • 多人协作文档(Google Docs)
  • 游戏中的同步指令
  • 物联网设备状态上报

十、与其他方案的简单对比

方案 通信方式 实时性 开销 适用场景
HTTP 轮询 客户端周期性请求 差(延迟高) 低实时性需求
HTTP 长轮询 请求挂起直到有新数据 较好 兼容老浏览器
SSE 服务器→客户端单向 仅需服务器推送(如通知)
WebSocket 全双工实时 极好 双向交互场景
TCP Socket 裸写 全双工 极好 最低 需要极致控制(但需处理粘包等)

十一、帧头Frame_head

swift 复制代码
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
 +-+-+-+-+-------+-+-------------+-------------------------------+
 |F|R|R|R| opcode|M| Payload len |    Extended payload length    |
 |I|S|S|S|  (4)  |A|     (7)     |             (16/64)           |
 |N|V|V|V|       |S|             |   (if payload len==126/127)   |
 | |1|2|3|       |K|             |                               |
 +-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
 |     Extended payload length continued, if payload len == 127  |
 + - - - - - - - - - - - - - - - +-------------------------------+
 |                               |Masking-key, if MASK set to 1  |
 +-------------------------------+-------------------------------+
 | Masking-key (continued)       |          Payload Data         |
 +-------------------------------- - - - - - - - - - - - - - - - +
 :                     Payload Data continued ...                :
 + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
 |                     Payload Data continued ...                |
 +---------------------------------------------------------------+
 

一句话总结

WebSocket 是一种基于 TCP 的全双工持久协议,通过一次 HTTP 握手升级连接,使用轻量帧头传输,天然解决粘包问题,是现代实时双向通信的标准方案。

相关推荐
网络研究院2 天前
2026年网络安全
网络·安全·法律·法规·趋势·发展
酣大智2 天前
ARP代理--工作原理
运维·网络·arp·arp代理
treesforest2 天前
AI安全系统如何识别异常访问?IP风险识别正在成为关键能力
网络·人工智能·tcp/ip·安全·web安全
shushangyun_2 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
2601_961845152 天前
粉笔行测题库|系统班|刷题
网络·百度·微信·微信公众平台·facebook·新浪微博
程序员mine2 天前
HTTPS-TLS加密与证书完全指南(中)
网络协议·https·ssl
程序猿阿伟2 天前
《Chrome离线扩展安装的底层逻辑与场景落地指南》
服务器·网络·chrome
之歆2 天前
现代 HTTP 客户端深度解析:Fetch 与 Axios
chrome·网络协议·http
InHand云飞小白2 天前
无人值守站点网络困境?工业级路由器IR315破解连接难题
网络·物联网·4g·工业路由器·4g路由器·iiot·蜂窝路由器
森G2 天前
75、服务器源码解析---------云视频服务项目
linux·服务器·网络·c++·qt