WebSocket(WebSock)协议介绍

WebSocket(ws)协议 是一种在单个 TCP 连接上实现全双工(双向)通信的计算机通信协议,专门为浏览器应用提供高效的实时数据交换。它于 2011 年被 IETF 标准化为 RFC 6455,并由 WHATWG 维护为 WebSockets 规范。它解决了传统 HTTP 协议在实时通信场景下的痛点(如短轮询或长轮询的高开销、连接资源浪费),允许客户端和服务器在连接建立后随时双向发送文本或二进制消息,无需每次请求。


工作原理(协议栈)

    1. 握手阶段(Opening Handshake):使用 HTTP 兼容方式建立连接。
    1. 数据传输阶段:二进制帧协议(Frame-based),支持文本(UTF-8)和二进制消息。
    1. 关闭阶段(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)上运行,提供更高效的底层传输。