stadium-proto/Events.md

5.7 KiB
Raw Blame History

События

Категории и типы

Существует три уровня категорий событий:

Надкатегория описывает виды взаимодействующих узлов. Не указывается и зависит от контекста. Варианты: Client2Server (событие сгенерированное клиентом для сервера), Server2Client (событие сгенерированное сервером для клиента), Peer2Peer (событие сгенерированное узлом для другого узла того-же ранга, в том числе это касается серверов в федерации).

Категория описывает события одного класса. Является однобайтным числом без знака. Всегда больше нуля. Например: Authentication, Object, т.п.

Подкатегория описывает конкретное событие из класса, соответствующего категории. Является однобайтным числом без знака. Всегда больше нуля. Например: Login, GetContents, т.п.

Все категории вместе - являются типом события. Информацию про зарезервированные типы вы можете найти в Reserved events.md.

Содержание и структура

Все события содержат идентификатор потока размером 4 байта. Подробнее - в Streams.md.

События в шифрованном соединении содержат хэш, применённый к зашифрованному блобу (см. ниже). Этот хэш имеет размер равно или более 16 байт и подписан с помощью закрытого ключа подписи отправляющего. Он гарантирует достоверность содержания события на уровне прямого подключения между двумя узлами. Используемые алгоритмы подписи и хэширования определяются на этапе рукопожатия.

Все события содержат асинхронный идентификатор события, который является двухбайтным целым числом без знака и предназначен для определения отношения запросов к ответам при асинхронном обмене событиями в конкретном потоке.

Все события содержат тип (см. выше раздел "Категории и типы").

События могут содержать полезную нагрузку, либо один нулевой байт, свидетельствующий о её отсутствии. Данная версия протокола не накладывает ограничений на формат полезной нагрузки, за исключением базовых событий, которые представлены данными в формате LBM. Описание всех предопределённых в базовом протоколе ключей ячеек LBM доступно в Reserved LBM keys.md. При использовании формата LBM, в полезную нагрузку могут добавляться шумовые данные. Неизвестные ключи при обработке полезной нагрузки игнорируются.

События в шифрованном соединении содержат блоб, зашифрованный с помощью актуального ключа потока и утверждённого алгоритма симметричного шифрования. Этот блоб содержит асинхронный идентификатор, тип события и полезную нагрузку. В нешифрованном соединении, указанные поля находятся в "сыром" виде.

Исходя из всего вышеописанного, минимальный размер сериализованного в бинарный вид события в нешифрованном соединении составляет 9 байт, а его итоговая структура выглядит следующим образом:

[Stream ID: 4B][Async ID: 2B][Event Type: 2B][Payload: >0B]

В свою очередь, события в шифрованном соединении имеют размер не менее 25-и байт и следующую структуру:

[Stream ID: 4B][Signed Hash: >=16B][Encrypted Blob: >=5B]
                                     /        |         \
                         [Async ID: 2B][Event Type: 2B][Payload: >0B]

Максимальный размер события не нормирован. Ответственность за менеджмент разделения события, в случае, если оно не помещается в один пакет, остаётся на транспортном уровне. Максимальный размер полезной нагрузки события определяется на этапе рукопожатия.