一、前言

WebSocket 实现数据实时推送的核心机制在于其全双工通信能力持久的连接特性

WebSocket 和 Http 请求的区别:
在这里插入图片描述
HTTP 像“写信”——每问每答都要装信封;WebSocket 像“打电话”——拿起话筒随时说。

二、工作原理

1. 握手阶段(HTTP 升级协议)

客户端发起请求:通过发送一个带有特殊头部的 HTTP 请求,请求协议升级

GET /chat HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13

1、Upgrade: websocket 和 Connection: Upgrade 表示希望升级到 WebSocket 协议。

2、Sec-WebSocket-Key 是客户端生成的随机 Base64 编码密钥,用于握手验证。

服务器响应确认:若服务器支持 WebSocket,返回 101 Switching Protocols 状态码。

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

Sec-WebSocket-Accept 是服务器对客户端密钥处理后的响应值,通过固定算法生成,确保握手有效性。

2. 建立持久全双工连接

完成握手后,TCP 连接保持打开,客户端和服务器直接通过该通道交换数据,无需重复握手。

全双工特性:双方可同时发送和接收数据,互不阻塞,实现实时双向通信。

3. 数据传输(WebSocket 帧)

数据分帧传输:所有数据以帧(Frame)形式传递,帧结构包含:

1、操作码(Opcode):标识数据类型(如文本 0x1、二进制 0x2、控制帧如 ping/pong)。

2、掩码(Mask):客户端发送的数据必须掩码处理,防止缓存攻击。

3、负载长度:指示数据内容的长度。

示例帧结构:
在这里插入图片描述
4. 心跳机制

Ping/Pong 帧:用于检测连接是否存活。
服务器或客户端可发送 Ping 帧(操作码 0x9),接收方必须回复 Pong 帧(操作 码 0xA)。

自动重连:若连接意外断开,客户端可尝试重新建立连接。

5. 关闭连接

关闭握手:任一方发送 Close 帧(操作码 0x8),对方回应后关闭 TCP 连接。

状态码和原因:关闭帧可携带状态码(如 1000 表示正常关闭)和关闭原因。

三、关键优势

低延迟:避免 HTTP 每次请求的开销,数据实时到达。

高效传输:较少的协议头开销(通常仅 2-10 字节前缀)。

服务端主动推送:服务器无需等待客户端请求即可发送数据。

应用场景:

实时聊天:消息即时送达。
在线游戏:多玩家状态同步。
金融行情:股价实时更新。
协同编辑:多人同时编辑文档同步。

安全性:

wss://:基于 TLS 加密,防止中间人攻击。

掩码机制:客户端到服务器的数据掩码处理,增强安全性。

总结而言,WebSocket 通过升级 HTTP 连接为持久化的全双工通道,结合高效的数据帧结构和心跳机制,实现了低延迟、高吞吐的实时数据推送,成为现代实时应用的基石。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐