《MMO 服务器开发》卷一《网络与并发内核》全 61 篇,是一套以从零手写一个 MMO 服务端为主线的书。从第 1 章定义「一个 MMO 服务端长什么样」起,到第 18 章把前 17 章的零件装配成能跑的服务端,
aegis会一路长大——一套长度前缀的帧协议、一个能正确处理粘包与拆包的编解码层、一套从零实现的 KCP 可靠 UDP、一个基于会话表的网关、一张消息路由表、一个哈希时间轮、一套 Actor 邮箱与背压、一个幂等窗口、一条从状态同步到客户端预测校正的完整链路、一层服务器权威校验与反作弊、以及协议 fuzz 与封包加密。每一节都写代码,每一节的代码都在本机真跑过,跑出来的结果就是这一节的结论。
技术栈是 Go 主线 + Java 对照:主干全部用 Go 实现,另有约十个「双栈对照」小节,把同一件事在 Go 与 Java(JDK 21 虚拟线程、java.nio.ByteBuffer 零拷贝)里各实现一遍并实测对比,给出可判定的选型结论。Java 代码经 Docker 拉取的现代 JDK 真跑,不使用本机那份 Java 8。
本页是《网络与并发内核》的全书目录:按章节顺序列出全部 61 篇,点击标题直达正文。也可以从各节末尾的「阅读导航」按顺序通读,或先看目录篇 里的学习路径与周计划。
全书概览
| 项目 | 内容 |
|---|---|
| 书稿 | 《MMO 服务器开发》卷一《网络与并发内核》 |
| 篇数 | 61 篇(正文 18 章 54 节 + 目录篇 + 序 + 前言 + 附录 A–D) |
| 领域 | MMO 服务端网络与并发内核从零实现 |
| 贯穿项目 | 《晨曦大陆》——一款多人在线开放世界小游戏 |
| 从零服务端 | aegis——Go 实现,标准库为主,可本机真跑 |
| 对照技术栈 | Java 21(虚拟线程、java.nio.ByteBuffer),经 Docker 真跑 |
| 阅读方式 | 从目录篇 进入按顺序通读,或按查漏场景跳读 |
| 实测环境 | Go 1.26.0、Docker + eclipse-temurin:21-jdk、macOS Darwin 25.3.0 |
| 可运行性 | L1 内核代码全部本机实跑;L2 端到端真起多进程;基准数字附原始数据 |
全书目录
前置
| 篇目 | 核心内容 |
|---|---|
| 目录 | 本卷定位、阅读路径、贯穿项目与可运行性口径 |
| 序 | 为什么还要从零写一个 MMO 服务端 |
| 前言 | 技术选型、Go 与 Java 双栈口径与环境准备 |
第一部分:认识与地基(第 1–3 章)
| 节 | 文章 | 核心内容 |
|---|---|---|
| 1.1 | 分层与职责边界:一个 MMO 服务端长什么样 | 接入、逻辑、场景、数据四层与长连接有状态的含义 |
| 1.2 | 本书范围与站内分工 | 与站内 170 篇架构文、既有书稿的四重区隔 |
| 1.3 | 一个 MMO 服务端最少要有哪些零件 | 最小可跑服务端的零件清单与可校验的骨架 |
| 2.1 | 阻塞、非阻塞与 Reactor | 四种 I/O 模型与 Go netpoller 的关系 |
| 2.2 | goroutine-per-connection 与 Go 调度器 | 每连接一协程的成本与两千连接的实测数字 |
| 2.3 | 双栈对照:goroutine、Java 虚拟线程与 Netty EventLoop | 十万并发任务的 Go 与 Java 对照 |
| 3.1 | 消息头与命令号 | 命令号分配、位域与消息头布局 |
| 3.2 | 长度前缀、粘包与拆包 | 帧格式、粘包拆包与长度上限防御 |
| 3.3 | 协议版本与多版本兼容 | 版本协商与字段级向后兼容 |
第二部分:编解码与传输(第 4–6 章)
| 节 | 文章 | 核心内容 |
|---|---|---|
| 4.1 | 二进制编解码从零写 | 手写 Reader/Writer、varint 与越界防护 |
| 4.2 | 双栈对照:Go 编解码与 Netty ByteBuf 零拷贝 | 切片视图与 ByteBuffer 视图的零拷贝对照 |
| 4.3 | 基准:JSON、MessagePack、Protobuf 与扁平化协议 | 三种编码的吞吐与分配实测 |
| 5.1 | 为什么游戏不只用 TCP | 队头阻塞、重传策略与拥塞控制的硬伤 |
| 5.2 | KCP 从零实现 | ARQ 重传、RTO 估计、滑动窗口与快速重传 |
| 5.3 | 丢包与弱网模拟实测 | 四档丢包率下的延迟分布与冗余发送率 |
| 6.1 | WebSocket 握手、掩码与分片 | 手写 RFC 6455 握手与帧解析 |
| 6.2 | 心跳与超时检测 | 真起服务的超时踢人与千连接心跳开销 |
| 6.3 | 断线重连与重连票据 | HMAC 票据、防篡改与防重放 |
第三部分:连接、路由与定时(第 7–9 章)
| 节 | 文章 | 核心内容 |
|---|---|---|
| 7.1 | 会话表与连接管理 | 连接与账号的双向索引与并发安全 |
| 7.2 | 顶号、踢人与连接迁移 | 同账号顶号的正确顺序与竞态 |
| 7.3 | 网关的职责边界 | 网关该做什么、绝不该做什么 |
| 8.1 | 路由表与请求-响应-推送 | 三种消息形态与路由表构建 |
| 8.2 | 消息序号、去重与顺序保证 | 序号语义与乱序处理 |
| 8.3 | 广播与扇出 | 批量广播与扇出的成本 |
| 9.1 | 心跳超时与技能冷却 | 海量短周期定时的组织方式 |
| 9.2 | 时间轮从零实现 | 哈希时间轮、级联与 O(1) 挂载 |
| 9.3 | 世界时钟与 Tick 预算 | 逻辑帧、时间缩放与 Tick 超支处理 |
第四部分:并发模型与正确性(第 10–11 章)
| 节 | 文章 | 核心内容 |
|---|---|---|
| 10.1 | 消息驱动的实体 | 实体只被消息推进,不共享内存 |
| 10.2 | 邮箱、顺序保证与背压 | 有界邮箱与拒绝策略 |
| 10.3 | 对照:Go channel 邮箱与 Erlang/Skynet 式 Actor | 两种 Actor 实现与各自代价 |
| 11.1 | 请求幂等窗口 | 滑动窗口去重与内存上界 |
| 11.2 | 命令编号与业务指纹 | 命令号 + 指纹识别重复请求 |
| 11.3 | 至少一次投递下的正确性 | 重复投递不重复发奖 |
第五部分:实时同步(第 12–14 章)
| 节 | 文章 | 核心内容 |
|---|---|---|
| 12.1 | 状态同步与帧同步的服务端视角 | 两种同步模型服务端各要做什么 |
| 12.2 | 快照与增量编码 | 全量快照与增量差分的取舍 |
| 12.3 | 兴趣过滤与带宽预算 | 千人同屏的带宽账 |
| 13.1 | 输入缓冲与本地预测 | 客户端先走一步,服务端记什么 |
| 13.2 | 服务器回滚与和解 | 校正与重放的实现 |
| 13.3 | 插值与平滑 | 让校正不跳帧 |
| 14.1 | 服务器时间线与时钟同步 | 服务器时间、客户端偏移与估算 |
| 14.2 | 延迟补偿裁决 | 打得到底算不算打中 |
| 14.3 | 高延迟玩家的公平性 | 补偿上限与滥用防护 |
第六部分:权威、安全与综合(第 15–18 章)
| 节 | 文章 | 核心内容 |
|---|---|---|
| 15.1 | 权威边界与信任模型 | 客户端能说什么、不能说什么 |
| 15.2 | 移动与战斗合法性校验 | 速度上限、瞬移检测与冷却校验 |
| 15.3 | 异常行为信号与限速 | 信号采集与令牌桶限速 |
| 16.1 | 协议 fuzz 与畸形包 | 从零写一个协议 fuzzer |
| 16.2 | 洪泛与连接耗尽防护 | 握手限速与连接配额 |
| 16.3 | 封包加密与签名 | 对称加密与防篡改签名 |
| 17.1 | 把前 16 章拼成 aegis | 服务端装配与启动顺序 |
| 17.2 | 登录、移动与广播端到端 | 端到端流程与机器人断言 |
| 17.3 | 机器人客户端与第一组承载数字 | 自写压测器与真实承载数据 |
| 18.1 | 卷一回顾 | 十八个零件的串讲 |
| 18.2 | 承载数字汇总 | 全卷实测数据一览 |
| 18.3 | 进入玩法卷 | 卷二要装进去的玩法系统 |
附录
| 篇目 | 核心内容 |
|---|---|
| 附录 A aegis 卷一 API 与模块速查 | 全卷模块、类型与关键 API 一览 |
| 附录 B 环境与复现速查 | Go 版本、依赖、Java 容器与各层代码跑通方法 |
| 附录 C 实测数据汇总 | 全书基准的原始数字与测量方法 |
| 附录 D 常见错误与 FAQ | 易错点、报错含义与排查清单 |
怎么用这份索引
- 系统学习:从目录篇 进入,按路径 A 顺序通读 18 章。
- 抓重点:直接跳到第二部分(编解码与传输)和第五部分(实时同步),这两块是 MMO 服务端最核心的部分。
- 查问题:用目录篇 末尾的「常见问题速查」表,或按上表标题跳读。
- 配代码:每篇正文的代码块都标了层级与来源文件,L1 的可以直接复制出来在 Go 1.26 上跑。
相关阅读
- 游戏服务端专题 :网络模型、同步方案与分布式架构
- 游戏服务端实战专题导航 :170 篇架构设计与取舍
- 游戏引擎实现原理 :从零写一个 3D 引擎的四卷本
- 书稿书架 :全部电子书与创作手记