gmod-rs/docs/NETWORK.md

77 lines
5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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