
网络包优化
NEB在Minecraft游戏过程中采用多种方法来节省网络流量。
带宽不足(NEB)

简介
NEB 采用多种方式,在 Minecraft 游戏过程中尽可能节省网络流量,同时对模组和玩家保持透明。
在 TeaCon 夹辰 的 ZZZZ 数据集中,与原始未压缩数据相比,NEB 理论上可将服务器的出站流量降至原始大小的 7.6%,实测值约为 13.8%。
在纯净环境下进行的测试中,服务器出站流量降低至原始大小的 18%。理论上,随着安装的模组数量增加,网络传输的内容会更大更复杂,从而获得更好的压缩效果。
在游戏中按 Alt+N 即可便捷查看网络流量状态。
主要特性
紧凑数据包头
通过用紧凑索引替换数据包头 Identifier(数据包类型),优化 CustomPacketPayload 的编码与解码。这使得模组网络数据包头开销降至固定的 3-4 字节,而非网络数据包类型对应字符串的长度。
索引结构如下:
固定 8 位头部
┌------------- 1 字节(8 位)---------------┐ │ 功能标志位 │ ├---┬---┬-------------------------------------┤ │ i │ t │ 保留位(6 位) │ └---┴---┴-------------------------------------┘
- i = 已索引(1 位)
- t = 紧凑索引(1 位,仅在 i=1 时有效)
- 保留位 = 6 位(供将来使用)
索引数据包类型
- 如果 i=0(未索引):
┌---------------- N 字节 ---------------- │ UTF-8 格式的标识符(数据包类型) └-----------------------------------------
- 如果 i=1 且 t=0(已索引,非紧凑):
┌-------- 1 字节 ---------┬-------- 1 字节 --------┬-------- 1 字节 --------┐ ┌------------- 12 位 ---------------┬-------------- 12 位 --------------┐ │ 命名空间 ID(容量 4096) │ 路径 ID(容量 4096) │ └-------------------------------------┴-------------------------------------┘
- 如果 i=1 且 t=1(已索引,紧凑):
┌--------- 1 字节 ----------┬--------- 1 字节 ---------┐ ┌--------- 8 位 ----------┬--------- 8 位 ---------┐ │命名空间 ID(容量 256) │ 路径 ID(容量 256) │ └---------------------------┴--------------------------┘随后为数据包数据。
当网络数据包命名空间及其对应路径少于 256 个时占用 3 字节,大于 256 个时占用 4 字节。这最多支持 4096 个模组,每个模组 4096 个通道。
聚合与压缩
优化原版经常产生大量小型网络数据包的情况。在 Connection 层面拦截传输,每 20 毫秒将它们组装成一个大型网络数据包,并在压缩后发送。
┌---┬----┬----┬----┬----┬----┬----... │ S │ p0 │ s0 │ d0 │ p1 │ s1 │ d1 ... └---┴----┴----┴----┴----┴----┴----... └--数据包 1---┘└--数据包 2---┘ └----------已压缩----------┘
- S = varint,压缩缓冲区大小
- p = 前缀(medium/int/utf-8),此子数据包的类型
- s = varint,此子数据包的大小
- d = 字节,此子数据包的数据
延迟区块缓存
在原版中,当玩家移动时,服务器会指示客户端立即遗忘其身后的区块;如果玩家返回原位置,则需要重新发送完整的区块数据。通过延迟这种“遗忘”,可以节省来回往返时产生的区块传输流量。
配置
修改位于 config/NotEnoughBandwidthConfig.json 的配置文件。
compatibleMode
客户端与服务器独立生效。
是否启用兼容模式。若设为 true,将使用下方的 blackList。
blackList
客户端与服务器独立生效。
兼容模式的黑名单。列在此处的数据包将被 NEB 跳过。默认包含一系列与 Velocity 相关的数据包,但您可以根据需要添加新的数据包。
为确保数据包顺序,黑名单中的数据包会中断正在进行的聚合。如果黑名单中的数据包较多,或对应数据包发送过于频繁,聚合压缩的效率将会降低。
contextLevel
客户端与服务器独立生效。
用于压缩的上下文窗口大小。有效值为 21 至 25 的整数,分别代表 2MB 至 32MB。默认值为 23(8MB)。
上下文窗口越大,压缩效果越好,节省的带宽越多,但会消耗更多内存。
对于有 100 名玩家的服务器,设置为 25 将导致约 3200MB 的额外内存使用。
dccSizeLimit、dccDistance、dccTimeout
仅在服务器端生效。
延迟区块缓存(DCC)允许的最大缓存区块数、缓存区块距离和缓存超时时间。较大的值可能会消耗更多内存,而较小的值可能会更频繁地触发更新。
正在加载版本记录…
正在加载评论…
评论在新手盒子客户端中发表,这里同步展示。