网络包优化Fabric版

网络包优化Fabric版

通过网络数据包头索引、聚合加Zstd压缩、延迟分块缓存以及持久化的客户端分块去重来优化网络带宽。

优化

Not Enough Bandwidth (NEB) — Fabric 移植版

适用于 Minecraft 1.21.4 的 Fabric 模组 — 通过数据包头索引、聚合 + Zstd 压缩、延迟区块缓存以及持久化客户端区块去重来优化网络带宽。

需要支持或需要移植到其他版本? 请提交 issue,加入 QQ 群 362669270邀请链接),或发送邮件至 support@rms.net.cn

这是由 USS_Shenzhou 开发的原始 NeoForge 模组的非官方 Fabric 移植版。 如果你想为上游项目做贡献,请先在 Discord 上与 USS_Shenzhou 讨论。

简介

NEB 使用多种方法在 Minecraft 游戏过程中尽可能节省网络流量,同时对模组和玩家保持透明。

在 TeaCon 甲辰数据集里,与原始未压缩数据相比,NEB 理论上可以将服务器的出站流量减少到原始大小的 7.6%。作为对比,原版默认压缩机制的出站流量为原始数据大小的 39%。

在原版环境中进行的测试中,服务器出站流量减少到了原始大小的 18%。随着安装的模组数量增加,压缩性能会进一步提升。

在游戏内按 Alt+N 查看网络流量状态。

主要功能

紧凑数据包头

通过将包头中的 Identifier(数据包类型)替换为紧凑的 VarInt 索引,优化 CustomPacketPayload 的编码与解码。这将模组网络包头开销减少到固定的 3-4 字节,而非网络数据包类型对应字符串的长度。

[!NOTE]

固定 8 位包头

+------------- 1 byte (8 bits) ---------------+
|               function flags                 |
+---+---+--------------------------------------+
| i | t |      reserved (6 bits)               |
+---+---+--------------------------------------+
  • i = indexed(已索引,1 位)
  • t = tight_indexed(紧凑索引,1 位,仅在 i=1 时有效)
  • reserved = 6 位(保留供未来使用)

索引数据包类型

  • 若 i=0(未索引):后接完整的 UTF-8 编码 Identifier
  • 若 i=1 且 t=0(已索引,非紧凑):3 字节 — 12 位命名空间 ID + 12 位路径 ID(各自容量 4096)。
  • 若 i=1 且 t=1(已索引,紧凑):2 字节 — 8 位命名空间 ID + 8 位路径 ID(各自容量 256)。

聚合与压缩

优化原版经常产生大量小型网络数据包的情况。在 Connection 层面拦截传输,每 20ms 将它们组装成一个大网络数据包,经过 Zstd 压缩后发送。

[!NOTE]

+---+-----+----+----+----+----+----+----...
| B | (S) | p0 | s0 | d0 | p1 | s1 | d1 ...
+---+-----+----+----+----+----+----+----...
          +--packet 1---++--packet 2---+
          +---------compressed---------+
  • B = bool,是否压缩
  • S = varint,未压缩数据的大小(仅在压缩时存在)
  • p = prefix(medium/int/utf-8),此子包的类型
  • s = varint,此子包的大小
  • d = bytes,此子包的数据

延迟区块缓存(DCC)

在原版中,当玩家移动时,服务器会指示客户端立即忘记身后的区块;如果玩家返回原始位置,必须重新发送完整的区块数据。通过延迟这种“忘记”操作,可以节省来回移动时产生的区块传输流量。

持久化区块缓存(PCC)

使用本地 LevelDB 数据库在客户端持久缓存区块数据,以 64 位内容哈希作为键。每次连接时,客户端将所有缓存区块哈希的布隆过滤器发送给服务器。当服务器即将发送哈希存在于过滤器中的区块时,它只发送 20 字节的哈希而非完整数据包(约 10–20 KB)。客户端从本地数据库加载该区块。当布隆过滤器出现误报时,客户端会请求完整数据作为回退。布隆过滤器每新增缓存 64 个区块便刷新一次,因此优化可在同一会话内生效。

配置

修改配置文件 config/NotEnoughBandwidthConfig.json

compatibleMode

客户端和服务器各自独立生效。

是否启用兼容模式。若设为 true,将使用下方的 blackList

blackList

客户端和服务器各自独立生效。

兼容模式的黑名单。列在此处的数据包将被 NEB 跳过。你可以按需添加数据包。

[!WARNING] 为保证数据包顺序,黑名单中的数据包会中断正在进行的聚合。如果黑名单中的数据包很多,或者对应数据包发送过于频繁,聚合-压缩的效率将会降低。

compressionLevel

客户端和服务器各自独立生效。

Zstd 压缩级别(整数 1-19)。默认为 6。值越高压缩效果越好,但消耗更多 CPU。

contextLevel

客户端和服务器各自独立生效。

Zstd 上下文窗口大小(整数 21-25,代表 2-32MB)。默认为 23(8MB)。值越大压缩效果越好,但消耗更多内存。

[!TIP] 对于拥有 100 名玩家的服务器,设置为 25 将导致大约 3200MB 的额外内存占用。

dccSizeLimit, dccDistance, dccTimeout

仅服务器。

延迟区块缓存(DCC)参数:最大缓存区块数、缓存距离、缓存超时(秒)。值越大可能消耗更多内存,值越小可能更频繁地触发更新。

chunkCacheEnabled

仅客户端。

是否启用持久化区块缓存。默认为 true

chunkCacheMaxSizeMB

仅客户端。

本地区块缓存数据库的最大大小(兆字节)。默认为 2048(2 GB)。

安装

需要:

  • Minecraft 1.21.4
  • Fabric Loader >= 0.18.0
  • Fabric API

客户端和服务器都必须安装 NEB。 当没有安装 NEB 的客户端连接时,服务器对该连接回退到原版行为。

许可证

版权所有 (C) 2025 USS_Shenzhou

本模组是遵循 GNU GPL 3.0 的自由软件。详见 LICENSE

附加权限

作为游戏玩家,当你在 Minecraft 中加载并游玩本程序时,本许可证自动授予你在 Minecraft 中正常加载和游玩本程序所需的一切权利,这些权利未在 GPL-3.0 许可证中涵盖,或被 GPL-3.0 许可证所禁止。若 GPL-3.0 许可证与 Minecraft EULA 或其他 Mojang/Microsoft 条款发生冲突,以后者为准。