ZSTDNET

ZSTDNET

使用ZSTD对客户端与服务器之间的流量进行压缩和转发,旨在高冗余数据场景下减少公共带宽占用。

性能

ZstdNet (v1.4.7)

ZstdNet 是一款 Minecraft Java 版模组,使用 ZSTD 算法压缩客户端与服务器之间的中继流量。它旨在减少高重复性模组流量下的公共带宽使用,尤其适用于大型基于 Create 的整合包、FRP/NAT 穿透方案、隧道转发,以及希望共享更省带宽的外部入口点的单人游戏局域网主机。

ZstdNet 负责转发和压缩。如果您希望在保持后端离线的情况下仍进行正版账号验证,可以将该模组与 TrueUUID(https://www.curseforge.com/minecraft/mc-mods/trueuuid) 等模组配合使用。

亮点特性

  • 加入 ZstdNet 地址时自动启动一个临时的本地客户端代理。
  • 提供服务器端压缩入口点,并将流量转发至后端 Minecraft 端口。
  • 支持专用服务器和从单人游戏托管的局域网世界。
  • 支持默认自动接管模式,使专用服务器玩家可以继续使用相同的公共地址和端口。
  • 包含游戏内 HUD,显示连接模式、吞吐量、总流量、压缩率和连接数。
  • 保持原版服务器列表 ping 透传功能正常工作。
  • 在客户端本地代理上提供同端口 UDP 透传,用于 Sable / Create Aeronautics 等模组。
  • 为 Simple Voice Chat 及类似的 UDP 语音方案提供原始 UDP 透传路由。

实际效果示例

该模组的主要目的是减少由高度重复的数据包流量引起的公共带宽消耗。在大型整合包中,压缩效果可能非常显著。以下是一个真实基于 Create 的环境中的服务器端统计数据示例:

原始:189.06 GB(3.6MB/s)| Zstd:10.28 GB(252.7KB/s)| 压缩率:5.44% | 连接数:8

原始:189.06 GB(5.0MB/s)| Zstd:10.28 GB(234.3KB/s)| 压缩率:5.44% | 连接数:8

原始:189.06 GB(3.2MB/s)| Zstd:10.28 GB(215.5KB/s)| 压缩率:5.44% | 连接数:8

原始:189.07 GB(4.8MB/s)| Zstd:10.28 GB(303.7KB/s)| 压缩率:5.44% | 连接数:8

压缩率越低,压缩后实际传输的流量越少。

支持的版本

本仓库目前提供以下版本的构建:

  • Forge 1.20.1
  • NeoForge 1.20.1
  • NeoForge 1.21.1
  • Fabric 1.20.1
  • Fabric 1.21.1

安装

推荐的安装方式取决于您的使用场景:

  • 加入远程启用 ZstdNet 的服务器:在客户端安装 ZstdNet。
  • 托管带有内置 ZstdNet 入口的专用服务器:在服务器端安装 ZstdNet。
  • 将单人游戏世界开放至局域网并在外部共享 Zstd 入口:在主机客户端安装 ZstdNet。

建议同时在客户端和服务器端安装,以获得最流畅的体验。

本地流量仪表盘

服务器会自动存储每日总计、五分钟时间序列以及每次运行的记录。TCP、UDP、入站、出站、原始字节和线上字节会分别在 config/zstdnet/stats/ 目录下独立跟踪。

拥有命令权限等级 2 的玩家可以从模组客户端请求报告:

/zstdreport today
/zstdreport session
/zstdreport 24h
/zstdreport 7d
/zstdreport 30d

服务器仅通过游戏连接返回聚合的 JSON 数据。客户端会在 .minecraft/config/zstdnet/reports/ 目录下生成一个自包含的 HTML 文件,并在聊天中显示一个可点击的“打开流量仪表盘”消息。

报告页面提供“全部”、“1小时”、“6小时”和“12小时”筛选器,以及报告内自定义的开始和结束时间。/zstdreport 30d 报告还提供“1天”和“7天”筛选器。趋势图、流量摘要、方向拆分和带宽参考值会同步更新。

该仪表盘支持深色和浅色模式,以及十种颜色预设:默认、极简单色、午夜、玫瑰花园、极光、日落辉光、森林低语、海风、薰衣草之梦。每种预设均使用高对比度的入站/出站颜色对。带宽参考值以 KiB/s 和 Mbps 两种单位显示,其中 1 Mbps = 1,000,000 bit/s。主题选择由浏览器本地存储。

玩家如何连接

在推荐的专用服务器设置中,保持以下配置:

auto_takeover=true

在这种模式下,玩家通常继续使用他们已经知道的公共地址和端口,例如:

play.example.com:25565
1.2.3.4:25565

ZstdNet 会自动接管 server.properties 中的公共服务器端口,将后端 Minecraft 服务器移至另一个本地端口,并在内部转发压缩流量。玩家无需为了 ZstdNet 额外学习第二个端口。

仅当在手动模式下使用 auto_takeover=false 时,玩家才需要连接到配置的 listen 端口。

专用服务器设置

首次启动时,ZstdNet 会生成:

config/zstdnet-server.properties

推荐的默认配置为:

enabled=true
auto_takeover=true

使用此设置时:

  • 玩家继续连接到原来的公共端口。
  • ZstdNet 使用该端口作为压缩公共入口。
  • 后端 Minecraft 服务器会自动移至另一个空闲的本地端口。
  • 通常无需手动规划 listen 和 target。

如果您使用 FRP、HAProxy、NAT 穿透或任何其他转发层,请确保公共入口转发到 ZstdNet 的 listen 端口。不要直接转发到后端原版游戏端口,否则压缩将被绕过。

对于 Sable / Create Aeronautics 等需要同端口 UDP 的模组,请确保转发层在同一公共端口上同时转发 TCP 和 UDP。

后端服务器说明

对于专用服务器代理式设置,后端 Minecraft 服务器应使用以下配置运行:

online-mode=false

ZstdNet 负责转发和压缩。如果您希望在保持后端离线的情况下仍进行正版账号验证,可以将该模组与 TrueUUID 等模组配合使用。

单人游戏 / 局域网托管

当将单人游戏世界开放至局域网时,ZstdNet 会在“对局域网开放”界面中添加一个 Zstd 端口字段,并保持常规游戏端口字段与 vanilla 或受支持的扩展局域网界面兼容。

推荐用法:

  • 除非您明确需要固定的 Minecraft 局域网端口,否则请将游戏端口留空。ZstdNet 会跟随当前会话实际使用的局域网端口。
  • Zstd 端口优先使用配置的端口。如果该端口已被局域网会话或语音路由占用或保留,ZstdNet 会自动回退到另一个可用端口。
  • 局域网世界开放后,游戏内聊天会打印实际的 Zstd 端口。该消息中的 Zstd 端口可以点击复制。

活动设置存储在以下位置:

config/zstdnet-server.properties

并支持热重载。

如果朋友从您的本地网络外部加入,请给他们以下地址:

您的公共 IP 或域名:聊天中显示的实际 Zstd 端口

示例:

mc.example.com:35565
203.0.113.10:35565

如果另一个局域网模组完全替换了“对局域网开放”界面且 Zstd 字段不可见,请使用:

/zstdport show

查看当前端口。仅在需要固定公共或隧道端口时使用:

/zstdport zstd <port>

命令

/zstdhud

用于查看或切换 HUD:

/zstdhud
/zstdhud on
/zstdhud off
/zstdhud toggle

/zstdport

用于在单人游戏 / 局域网托管场景中查看或更改端口:

/zstdport show
/zstdport game 25565
/zstdport zstd 35565
/zstdport voice 25565
/zstdport zstdvoice 24455

说明:

  • /zstdport 是客户端命令。
  • show 显示当前生效的配置。
  • game 更改首选的后端游戏端口。
  • zstd 更改首选的 Zstd 监听端口。
  • voice 更改 voice_chat_target,即后端语音端口。
  • zstdvoice 更改 voice_chat_listen,即公共语音入口。
  • 在正常局域网托管中,通常不需要手动运行这些命令。
  • 对于专用服务器,请直接编辑 config/zstdnet-server.properties。

HUD 面板

启用 HUD 后,您可以查看:

  • 当前连接模式
  • 监听地址或远程目标地址
  • 压缩后的实时吞吐量
  • 原始实时吞吐量
  • 总传输流量
  • 压缩率
  • 当前连接数

HUD 是确认连接是否实际使用 ZstdNet 的最简单方式。

Simple Voice Chat / UDP 说明

Simple Voice Chat 的音频不会被 ZstdNet 压缩。ZstdNet 将 UDP 语音包作为原始透传进行转发。

  • 如果 Simple Voice Chat 使用自己的 UDP 端口,请在需要时显式设置 voice_chat_listen。
  • voice_chat_target 通常可以留空,默认会使用本地语音端口。
  • 如果 UDP 路由无法启用,游戏 TCP 路径仍然有效,但语音聊天可能保持离线状态。

常见问题解答

为什么我无法加入服务器?

请首先检查以下各项:

  1. 如果 auto_takeover=true,玩家应继续使用 server.properties 中的常规公共端口。
  2. 如果 auto_takeover=false,请确保玩家使用配置的 listen 端口。
  3. 确保 FRP 或其他隧道转发到 ZstdNet 的 listen 端口。
  4. 确保在 config/zstdnet-server.properties 中设置了 enabled=true。
  5. 在手动模式下,确保 listen 和 target 没有颠倒。
  6. 确保 Zstd 端口未被防火墙规则阻止或已被其他程序占用。
  7. 在局域网托管中,使用聊天中显示的实际 Zstd 端口。游戏端口通常可以留空,因为 ZstdNet 会自动跟随当前局域网会话的端口。
  8. 确保没有其他模组拦截登录或握手流程。

压缩率接近 100% 是否表示其未生效?

不一定。某些流量压缩效果不佳,或者可能已经加密,这会降低压缩带来的收益。

这会与其他多人游戏模组冲突吗?

有可能。ZstdNet 旨在与 vanilla 和常见的局域网界面模式兼容,但大量重写 UI 的菜单仍可能需要通过 /zstdport show 或 /zstdport zstd <port> 进行命令回退。

配置文件

  • 客户端:config/zstdnet-client.toml
  • 服务器:config/zstdnet-server.properties

zstdnet-server.properties 会自动维护。当端口通过命令或自动接管更改时,该文件会使用内置的带注释模板重新写入。

重要的服务器选项:

  • enabled:启用或禁用 ZstdNet 服务。
  • auto_takeover:在专用服务器上自动使用 server.properties 中的 server-port 作为公共入口。
  • listen:手动模式下的 Zstd 压缩入口地址和端口。
  • target:手动模式下的后端 Minecraft 服务器地址和端口。
  • level:压缩强度,范围 1-22。
  • voice_chat_passthrough:启用语音聊天的原始 UDP 透传。
  • voice_chat_listen:可选的语音聊天公共 UDP 入口。
  • voice_chat_target:可选的语音聊天后端 UDP 目标。

客户端配置:

[general]
level = 3

level 控制客户端到服务器的 Zstd 压缩级别。更高的级别可能压缩效果更好,但会消耗更多 CPU。取值在 3-5 左右通常是较好的平衡点。

依赖项

  • zstd-jni

许可证

MIT 许可证