88 lines
5.7 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.

# Handshake
После успешной установки защищённого соединения, происходит обмен характеристиками обоих сторон, AKA "рукопожатие". Запрашивающий соединение отправляет пакет следующего формата:
`[magic number: 8B][protocol version: 4B][sizes: 1B][reconnection flags: 2B]`
- Магическое число
- _Тип:_ `uint64_t`
- Магическое число протокола, по которому определяется совместимость цели с протоколом MFP. См. раздел "Магическое число" для справки.
- Версия протокола
- _Тип:_ `uint32_t`
- Поддерживаемая запрашивающим версия протокола.
- Размерности частей пакета
- _Тип:_ `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`
- Флаги переподключения
- _Тип:_ `uint16_t`
- Описывает параметры нового подключения:
- `0b0000000000000000`: оставить текущее подключение
- `0b0000000000000001`: переподключиться к тому-же порту
- `0b0000000000000010`: запросить новый порт для подключения
- `0b0000000000000100`: использовать TCP
- `0b0000000000001000`: использовать TLS
- `0b0000111111110000`: резерв под расширение
- `0b1111000000000000`: резерв под под нужды сторонних реализаций
На что целевой сервер отвечает пакетом либо с согласием, либо ошибкой. Пакет с согласием имеет следующий формат:
`[magic number: 8B][0x00][reconnection port: 2B]`
- Магическое число
- _Тип:_ `uint64_t`
- См. выше.
- `0x00`
- _Тип:_ `uint8_t`
- Байт с фиксированным нулевым значением, свидетельствующий об успешном подключении и принятии целевым сервером обозначенных условий.
- Порт для переподключения
- _Тип:_ `uint8_t`
- К указанному порту целевой сервер предлагает подключиться запрашиваемому, если тот запросил его. Значение должно быть нулём, если порт не был запрошен.
Пакет с ошибкой имеет следующий формат:
`[magic number: 8B][error code: 1B][error description: ~B, zero-terminated]`
- Магическое число
- _Тип:_ `uint64_t`
- См. выше.
- Код ошибки
- _Тип:_ `uint8_t`
- Код, описывающий ошибку конкретнее.
- 0x01: магическое число ложно.
- 0x02: неподдерживаемая версия протокола.
- 0x03: невозможно выделить новый порт для подключения.
- 0x04: указанный транспортный протокол не поддерживается.
- 0x05: указанная конфигурация размерностей не поддерживается.
- Описание ошибки
- _Тип:_ `uint8_t`
- Текстовое описание ошибки. Является строкой в кодировке ASCII, оканчивающейся нулевым байтом.
Если цель не поддерживает указанную при рукопожатии версию протокола, запрашивающий может попробовать установить соединение снова, указав более низкую и поддерживаемую им версию протокола.
Если при хэндшейке запрашивающим был указан новый способ подключения и получен валидный ответ с согласием от сервера - то они обязаны разорвать текущее соединение, затем, спустя случайное количество времени, от 50 мс до 500 мс, создать новое.
## Магическое число
Магическим числом протокола является следующая последовательность байт:
```
HEX: 0x4d 0x61 0x72 0x61 0x66 0x6f 0x6e 0x50
DEC: 77 97 114 97 102 111 110 80
```
Что соответствует строке "MarafonP" в кодировке ASCII.