gmod-rs/docs/NETWORK.md

5 KiB
Raw Permalink Blame History

Сеть Source RS

1. Протокол

  • Source 2013, net protocol 24 + GMod-расширения.
  • Транспорт: UDP → netchan (фрагментация, надёжность, bzip2-сжатие).
  • Signon: server info, stringtables, server classes/datatables, baselines, signon-данные, передача карты и файлов.
  • Игра: delta-снапшоты по сервер-классам (PVS-интерес сервера), usermessages, clc_* (move, userinfo, voice …), физика-апдейты.
  • GMod-специфика:
    • передача Lua-файлов с сервера (LZMA-сжатие);
    • net.*-каналы (имена через stringtable);
    • регистрация usermessages/энтити-классов скриптами;
    • userinfo (steamid/имя/модель), идентификация клиента по версии (garrysmod.ver).

2. Steam

  • steamworks-rs:
    • AuthSessionTicket — для серверов с VAC (ClassicBox — VAC=1);
    • ISteamUGC — подписка/скачивание workshop-контента сервера; монтируем локально (это ключ к быстрым заходам: что есть у Steam — не качаем по UDP).
  • Отдельный steam-поток: Steam API не потокобезопасен; наружу — каналы.
  • Fallback: конвар noSteam (для локального srcds/LAN).

3. Передача файлов и ускорение захода

Приоритет источника файла:

локальный workshop/аддоны → постоянный download-кэш → UDP-трансфер с сервера
  • Параллельная декомпрессия кусков, запись в кэш по контенту (вечный кэш).
  • Стриминг-парсинг: BSP-лумпы и Lua обрабатываются по мере поступления, а не после полной загрузки.
  • Возобновление и докачка; реконнект без повторной загрузки.
  • Прогрев: фоновый precache ассетов во время коннекта.

4. Dump / Replay (ключевой инструмент разработки)

  • Dump: net-слой пишет сырые UDP-пакеты с временными метками + метаданные подключения в файл.
  • Replay: подача дампа в декодер без сокета → воспроизводимость багов, стресс-сцены и регрессии без живого сервера.
  • Источники дампов: наш клиент (M2+); tcpdump во время игры в настоящий GMod (если появится рабочий клиент на машине).

5. Слои и изоляция

netchan (UDP/фрагменты/bz2) → потоки сообщений → delta/signon-декод
→ очередь «снапшот готов» → main-поток (интерполяция, энтити)
  • Всё из сети — bounded-парсеры: лимиты на размеры строк/массивов, количество энтити/чанков, глубину структур; NaN/Inf-фильтры для позиций/углов.
  • Никаких блокировок в горячих путях; применение — двойной буфер.
  • Ошибки сети — типизированные; невалидный пакет логируется и отбрасывается.

6. Спецификации и референсы

Источник Что берём
Source SDK 2013 (net_chan.cpp, dt_recv.cpp, dt_encode.cpp, baseclient.cpp) Формат сообщений, CLC_/SVC_, дельта-кодирование
Source.NET (Source.Engine/netsocket) Работающая структура сетевого слоя (как спека)
leysourceengineclient Базовый сетевой протокол для внешних клиентов
GMod wiki Поведение net.-библиотеки, usermessages
Sнаши capture'ы Недокументированная GMod-специфика (формат Lua-трансфера, порядок инициализации)

7. Риски

  • Недокументированные GMod-детали (точный формат передаваемых Lua, порядок bootstrap, нюансы userinfo) — снимаем capture'ами и replay-стендом в M2.
  • Требование Steam-тикета — проверяем на ClassicBox; fallback noSteam.
  • Ограничения сервера (скорость отдачи, лимиты) — вне нашего контроля; ускоряем всё, что зависит от клиента (кэш, локальный контент, параллельный декод).