Таки нужна поддержка нескольких потоков событий

This commit is contained in:
Shr3dd3r 2023-12-15 21:07:25 +03:00
parent 812465ec2e
commit 0c4e6cfcd1
4 changed files with 22 additions and 11 deletions

3
.gitignore vendored
View File

@ -1,7 +1,8 @@
Data types/DATA TYPES.md Data types/DATA TYPES.md
SPX/ SPX/
_something.md _something.md
Sessions.md
LBM.md LBM.md
Reserved LBM keys.md Reserved LBM keys.md
Reserved events/ Reserved events/
Sessions.md
Streams.md

View File

@ -18,26 +18,26 @@
## Содержание и структура ## Содержание и структура
Все _события_ содержат идентификатор серверной сессии размером 4 байта. Подробнее про сессии - в [Sessions.md](Sessions.md). Все _события_ содержат идентификатор _потока_ размером 4 байта. Подробнее - в [Streams.md](Streams.md).
_События_ в _шифрованном соединении_ содержат хэш, применённый к зашифрованному блобу (см. ниже). Этот хэш имеет размер равно или более 16 байт и подписан с помощью закрытого ключа подписи отправляющего. Он гарантирует достоверность содержания _события_ на уровне прямого подключения между двумя _узлами_. Используемые алгоритмы подписи и хэширования определяются на этапе рукопожатия. _События_ в _шифрованном соединении_ содержат хэш, применённый к зашифрованному блобу (см. ниже). Этот хэш имеет размер равно или более 16 байт и подписан с помощью закрытого ключа подписи отправляющего. Он гарантирует достоверность содержания _события_ на уровне прямого подключения между двумя _узлами_. Используемые алгоритмы подписи и хэширования определяются на этапе рукопожатия.
Все _события_ содержат асинхронный идентификатор _события_, который является двухбайтным целым числом без знака и предназначен для определения отношения запросов к ответам при асинхронном обмене _событиями_. Все _события_ содержат асинхронный идентификатор _события_, который является двухбайтным целым числом без знака и предназначен для определения отношения запросов к ответам при асинхронном обмене _событиями_ в конкретном _потоке_.
Все _события_ содержат тип (см. выше раздел "Категории и типы"). Все _события_ содержат тип (см. выше раздел "Категории и типы").
_События_ могут содержать полезную нагрузку, либо один нулевой байт, свидетельствующий о её отсутствии. Данная версия протокола не накладывает ограничений на формат полезной нагрузки, за исключением базовых событий, которые представлены данными в формате _LBM_. Описание всех предопределённых в базовом протоколе ключей ячеек _LBM_ доступно в [Reserved LBM keys.md](Reserved%20LBM%20keys.md). При использовании формата _LBM_, в полезную нагрузку могут добавляться шумовые данные. Неизвестные ключи при обработке полезной нагрузки игнорируются. _События_ могут содержать полезную нагрузку, либо один нулевой байт, свидетельствующий о её отсутствии. Данная версия протокола не накладывает ограничений на формат полезной нагрузки, за исключением базовых событий, которые представлены данными в формате _LBM_. Описание всех предопределённых в базовом протоколе ключей ячеек _LBM_ доступно в [Reserved LBM keys.md](Reserved%20LBM%20keys.md). При использовании формата _LBM_, в полезную нагрузку могут добавляться шумовые данные. Неизвестные ключи при обработке полезной нагрузки игнорируются.
_События_ в _шифрованном соединении_ содержат блоб, зашифрованный с помощью актуального ключа сессии и утверждённого алгоритма симметричного шифрования. Этот блоб содержит асинхронный идентификатор, тип события и полезную нагрузку. В нешифрованном соединении, указанные поля находятся в "сыром" виде. _События_ в _шифрованном соединении_ содержат блоб, зашифрованный с помощью актуального ключа _потока_ и утверждённого алгоритма симметричного шифрования. Этот блоб содержит асинхронный идентификатор, тип события и полезную нагрузку. В нешифрованном _соединении_, указанные поля находятся в "сыром" виде.
Исходя из всего вышеописанного, минимальный размер сериализованного в бинарный вид _события_ в нешифрованном соединении составляет 9 байт, а его итоговая структура выглядит следующим образом: Исходя из всего вышеописанного, минимальный размер сериализованного в бинарный вид _события_ в нешифрованном _соединении_ составляет 9 байт, а его итоговая структура выглядит следующим образом:
`[Session ID: 4B][Async ID: 2B][Event Type: 2B][Payload: >0B]` `[Stream ID: 4B][Async ID: 2B][Event Type: 2B][Payload: >0B]`
В свою очередь, _события_ в _шифрованном соединении_ имеют размер не менее 25-и байт и следующую структуру: В свою очередь, _события_ в _шифрованном соединении_ имеют размер не менее 25-и байт и следующую структуру:
```text ```text
[Session ID: 4B][Signed Hash: >=16B][Encrypted Blob: >=5B] [Stream ID: 4B][Signed Hash: >=16B][Encrypted Blob: >=5B]
/ | \ / | \
[Async ID: 2B][Event Type: 2B][Payload: >0B] [Async ID: 2B][Event Type: 2B][Payload: >0B]
``` ```

View File

@ -143,3 +143,5 @@ ASCII: S t a d i u m P
- _Тип:_ `char[]` - _Тип:_ `char[]`
- _Обязательна:_ нет - _Обязательна:_ нет
- Строка в кодировке ASCII, описывающая ошибку в человекочитаемом виде. - Строка в кодировке ASCII, описывающая ошибку в человекочитаемом виде.
<!--TODO: стартовый SID-->

View File

@ -4,7 +4,7 @@
## Терминология ## Терминология
Здесь перечислены используемые в данной документации термины, значение которых может быть не очевидно и/или не соответствует тому, которое подразумевается обычно. Здесь перечислены используемые в данной спецификации термины, значение которых может быть не очевидно и/или не соответствует тому, которое подразумевается обычно.
### Узел ### Узел
@ -18,9 +18,17 @@
Выполняющий роль клиента _узел_ в многоранговой сети. Выполняющий роль клиента _узел_ в многоранговой сети.
### Шифрованное соединение/сессия ### Соединение/поток
Соединение между двумя _узлами_, все _события_ в котором шифруются с помощью оговорённого симметричного алгоритма и ключа, а также подписываются с помощью известного приватного ключа подписи отправителя. Канал обмена _событиями_ между двумя _узлами_, имеющий свой идентификатор (Stream ID/SID, см. [Streams.md](Streams.md)) и набор настроек.
### Шифрованное соединение/поток
_Соединение_ между двумя _узлами_, все _события_ в котором шифруются с помощью оговорённого симметричного алгоритма и ключа, а также подписываются с помощью приватного ключа отправителя.
### Сессия
То, что устанавливается при создании первого _соединения_ между двумя _узлами_, с чем ассоциированы конкретные _потоки_ и прочие параметры.
### Событие ### Событие