2023-07-04 09:00:55 +05:30
# Handshake
2023-10-03 05:40:20 +05:30
## Protocol-level handshake
После успешной установки соединения происходит обмен характеристиками обоих сторон, AKA "рукопожатие протокольного уровня". Запрашивающий соединение отправляет пакет следующего формата:
2023-07-04 09:00:55 +05:30
2023-09-06 08:31:23 +05:30
<!-- `[magic number: 8B][protocol version: 4B][sizes: 1B][crypto params: 6B][reconnection flags: 4B]` -->
2023-10-03 05:40:20 +05:30
`[magic number: 8B][protocol version: 4B][crypto params: 8B][reconnection flags: 4B]`
2023-07-04 09:00:55 +05:30
- Магическое число
- _Т ип:_ `uint64_t`
2023-07-05 01:52:39 +05:30
- Магическое число протокола, по которому определяется совместимость цели с протоколом Stadium. См. раздел "Магическое число" для справки.
2023-07-04 09:00:55 +05:30
- Версия протокола
- _Т ип:_ `uint32_t`
- Поддерживаемая запрашивающим версия протокола.
2023-09-06 08:31:23 +05:30
<!-- - Размерности частей пакета
2023-07-04 09:00:55 +05:30
- _Т ип:_ `uint8_t`
- Описывает некоторые параметры пакетов.
- Маска `0b11000000` : выделено под размерности типа событий
- `0b00` : резерв
- `0b01` : категория и подкатегория это `uint8_t` (каждая)
- `0b10` : категория - `uint8_t` , подкатегория - `uint16_t`
- `0b11` : категория и подкатегория это `int16_t` (каждая)
- Маска `0b00110000` : выделено под размерность ключа в ячейке полезной нагрузки
- `0b00` : резерв
- `0b01` : ключ это `uint8_t`
- `0b10` : ключ это `uint16_t`
- `0b11` : ключ это `int32_t`
- Маска `0b00001100` : выделено под размерность данных в ячейке
- `0b00` : резерв
- `0b01` : размер данных это `uint8_t`
- `0b10` : размер данных это `uint16_t`
- `0b11` : размер данных это `uint64_t`
2023-09-06 08:31:23 +05:30
- Маска `0b00000011` : резерв-->
2023-07-05 01:52:39 +05:30
- Параметры криптографии
2023-10-03 05:40:20 +05:30
- _Т ип:_ `CryptoAlgo[4]`
- Описывает используемые криптографические алгоритмы на уровне прямого подключения (т.е . "сервер-сервер" или "сервер-клиент"). Первый элемент выделен под хэш-функцию; второй для ассиметричной функции подписи; третий для ассиметричной функции шифрования; четвёртый для симметричной функции.
2023-07-17 07:59:20 +05:30
- Если равно нулю, то используются опции данной версии протокола по умолчанию (SHA256, RSA-2048, AES-192).
2023-07-04 09:00:55 +05:30
- Флаги переподключения
2023-07-11 07:13:24 +05:30
- _Т ип:_ `uint32_t`
2023-07-04 09:00:55 +05:30
- Описывает параметры нового подключения:
2023-07-11 07:13:24 +05:30
- `0b00000000000000000000000000000000` : оставить текущее подключение
- `0b00000000000000000000000000000001` : переподключиться к тому-же порту
- `0b00000000000000000000000000000010` : запросить новый порт для подключения
- `0b00000000000000000000000000000100` : использовать TCP
- `0b00000000000000000000000000010000` : использовать TLS
- `0b00001111111111111111111111101000` : резерв под расширение
- `0b11110000000000000000000000000000` : резерв под под нужды сторонних реализаций
2023-07-04 09:00:55 +05:30
2023-07-05 01:52:39 +05:30
Н а что целевой сервер отвечает пакетом либо с согласием, либо ошибкой.
Пакет с согласием имеет следующий формат:
2023-07-04 09:00:55 +05:30
2023-10-03 05:40:20 +05:30
`[magic number: 8B][0x00][reconnection port: 2B][event payload max size: 2B]`
2023-07-04 09:00:55 +05:30
- Магическое число
- _Т ип:_ `uint64_t`
- См. выше.
- `0x00`
- _Т ип:_ `uint8_t`
- Байт с фиксированным нулевым значением, свидетельствующий о б успешном подключении и принятии целевым сервером обозначенных условий.
- Порт для переподключения
2023-10-03 05:40:20 +05:30
- _Т ип:_ `uint16_t`
2023-07-04 09:00:55 +05:30
- К указанному порту целевой сервер предлагает подключиться запрашиваемому, если тот запросил е г о . Значение должно быть нулём, если порт не был запрошен.
2023-10-03 05:40:20 +05:30
- Максимальный размер полезной нагрузки
- _Т ип:_ `uint16_t`
- Всегда больше нуля. Запрашивающий должен соблюдать размерность полезной нагрузки в событии и она всегда должна быть равна или меньше этого значения.
2023-07-04 09:00:55 +05:30
Пакет с ошибкой имеет следующий формат:
`[magic number: 8B][error code: 1B][error description: ~B, zero-terminated]`
- Магическое число
- _Т ип:_ `uint64_t`
- См. выше.
- Код ошибки
- _Т ип:_ `uint8_t`
- Код, описывающий ошибку конкретнее.
- 0x01: магическое число ложно.
- 0x02: неподдерживаемая версия протокола.
- 0x03: невозможно выделить новый порт для подключения.
- 0x04: указанный транспортный протокол не поддерживается.
2023-10-03 05:40:20 +05:30
- 0x05: указанная конфигурация размерностей не поддерживается.
2023-07-05 01:52:39 +05:30
- 0x06: недопустимые параметры криптографии.
- 0x07: один из указанных криптографических алгоритмов отключён на сервере.
2023-07-04 09:00:55 +05:30
- Описание ошибки
- _Т ип:_ `uint8_t`
- Текстовое описание ошибки. Является строкой в кодировке ASCII, оканчивающейся нулевым байтом.
2023-10-03 05:40:20 +05:30
Если цель не поддерживает указанные при рукопожатии параметры, запрашивающий может попробовать установить соединение снова, с иными значениями.
2023-07-04 09:00:55 +05:30
2023-10-03 05:40:20 +05:30
Если при хэндшейке запрашивающим был указан новый способ подключения и получен валидный ответ с согласием от сервера - то они обязаны разорвать текущее соединение, затем, спустя случайное количество времени, от 10 мс до 500 мс, создать новое.
2023-07-04 09:00:55 +05:30
## Магическое число
Магическим числом протокола является следующая последовательность байт:
```
2023-07-05 01:52:39 +05:30
HEX: 0x53 0x74 0x61 0x64 0x69 0x75 0x6d 0x50
DEC: 83 116 97 100 105 117 109 80
2023-07-04 09:00:55 +05:30
```
2023-07-05 01:52:39 +05:30
Что соответствует строке "StadiumP" в кодировке ASCII.