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