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