← 返回目录

第 15 卷

第 15 / 21 卷日期:

• 实现步骤:

送;

  • 接收方:① 先读取固定字节数的长度字段(如2字节),解析出数据长度;② 从缓冲区读取对应

长度的数据内容,若数据不足则等待,直至满足长度要求。

  • 优点:无分隔符冲突问题,适配任意长度、任意内容的数据,是工业级开发的首选方案;

• 缺点:实现稍复杂,需处理长度字段的字节序(大端/小端)问题(不同设备可能有差异,需统一约

定)。

  1. 协议格式化(适用于复杂结构化数据)

核心逻辑:定义完整的应用层协议格式(如JSON、Protobuf、自定义二进制协议),通过协议字段明确数据边界和结构,接收方按协议解析数据。

• 实现示例:

  • 使用JSON格式化:每个数据包是一个完整的JSON对象,如 {"type":"login","data":

{"user":"admin","pwd":"123"}},配合分隔符(如 \r\n)使用;

  • 使用Protobuf:预先定义数据结构(如message Login { string user = 1; string pwd = 2; }),发

送方序列化数据,接收方按定义反序列化,自动识别数据边界。

  • 优点:结构化强,支持复杂数据类型,可扩展性好(如Protobuf支持字段新增);

• 缺点:需额外引入协议解析库,序列化/反序列化有轻微性能开销,适用于分布式系统、跨语言通信

等复杂场景。

二、粘包问题的延伸:半包处理

与粘包对应的是“半包”(接收方只收到一个数据包的部分数据),上述所有解决方案均需结合“缓冲区”处理半包:接收方需维护一个临时缓冲区,将每次接收的字节先存入缓冲区,再根据约定的边

界规则从缓冲区中提取完整数据包,未提取的剩余数据保留在缓冲区,等待后续数据补充。

✅ 核心总结

处理TCP粘包的核心是“应用层补全边界”:简单场景可选择固定长度或分隔符方案,复杂场景优先使用长度字段前缀方案,跨语言/结构化数据推荐协议格式化方案。无论哪种方案,都需配合缓冲区处理

半包问题,确保数据拆分的准确性。

  1. WebSocket协议的主要特点是什么?

WebSocket是基于TCP的应用层协议,核心设计目标是解决HTTP协议“无状态、单向通信”的缺陷,

WebSocket建立连接后,客户端和服务端可同时向对方发送数据,实现“双向实时交互”,无需像 HTTP那样通过“客户端发起请求-服务端响应”的单向模式通信。例如,服务端可在无客户端请求的

情况下,主动向客户端推送消息(如实时聊天的新消息、股票行情更新)。

  1. 基于TCP的持久连接,低延迟

WebSocket连接建立后会持续保持,直至客户端或服务端主动关闭,避免了HTTP每次通信都需重新建立TCP连接的开销:

• 连接建立:通过“HTTP握手”完成升级(后续第29问详细说明),仅需一次握手即可建立持久连

接;

• 低延迟:连接建立后,数据传输无需重复握手和头部验证,且协议头部开销极小(仅2-10字节),

远低于HTTP的头部开销(通常数百字节),大幅降低传输延迟。

  1. 无同源限制,跨域友好

WebSocket协议本身不限制跨域请求,客户端可通过 new WebSocket("ws://cross-domainserver.com") 直接连接跨域的WebSocket服务器,无需像HTTP跨域那样依赖CORS(跨域资源共

享)机制。但服务端可通过验证“Origin”请求头来限制允许的客户端域名,保障安全性。

  1. 支持多种数据格式,扩展性强

WebSocket支持传输文本数据(UTF-8编码,如JSON、XML)和二进制数据(如图片、音频、视频流),可满足不同场景的需求:

  • 文本数据:适用于实时聊天、通知推送等场景,可读性强;
  • 二进制数据:适用于实时音视频传输、文件分片上传等场景,传输效率高。

此外,WebSocket支持“子协议”扩展(通过 Sec-WebSocket-Protocol 请求头协商),可基于基础协议定制应用层协议(如聊天协议、游戏协议)。

  1. 心跳机制保障连接稳定性

WebSocket支持通过“心跳包”机制检测连接状态:客户端和服务端可周期性发送小型数据包(如空消息或特定标识的消息),若对方长时间未响应,说明连接异常,可主动关闭连接并重新建立,避

免“僵死连接”(连接存在但无法通信)。

  1. 与HTTP协议兼容,升级平滑

WebSocket的连接建立过程基于HTTP协议(“HTTP升级请求”),客户端发起的握手请求是标准的 HTTP请求,可穿过大多数支持HTTP的防火墙和代理服务器,无需修改网络环境配置,实现平滑升级

传统实时通信方案(HTTP长轮询、短轮询)本质仍是HTTP单向通信,与WebSocket差异明显:

• HTTP短轮询:客户端定时发送HTTP请求询问服务端是否有新数据,延迟高、开销大(频繁建立连

接);

• HTTP长轮询:客户端发送请求后,服务端保持连接直至有新数据或超时才响应,延迟有所降低,

但仍存在连接重建开销;

• WebSocket:全双工持久连接,服务端可主动推送数据,延迟最低、开销最小,是实时通信的最优

方案。

✅ 核心总结

WebSocket的核心价值是“高效、实时、双向”,通过持久连接、低开销传输、跨域友好等特点,解决了HTTP在实时通信场景下的不足。其典型应用场景包括:实时聊天、在线协作工具、实时行情推

送、在线游戏、实时音视频通话等。

29. 描述WebSocket的握手过程

WebSocket的握手过程是“基于HTTP协议的升级过程”,核心目的是通过一次HTTP请求/响应,完成从“HTTP协议”到“WebSocket协议”的切换,建立持久的全双工连接。整个过程由客户端主动

发起,服务端确认升级,最终完成连接建立,具体步骤如下:

一、核心前提与关键字段

握手过程依赖HTTP请求头和响应头中的特殊字段,用于协商升级协议、验证身份和确认参数,核心关键字段包括: Upgrade、 Connection、 Sec-WebSocket-Key、 Sec-WebSocket-

Accept 等。

二、完整握手流程(3步核心)

  1. 第一步:客户端发起HTTP升级请求(握手请求)

客户端通过JavaScript创建WebSocket对象(如 new WebSocket("ws://example.com/ws"))时,会向服务端发送一个“HTTP GET请求”,明确

告知服务端“希望升级到WebSocket协议”,请求头包含核心协商字段:

Code block

1GET /ws HTTP/1.1

全站分卷索引 · 21 卷
  1. 1第 1 卷
  2. 2第 2 卷
  3. 3第 3 卷
  4. 4第 4 卷
  5. 5第 5 卷
  6. 6第 6 卷
  7. 7第 7 卷
  8. 8第 8 卷
  9. 9第 9 卷
  10. 10第 10 卷
  11. 11第 11 卷
  12. 12第 12 卷
  13. 13第 13 卷
  14. 14第 14 卷
  15. 15第 15 卷
  16. 16第 16 卷
  17. 17第 17 卷
  18. 18第 18 卷
  19. 19第 19 卷
  20. 20第 20 卷
  21. 21第 21 卷