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