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
- 各类游戏网关与浏览器长连接实践资料
