Not Enough Bandwidth Fabric
Оптимизация сетевого трафика за счёт индексации заголовков пакетов, агрегации + сжатия Zstd, отложенного кэширования чанков и постоянной клиентской дедупликации чанков.
- Загрузчики
- Fabric
- Скачиваний на Modrinth
- 13,5 тыс.
- Подписчиков на Modrinth
- 6
- версий
- 45
- Обновлён
- 27 сентября 202627 сент.
- Опубликован
- в 2026
Коротко о моде
Нужен и в игре, и на сервере
Not Enough Bandwidth (NEB) — порт на Fabric
Fabric-мод для Minecraft 1.21.4 — оптимизация сетевого трафика за счёт индексации заголовков пакетов, агрегации + сжатия Zstd, отложенного кэширования чанков и постоянной дедупликации чанков на стороне клиента.
Нужна поддержка или порт для другой версии? Открой issue, вступи в группу QQ 362669270 (ссылка-приглашение) или напиши на support@rms.net.cn.
Это неофициальный порт оригинального мода на NeoForge от USS_Shenzhou. Если хочешь внести вклад в оригинальный проект, сначала обсуди это с USS_Shenzhou в Discord.
Введение
NEB использует различные методы, чтобы максимально сэкономить сетевой трафик во время игры в Minecraft, оставаясь при этом прозрачным как для модов, так и для игроков.
В датасете TeaCon Jiachen по сравнению с несжатыми данными NEB теоретически может сократить исходящий трафик сервера до 7,6% от исходного объёма. Для сравнения: исходящий трафик стандартного механизма сжатия в Vanilla составляет 39% от исходного объёма данных.
В тестах, проведённых в среде Vanilla, исходящий трафик сервера сократился до 18% от исходного объёма. Чем больше установлено модов, тем лучше работает сжатие.
Нажми Alt+N в игре, чтобы посмотреть состояние сетевого трафика.
Основные возможности
Компактный заголовок пакета
Оптимизирует кодирование и декодирование CustomPacketPayload, заменяя заголовок пакета Identifier (тип пакета) на компактный индекс VarInt. Это сокращает накладные расходы заголовка сетевого пакета мода до фиксированных 3-4 байт вместо длины строки, соответствующей типу сетевого пакета.
[!NOTE]
Фиксированный заголовок в 8 бит
+------------- 1 байт (8 бит) ----------------+ | флаги функции | +---+---+--------------------------------------+ | i | t | зарезервировано (6 бит) | +---+---+--------------------------------------+
- i = indexed (1 бит)
- t = tight_indexed (1 бит, действителен только если i=1)
- reserved = 6 бит (для будущего использования)
Индексированный тип пакета
- Если i=0 (не индексирован): далее идёт полный
Identifierв UTF-8.- Если i=1 и t=0 (индексирован, НЕ tight): 3 байта — 12-битный namespace-id + 12-битный path-id (вместимость по 4096 каждый).
- Если i=1 и t=1 (индексирован, tight): 2 байта — 8-битный namespace-id + 8-битный path-id (вместимость по 256 каждый).
Агрегация и сжатие
Оптимизирует ситуацию, когда Vanilla часто создаёт большое количество мелких сетевых пакетов. Перехватывает передачу на уровне Connection, собирает их в один крупный сетевой пакет каждые 20 мс и отправляет после сжатия Zstd.
[!NOTE]
+---+-----+----+----+----+----+----+----... | B | (S) | p0 | s0 | d0 | p1 | s1 | d1 ... +---+-----+----+----+----+----+----+----... +--пакет 1---+--пакет 2---+ +---------сжато---------+
- B = bool, сжато ли
- S = varint, размер несжатых данных (присутствует только если сжато)
- p = префикс (medium/int/utf-8), тип этого подпакета
- s = varint, размер этого подпакета
- d = байты, данные этого подпакета
Отложенный кэш чанков (DCC)
В Vanilla, когда игрок двигается, сервер даёт клиенту команду немедленно забыть чанки позади него; если игрок вернётся на исходную позицию, полные данные чанков придётся отправлять заново. Откладывая это «забывание», можно сэкономить трафик передачи чанков, возникающий при движении туда-сюда.
Persistent Chunk Cache (PCC)
Кэширует данные чанков на стороне клиента в локальной базе данных LevelDB, ключом служит 64-битный хеш содержимого. При каждом подключении клиент отправляет серверу фильтр Блума со всеми хешами закэшированных чанков. Когда сервер собирается отправить чанк, чей хеш есть в фильтре, он отправляет только 20-байтовый хеш вместо полного пакета (~10–20 КБ). Клиент загружает чанк из своей локальной базы данных. При ложном срабатывании фильтра Блума клиент запрашивает полные данные как запасной вариант. Фильтр Блума обновляется каждые 64 новых закэшированных чанка, чтобы оптимизация заработала в рамках той же сессии.
Настройка
Изменяйте файл конфигурации по пути config/NotEnoughBandwidthConfig.json.
compatibleMode
Работает независимо на клиенте и сервере.
Включать ли режим совместимости. Если установлено true, будет использоваться blackList ниже.
blackList
Работает независимо на клиенте и сервере.
Чёрный список для режима совместимости. Перечисленные здесь пакеты будут пропускаться NEB. Можете добавлять пакеты по необходимости.
[!WARNING] Чтобы обеспечить порядок пакетов, пакеты из чёрного списка прервут текущую агрегацию. Если в чёрном списке много пакетов или соответствующие пакеты отправляются слишком часто, эффективность агрегации-сжатия снизится.
compressionLevel
Работает независимо на клиенте и сервере.
Уровень сжатия Zstd (целое число 1-19). По умолчанию 6. Более высокие значения дают лучшее сжатие, но используют больше CPU.
contextLevel
Работает независимо на клиенте и сервере.
Размер контекстного окна Zstd (целое число 21-25, что соответствует 2-32 МБ). По умолчанию 23 (8 МБ). Большие значения дают лучшее сжатие, но потребляют больше памяти.
[!TIP] Для сервера на 100 игроков значение 25 приведёт примерно к 3200 МБ дополнительного расхода памяти.
dccSizeLimit, dccDistance, dccTimeout
Только сервер.
Параметры Delayed Chunk Cache (DCC): максимум закэшированных чанков, дистанция кэширования, тайм-аут кэша (в секундах). Большие значения могут потреблять больше памяти, а меньшие — чаще вызывать обновления.
chunkCacheEnabled
Только клиент.
Включать ли Persistent Chunk Cache. По умолчанию true.
chunkCacheMaxSizeMB
Только клиент.
Максимальный размер локальной базы данных кэша чанков в мегабайтах. По умолчанию 2048 (2 ГБ).
Установка
Требуется:
- Minecraft 1.21.4
- Fabric Loader >= 0.18.0
- Fabric API
И клиент, и сервер должны установить NEB. Когда подключается клиент без NEB, сервер для этого подключения возвращается к ванильному поведению.
Лицензия
Copyright (C) 2025 USS_Shenzhou
Этот мод — свободное ПО под GNU GPL 3.0. Подробности см. в LICENSE.
Дополнительные разрешения
Как игрок, когда вы загружаете и играете в эту программу в Minecraft, эта лицензия автоматически предоставляет вам все права, необходимые для нормальной загрузки и игры в эту программу в Minecraft, которые не покрыты лицензией GPL-3.0 или запрещены лицензией GPL-3.0. В случае конфликтов между лицензией GPL-3.0 и Minecraft EULA или другими условиями Mojang/Microsoft преимущество имеет последнее.
Частые вопросы
Как установить Not Enough Bandwidth Fabric?
Установите Fabric под свою версию Minecraft, скачайте Not Enough Bandwidth Fabric под ту же версию и загрузчик, положите файл в папку mods и запустите игру с профилем загрузчика.
Для каких версий Minecraft есть Not Enough Bandwidth Fabric?
У Not Enough Bandwidth Fabric есть сборки для Minecraft 1.21.4, 1.21.6, 1.21.10–26.1, 26.2 ….
Нужен ли Not Enough Bandwidth Fabric на сервере?
Нужен и в игре, и на сервере