Apollo 技术文档Apollo 技术文档
指南
  • 架构概述
  • BigWorld 架构深度解析
  • BigWorld 进程架构与玩家生命周期
  • AOI九宫格系统详解
  • AOI广播与消息去重
  • Base 模块
  • Core 模块
  • Runtime 模块
  • Data 模块
  • Network 模块
  • /modules/actor.html
  • Game 模块
  • BigWorld 模块
服务器应用
API 参考
QA
GitHub
指南
  • 架构概述
  • BigWorld 架构深度解析
  • BigWorld 进程架构与玩家生命周期
  • AOI九宫格系统详解
  • AOI广播与消息去重
  • Base 模块
  • Core 模块
  • Runtime 模块
  • Data 模块
  • Network 模块
  • /modules/actor.html
  • Game 模块
  • BigWorld 模块
服务器应用
API 参考
QA
GitHub
  • MMORPG 架构 QA

Q21: WebSocket 在 MMO 中有什么应用场景?

核心结论

WebSocket 适合解决“浏览器或轻客户端环境下的长连接双向通信”问题,但它不是 MMO 实时网络的通用最优解。

如果客户端主要运行在浏览器里,WebSocket 几乎是默认选择;如果是原生客户端、强实时战斗、极致带宽与时延敏感场景,很多系统仍然会优先考虑 TCP 自定义协议、UDP、KCP 或 QUIC。

所以判断关键不是“WebSocket 能不能做 MMO”,而是:

  • 客户端运行环境是什么
  • 实时性要求有多高
  • 接入和运维成本怎么权衡

一、WebSocket 本质上解决了什么

WebSocket 提供的是:

  • 基于 TCP 的长连接
  • 客户端和服务端双向通信
  • 在浏览器环境中可直接使用
  • 比传统 HTTP 轮询更适合持续消息交换

它最大的价值,不是性能突然比 TCP 更强,而是:

  • 浏览器可用
  • 网关、代理、接入层相对成熟
  • 接入成本低

因为 WebSocket 本质仍然跑在 TCP 之上,所以 TCP 的很多特性和限制它都继承了下来。

二、它在 MMO 里适合哪些场景

1. 浏览器 MMO 或 H5 游戏

这是最典型的场景。

浏览器原生支持 WebSocket,前端接入简单,适合:

  • 页游
  • H5 MMO
  • 社交化轻量多人在线场景

这类项目通常比纯原生客户端更重视:

  • 快速接入
  • 跨平台覆盖
  • 运维与部署便利

2. 登录、网关、大厅、社交层

即使整个游戏核心战斗不用 WebSocket,它也常用于:

  • 登录鉴权
  • 大厅状态同步
  • 聊天
  • 匹配
  • 好友、公会、邮件等弱实时功能

原因很直接:

  • 这类消息对几十毫秒级时延没那么敏感
  • 接入层往往更希望统一 HTTP/WebSocket 基础设施

3. 中轻度实时玩法

如果玩法节奏不算极端,WebSocket 也能承载:

  • 回合战斗
  • 棋牌
  • 轻度 ARPG
  • 房间制小规模对战

但如果对高频状态同步、丢包恢复和极端弱网表现要求很高,就要谨慎评估。

三、它不太适合什么场景

1. 极致强调低时延的实时战斗

因为 WebSocket 继承 TCP 的顺序和可靠语义,遇到丢包时会出现典型的队头阻塞问题。

这意味着:

  • 前一包没到,后面的包即使已经到达也可能不能及时交付
  • 弱网下抖动感会被放大

对 FPS、强动作对战、极高频位移同步来说,这通常不是理想特性。

2. 需要细粒度控制传输语义的场景

很多实时游戏会把消息分层:

  • 必须可靠
  • 可丢但要新鲜
  • 高频状态只保留最新

WebSocket/TCP 对这类差异化语义的支持不够灵活。要实现同样效果,通常要在应用层再造一层消息管理,复杂度并不会更低。

四、WebSocket 和 TCP / UDP / KCP 的关系

1. 和 TCP 的关系

WebSocket 不是 TCP 的替代者,而是“运行在 TCP 上的一套更方便跨平台接入的应用层协议”。

如果是原生客户端,直接用 TCP 自定义协议通常更轻、更可控。

2. 和 UDP / KCP 的关系

UDP 或 KCP 更适合:

  • 高频状态同步
  • 低时延输入
  • 允许部分消息丢失
  • 需要自定义可靠性策略

WebSocket 更适合:

  • 易接入
  • 易穿透现有 Web 基础设施
  • 浏览器兼容优先

它们解决的问题重点不同。

五、在 MMO 里怎么用会更合理

一个常见的实用分工是:

  • 登录、大厅、聊天、公告、匹配走 WebSocket
  • 核心战斗服或实时场景服走 TCP / UDP / KCP

也有项目统一只用 WebSocket,但前提通常是:

  • 玩法节奏相对温和
  • 团队更重视开发效率和统一接入
  • 对极限弱网表现要求没那么激进

如果全部都压在 WebSocket 上,就要接受它在高频同步层面的约束。

六、工程上要注意的几个点

1. 消息格式仍然要认真设计

用了 WebSocket 不代表就该直接传 JSON 大包。很多项目最终还是会在 WebSocket 二进制帧里承载:

  • 自定义包头
  • Protobuf
  • 压缩和加密信息

否则消息体膨胀会很快。

2. 心跳和断线重连仍然要自己做

WebSocket 只是连接通道,不会自动帮你解决:

  • 假连接检测
  • 会话恢复
  • 状态补发
  • 幂等重试

这些仍然是应用层责任。

3. 网关和后端要解耦

浏览器接入通常会先到 WebSocket 网关,再由网关转发到业务进程。这样更容易处理:

  • TLS 终止
  • 限流
  • 连接管理
  • 协议适配

七、常见误区

1. WebSocket 更现代,所以一定比 TCP 更适合游戏

不对。它主要是接入形式更友好,不代表实时性能一定更优。

2. 浏览器能跑 WebSocket,所以大型 MMO 核心战斗也应该直接用它

未必。浏览器限制和 TCP 语义决定了它更适合一部分场景,不适合另一部分场景。

3. 用了 WebSocket 就能省掉网关

通常不会。连接管理、鉴权、限流、转发、观测仍然需要专门接入层。

参考资料

  • RFC 6455, WebSocket
  • RFC 9293, TCP
  • 各类游戏网关与浏览器长连接实践资料
在 GitHub 上编辑此页
最后更新: 3/20/26, 6:06 AM
贡献者: cuihairu