一句话概括:ZstdNet 是一个 Minecraft Java 版联机加速神器,用 Zstandard 压缩算法把客户端↔服务端之间的网络流量狠狠压扁,特别适合大整合包、机械动力系服务器、FRP 内网穿透等"带宽吃紧但数据量爆炸"的场景。


我们遇到的问题:为什么联机会这么吃带宽?

如果你开过大型整合包服务器,一定对这种场景不陌生:

  • 服里跑了一堆 机械动力(Create)、传送带、旋转轴、流体管道——每帧都在疯狂同步

  • FRP / 星空穿透 / 各类隧道​ 把家庭宽带暴露出去,发现 VPS 的 5Mbps 小水管瞬间打满

  • 朋友进来看起来卡卡的,但你本地实际 TPS 并不低——瓶颈在 公网带宽,不在 CPU

根本原因:原版 MC 的网络包虽然做了 zlib 压缩,但对高重复度的 modded 流量来说,压缩效率远不够。大量相似数据反复传输,zlib 压不动,公网就得老老实实把这些字节运过去。


ZstdNet 是什么?它是怎么解决的?

ZstdNet的核心思路非常聪明且务实:

不直接去改 MC 内部的封包格式,而是在连接链路上插一层"压缩代理"——客户端本地起一个临时代理,服务端侧起一个 ZstdNet 入口,两者之间的流量用 Zstandard (ZSTD)​ 压缩后再走公网。

[Client MC] → (本地代理·ZSTD压缩) ======公网====== (ZstdNet入口·ZSTD解压) → [Backend MC服务端]

ZSTD 是 Facebook/Meta 开源的现代压缩算法,它的特点就是三个字:快、狠、稳

算法

压缩率

压缩速度

解压速度

zlib (MC原版)

基准

~105 MB/s

~390 MB/s

ZSTD (-1)

~5.5% 更好

~510 MB/s

~1550 MB/s

ZSTD 不仅压得更小,而且 解压速度是 zlib 的近 4 倍——这意味着服务端 CPU 压力反而更小。


📊 真实数据说话:它能省多少?

这是作者给出的 真实的 Create 系大型整合包环境​ 的服务端侧统计:

数值

未压缩原始流量

189.06 GB​ 总量(实时约 3~5 MB/s)

经 ZSTD 后实际走公网

仅 10.28 GB(实时约 200~300 KB/s)

压缩率

5.44%​ ≈ 降低约 18 倍带宽

也就是说——原来需要 30~40 Mbps 持续吞吐的流量,压完之后只需要不到 2 Mbps。对按流量计费的 VPS、对 5Mbps 的小带宽云主机来说,这就是能不能撑住的区别。


🎯 最适合用 ZstdNet 的场景

场景

为什么适合

🏭 大型整合包服务器(机械动力 / 管道类 mod 密集)

高频同步数据多、重复度高,ZSTD 吃得准

🔗 FRP / 内网穿透 / 隧道转发联机

公网带宽是瓶颈,压缩链路直接砍掉 90%+ 流量

🏠 单人世界"开放局域网"让朋友公网加入

上传带宽通常很小,更需要压缩

☁️ VPS 带宽小但玩家数不少

把 189GB 压成 10GB,费用和省心程度天差地别


⚙️ 安装与使用(超简短版)

服务端

  1. 把 ZstdNet 放进服务端的 mods/文件夹

  2. 保持默认 auto-takeover(自动接管)模式开启(默认就是开的)

  3. 后端 MC 的 server.properties里确认 server-port=25565

  4. ⚠️ 关键:如果你前面有 FRP / HAProxy / 隧道,转发目标必须是 ZstdNet 的监听端口,不能绕过它直连后端 MC 端口

  5. ⚠️ 正版验证提示:后端建议设 online-mode=false(因为加密数据无法压缩)。如果需要保留正版校验,可搭配 TrueUUID​ 等正版离线共存模组

玩家照常填 play.example.com:25565连进来就行——不需要让玩家记新端口

客户端

  • 把 ZstdNet 放进客户端的 mods/文件夹即可

  • 连服时模组会在本地透明启动代理,你感觉不到变化

  • 进服后可以输 /zstdhud on打开 HUD,看实时数据:

[ZstdNet] Connected | Remote: play.example.com:25565
Raw: 3.6 MB/s → Zstd: 252 KB/s | Total: 189.06 GB → 10.28 GB | Ratio: 5.44%

这个 HUD 是最直观的"它到底有没有生效"判据

房主 LAN 开服 + FRP 场景

开放局域网后聊天框会弹出绿色端口号(游戏端口),然后在 ZstdNet UI 里填:

  • 游戏端口​ = 那个绿色数字

  • ZSTD / 公网端口​ = 你 FRP 对外映射的端口

高级情况也可以用:

/zstdport game <游戏端口>
/zstdport zstd <公网端口>

⚠️ 几个容易踩坑的点

说明

只装客户端没用

服务端也必须部署 ZstdNet 入口,否则压缩链路建不起来

FRP 别指错端口

转发到后端 25565 原版端口 = ZstdNet 被绕过 = 白装

语音流量不压缩

Simple Voice Chat 走 UDP,ZstdNet 只做原样透传(这反而是正确行为)

加密=不可压缩

online-mode=true下包被加密,ZSTD 压不动 → 建议后端离线 + TrueUUID

UDP 模组要额外放行

防火墙/安全组记得放通同端口的 UDP(Sable、Create Aeronautics 等会用到)


同类方案的一句话对比

方案

思路

适合谁

ZstdNet​ ⭐

链路层代理 + ZSTD 压缩转发,不改 MC 协议内部

通用,尤其穿透/小带宽场景

ZstdMC / ZSTD Compresser

替换 MC 内置 zlib 压缩管线为 zstd

双方都能装 mod 的直接连接场景

ZstdNet-Velocity

Velocity 代理侧的 ZSTD 桥接插件

你已经用 Velocity 多子服架构

ZstdNet 最大的优势其实是 "透明"​ ——玩家不需要改连接习惯,服主不需要重构网络架构,丢进 mods 文件夹就能干活。


总结:什么时候值得上?

如果你的服务器满足"mod 多 + 同步频繁 + 公网带宽捉襟见肘"这三个条件中的任意两个,ZstdNet 基本就是必装。

它不是什么花哨的新玩法,它就是那种默默帮你把带宽账单砍掉 90% 的幕后苦力。装上之后你唯一会后悔的事,大概就是——怎么没早点装。


📦 下载地址ZstdNet @ MC百科| 支持 Forge / NeoForge / Fabric,覆盖 1.20.1 & 1.21.1

📄 许可证:MIT | 源码可在模组页找到

如果你装完之后 HUD 显示 Ratio 还是压不下去,先别怀疑模组——检查是不是 online-mode=true加密了流量,或者 FRP 端口指到了后端原版口而非 ZstdNet 口 😉

没人敢说自己的人生很轻松。但可以肯定,这就是它的迷人之处。