5 KiB
5 KiB
Сеть 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.
- Ограничения сервера (скорость отдачи, лимиты) — вне нашего контроля; ускоряем всё, что зависит от клиента (кэш, локальный контент, параллельный декод).