8.5 KiB
Рукопожатие
Протокольного уровня
После успешного подключения к целевому узлу через избранный транспорт - происходит обмен параметрами обоих сторон, AKA "рукопожатие протокольного уровня". Инициирующий соединение узел отправляет пакет следующего формата:
[magic number: 8B][protocol version: 4B][crypto params: 8B][noise params: 1B][reconnection flags: 4B]
-
Магическое число
- Тип:
uint64_t
- Магическое число протокола, по которому определяется совместимость цели с протоколом Stadium. См. раздел "Магическое число" для справки.
- Тип:
-
Версия протокола
- Тип:
uint32_t
- Поддерживаемая запрашивающим версия протокола.
- Тип:
-
Параметры криптографии
- Тип:
CryptoAlgo[4]
- Описывает используемые криптографические алгоритмы на уровне прямого подключения (т.е. "узел-узел"). Первый элемент выделен под хэш-функцию; второй для ассиметричной функции подписи; третий для ассиметричной функции шифрования; четвёртый для симметричной функции.
- Если равно нулю, то используются опции данной версии протокола по умолчанию (SHA-384, RSA-3072, AES-256).
- Тип:
-
Параметры генерации шума в соединении
- Тип:
uint8_t
- Описывает прочие параметры соединения:
0b11100000
: выделено под настройки количества шумовых пакетов0b000
: отсутствие шумовых пакетов0b001
: количество задаётся по усмотрению целевого узла0b010
: соотношение шумовых пакетов к реальным - 1:80b011
: соотношение - 1:40b100
: 1:20b101
: 1:10b110
: 2:10b111
: 4:1
0b00011000
: выделено под настройки размера шумовых пакетов0b00
: по усмотрению целевого узла0b01
: случайный размер, в пределах от минимального пакета с нулевой полезной нагрузкой, до размера пакета с полезной нагрузкой размерности, которую должен передать целевой узел при одобрении рукопожатия0b10
: случайный размер, в пределах от минимального, до максимального / 20b11
: случайный размер, на основе среднего размера передаваемого пакета +- 25% (но всегда меньше максимального)
0b00000111
: выделено под настройки размера шумовых данных в обычных пакетах0b000
: без шумовых данных0b001
: заполнение шумовыми данными до лимита полезной нагрузки0b010
: заполнение шумовыми данными в случайном количестве, от нуля, до лимита полезной нагрузки- Диапазон
0b011
-0b111
: зарезервировано
- Тип:
-
Флаги переподключения
- Тип:
uint32_t
- Описывает параметры нового подключения:
0b00000000000000000000000000000000
: оставить текущее подключение0b00000000000000000000000000000001
: запросить новый транспорт для подключения0b00000000000000000000000000000100
: использовать TCP0b00000000000000000000000000010000
: использовать TLS0b00001111111111111111111111101010
: резерв под расширение0b11110000000000000000000000000000
: резерв под под нужды сторонних реализаций
- Тип:
На это целевой узел отвечает пакетом либо с согласием, либо с ошибкой.
Пакет с согласием имеет следующий формат:
[magic number: 8B][0x00][reconnection port: 2B][event payload max size: 2B]
-
Магическое число
- Тип:
uint64_t
- См. выше.
- Тип:
-
0x00
- Тип:
uint8_t
- Байт с фиксированным нулевым значением, свидетельствующий об успешном подключении и принятии целевым узлом обозначенных условий.
- Тип:
-
Порт для переподключения
- Тип:
uint16_t
- К указанному порту целевой узел предлагает подключиться запрашиваемому, если тот запросил его. Значение должно быть нулём, если порт не был запрошен.
- Тип:
-
Максимальный размер полезной нагрузки
- Тип:
uint16_t
- Всегда больше нуля. Запрашивающий должен соблюдать размерность полезной нагрузки в событии и она всегда должна быть равна или меньше этого значения.
- Тип:
Пакет с ошибкой имеет следующий формат:
[magic number: 8B][error code: 1B][error description: ~B, zero-terminated]
-
Магическое число
- Тип:
uint64_t
- См. выше.
- Тип:
-
Код ошибки
- Тип:
uint8_t
- Код, описывающий ошибку конкретнее.
0x01
: магическое число ложно.0x02
: неподдерживаемая версия протокола.0x03
: невозможно выделить новый порт для подключения.0x04
: указанный транспортный протокол не поддерживается.0x05
: указанная конфигурация размерностей не поддерживается.0x06
: недопустимые (несуществующие) параметры криптографии.0x07
: один из указанных криптографических алгоритмов отключён на узле.
- Тип:
-
Описание ошибки
- Тип:
uint8_t
- Текстовое описание ошибки. Является строкой в кодировке ASCII, оканчивающейся нулевым байтом.
- Тип:
Если цель не поддерживает указанные при рукопожатии параметры, запрашивающий может попробовать установить соединение снова, с иными значениями.
Если при хэндшейке запрашивающим был указан новый способ подключения и получен валидный ответ с согласием от целевого узла - то они обязаны разорвать текущее соединение, затем, спустя разумное случайное количество времени, создать новое.
Магическое число
Магическим числом протокола является следующая последовательность байт:
HEX: 0x53 0x74 0x61 0x64 0x69 0x75 0x6d 0x50
DEC: 83 116 97 100 105 117 109 80
Что соответствует строке "StadiumP" в кодировке ASCII.