网络包优化

网络包优化

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)允许的最大缓存区块数、缓存区块距离和缓存超时时间。较大的值可能会消耗更多内存,而较小的值可能会更频繁地触发更新。