【免费下载链接】CWR
Arma: Cold War Assault Remastered Source Code Repository.
CWR(Arma: Cold War Assault Remastered)的多人网络模块位于engine/Poseidon/Network/目录,本文带你快速看懂它的 NetTransport 协议栈分层设计、UDP 握手流程与服务器认证机制,适合想理解游戏多人架构的新手读者。
一、NetTransport 协议栈:分层架构一览 🗂️
CWR 的多人网络核心是NetTransport,它把底层 UDP 收发、玩家管理、会话描述、消息队列等职责拆分成大量单职责的NetTransport*.hpp文件,形成清晰的协议栈结构:
| 层次 | 代表文件 | 职责 |
|---|---|---|
| 线格式层 | NetTransportProtocol.hpp | 定义 magic 魔数、报文字段与字节布局 |
| 客户端传输层 | NetTransportClientSession.cpp、NetTransportClientReceive.hpp | 客户端连接、收包分发 |
| 握手层 | NetTransportClientHandshake.hpp、NetTransportPlayerHandshake.hpp | 建包、超时与重试策略 |
| 服务端玩家层 | NetTransportPlayerAdmission.hpp、NetTransportPlayerQueue.hpp | 玩家准入、队列与断线重连 |
| 高层网络接口 | Network.hpp、NetworkIface.hpp | 游戏逻辑可见的网络消息接口 |
几个关键设计点:
- 魔数(Magic)路由:所有控制报文开头都是一个
unsigned32 magic字段,服务端据此分派处理。典型魔数定义在 NetTransportProtocol.hpp:MAGIC_ENUM_REQUEST、MAGIC_CREATE_PLAYER、MAGIC_ACK_PLAYER、MAGIC_TERMINATE_SESSION等。 - 紧凑打包:所有线格式结构体使用
#pragma pack(1)强制单字节对齐(如 SessionPacket),保证不同平台间二进制布局完全一致。 - 状态机驱动:整个对局生命周期由
NetworkGameState状态机描述,从NGSLogin、NGSPrepareSide到NGSBriefing、NGSGame等阶段流转,定义在 NetworkIface.hpp。
二、握手流程:从广播发现到获得座位号 🔌
玩家从"发现服务器"到"进入游戏"经历三个阶段,全程通过 magic 报文交互(核心处理逻辑见 NetTransportNet.cpp):
1. 会话枚举(发现服务器)
客户端广播MAGIC_ENUM_REQUEST,服务端校验magicApplication匹配后回送完整的SessionPacket,其中包含会话名、任务名、版本要求、Mod 列表、玩家数、密码标志等。同时服务端会用令牌桶(_enumReplyBucket)对反射回复做限速,防止广播风暴。
2. 创建玩家(申请座位)
客户端发送MAGIC_CREATE_PLAYER报文,携带 CreatePlayerPacket 定义的名字、密码、Mod 列表、版本信息。服务端按顺序执行准入检查:
- 应用魔数不匹配 → 直接丢弃;
- 版本交叉校验:客户端
actualVersion/requiredVersion必须与服务器兼容,否则返回CRVersion; - Mod 列表不一致(服务器要求
equalModRequired时)→CRVersion; - 密码错误 →
CRPassword; - 全部通过 →
CROK,分配 playerNo 并回送MAGIC_ACK_PLAYER。
这套结果码就是 NetTransport.hpp 中的ConnectResult枚举。
3. 超时与重试策略
握手不是"发一次等回复",而是有明确的时间参数,见 NetTransportClientHandshake.hpp:
NetTransportAckPlayerTimeoutMs = 8000:等待确认的总超时时间;NetTransportCreatePlayerResendMs = 2000:每 2 秒重发一次 CreatePlayer 报文;NetTransportHandshakePollWaitMs = 100:轮询间隔。
纯函数化的超时/重试判断(ShouldContinueNetTransportHandshakeWait、TryApplyNetTransportAckPlayer等)集中在 NetTransportClientHandshake.cpp,方便单元测试。
三、服务器认证机制:身份、封禁与权限三道关卡 🛡️
关卡一:机器身份识别
CWR 在无 Steam 的环境下用操作系统机器 ID 生成稳定玩家身份:Windows 读取注册表MachineGuid,Linux 读取/etc/machine-id,再经 FNV-1a 哈希得到一个 63 位正整数作为 player id。实现见 MultiplayerAuth.cpp,注释中说明这是一个"实用的非 Steam 身份回退方案",而非防篡改的所有权证明。
关卡二:双层封禁(ID + IP)
IpBan.hpp 提供 IP 封禁的解析、读写(ipban.txt,每行一个点分 IPv4 地址)以及BanMode(Id/Ip/Both)三种封禁粒度。登录时无论配置如何都会同时检查 ID 封禁和 IP 封禁列表,配置项只决定Ban()执行时写入哪一种记录。此外 IntegrityCheck.hpp 还提供了 EXE 与数据文件的 CRC 校验能力,用于反作弊完整性检查。
关卡三:游戏内命令授权
进入对局后的管理指令(登录、踢人、禁言、切换任务、投票等)由NetworkCommandMessageType消息类型枚举驱动,定义在 NetworkIndices.hpp。真正体现设计价值的是 NetworkServerAuth.hpp:它把散落在消息分发 switch 里的权限判断提取成了可复用的纯函数谓词,例如:
AdminLoginPasswordAccepted:要求服务器配置了非空passwordAdmin且密码精确匹配,空配置意味着不授予任何远程管理权;CommandFromGameMaster:只有当前 game master 能执行任务管理类命令;CommandFromPasswordAdmin:关机、锁定会话等高危命令排除"投票产生的管理员";RemoteExecClientAuthorized:服务端 remoteExec 的授权策略,支持DenyClient/AllowListed/AllowAll三种模式。
这些谓词被显式设计为"行为保持"的提取——即不改变原有逻辑,只让权限规则可命名、可复用、可直接做单元测试。
四、周边设施:主服务器与断线重连 📡
除核心协议栈外,网络模块还包含:
- 主服务器(Master Server):MasterServerProtocol.hpp 定义了浏览器上报/查询的字段(
gamemode、timeleft、respawn等),传输实现固定为papa-bear;MasterServerBrowser.cpp 负责客户端侧浏览,MasterServerPublisher.cpp 负责服务器侧发布。 - 断线重连:NetTransportPlayerReconnect.hpp 配合
MAGIC_RECONNECT_PLAYER魔数实现玩家掉线后的座位恢复。 - 会话策略与统计:NetTransportSessionPolicy.cpp、NetTransportMetrics.hpp 等文件负责会话级限流与指标统计。
五、总结:这套架构好在哪?
- 协议与逻辑解耦:线格式(magic + pack(1) 结构体)集中在协议层,改协议不用动业务代码;
- 握手行为可测试:超时、重试、准入检查全部拆成纯函数,配套大量单测与 fuzz 目标(如 fuzz_decode_msg.cpp);
- 权限模型显式化:把隐式的 if 判断提炼为命名谓词,是安全审查与代码演进的友好姿态。
如果你想继续深入,建议从 NetTransportNet.cpp 的ctrlReceive分派入口和 NetworkServerMsgOnMessage.cpp 的消息处理两条主线读起,配合 engine/Poseidon/Network/ 目录下按职责命名的头文件,整张多人网络架构的地图就基本清晰了。
【免费下载链接】CWR
Arma: Cold War Assault Remastered Source Code Repository.
相关推荐
TFTPD64终极指南:多协议网络服务器完整教程
在当今网络运维和嵌入式开发领域,高效的文件传输工具已成为不可或缺的利器。TFTPD64作为一款轻量级多线程服务器套件,集成了TFTP、DNS、DHCP、SNTP
网络通信如何快速下载网页所有资源:Resources Saver扩展完整指南
如何快速下载网页所有资源:Resources Saver扩展完整指南 你是否曾经需要保存网页中的所有资源文件,却因为手动下载太麻烦而放弃?Resources S
前端开发工具IsaacLab 安装提示"找不到 rsl-rl 匹配版本"?3 种办法快速绕开报错
IsaacLab 安装提示"找不到 rsl rl 匹配版本"?3 种办法快速绕开报错 你在给 IsaacLab(机器人学习仿真框架)做 pip 安装时,如果卡在
人工智能强化学习机器人具身智能深度学习
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考