[#12667] 在握手期间对请求的资源进行去重
变更摘要
修复了多人游戏握手期间客户端可多次请求相同资源 ID 导致服务器重复读取和序列化资源的问题。通过在验证请求时跟踪已请求的 ID,确保每个资源最多被序列化一次,防止内存和序列化负载被放大。
状态 Open · 目标 master ← fix/asset-request-bounds
文件 1 · 代码变化 +3 / -1
类型 逻辑修改 · 性能优化
主要变更
- 在 requestAssets 方法中引入 Bits 结构跟踪已请求的资源 ID
- 在遍历请求 ID 时跳过已处理或无效的 ID
- 确保每个有效资源 ID 在响应中最多被序列化和添加一次
影响范围
- 网络通信
- 资源管理
- 多人游戏握手
可能影响
- 减少服务器内存消耗
- 降低序列化开销
- 防止客户端恶意放大服务器负载
以上影响分析根据 PR 描述及代码修改推断,不代表维护者正式结论。
重点文件
core/src/mindustry/core/NetServer.java
修改 · +3 / -1
- 引入 Bits 实例 requestedIds 用于记录已请求的资源 ID
- 在循环中增加 requestedIds.get(id) 检查以跳过重复请求
- 处理有效 ID 后调用 requestedIds.set(id) 进行标记
作者说明
客户端资源请求允许同一个有效的资源 ID 出现多次。服务器会将每次出现都追加到其响应中,并重新从磁盘读取该资源,这使得客户端可以在多人游戏握手期间成倍增加服务器的内存和序列化工作量。
在验证请求时跟踪已请求的 ID,以便每个资源最多被序列化一次。对多个不同资源的正常请求保持不变。
GitHub 原文
Client asset requests allowed the same valid asset ID to appear multiple times. The server appended each occurrence to its response and reread the asset from disk, allowing a client to multiply memory and serialization work during the multiplayer handshake.
Track requested IDs while validating the request so each asset is serialized at most once. Normal requests for multiple distinct assets are unchanged.
由 MDT GitHub 同步机器人自动同步。中文翻译、摘要及代码影响分析由 AI 生成,仅供参考。