5.7 KiB
События
Категории и типы
Существует три уровня категорий событий:
Надкатегория описывает виды взаимодействующих узлов. Не указывается и зависит от контекста. Варианты: Client2Server (событие сгенерированное клиентом для сервера), Server2Client (событие сгенерированное сервером для клиента), Peer2Peer (событие сгенерированное узлом для другого узла того-же ранга, в том числе это касается серверов в федерации).
Категория описывает события одного класса. Является однобайтным числом без знака. Всегда больше нуля. Например: Authentication, Object, т.п.
Подкатегория описывает конкретное событие из класса, соответствующего категории. Является однобайтным числом без знака. Всегда больше нуля. Например: Login, GetContents, т.п.
Все категории вместе - являются типом события. Информацию про зарезервированные типы вы можете найти в Reserved events.md.
Содержание и структура
Все события содержат идентификатор серверной сессии размером 4 байта. Подробнее про сессии - в Sessions.md.
События в шифрованном соединении содержат хэш, применённый к зашифрованному блобу (см. ниже). Этот хэш имеет размер равно или более 16 байт и подписан с помощью закрытого ключа подписи отправляющего. Он гарантирует достоверность содержания события на уровне прямого подключения между двумя узлами. Используемые алгоритмы подписи и хэширования определяются на этапе рукопожатия.
Все события содержат асинхронный идентификатор события, который является двухбайтным целым числом без знака и предназначен для определения отношения запросов к ответам при асинхронном обмене событиями.
Все события содержат тип (см. выше раздел "Категории и типы").
События могут содержать полезную нагрузку, либо один нулевой байт, свидетельствующий о её отсутствии. Данная версия протокола не накладывает ограничений на формат полезной нагрузки, за исключением базовых событий, которые представлены данными в формате LBM. Описание всех предопределённых в базовом протоколе ключей ячеек LBM доступно в Reserved LBM keys.md. При использовании формата LBM, в полезную нагрузку могут добавляться шумовые данные. Неизвестные ключи при обработке полезной нагрузки игнорируются.
События в шифрованном соединении содержат блоб, зашифрованный с помощью актуального ключа сессии и утверждённого алгоритма симметричного шифрования. Этот блоб содержит асинхронный идентификатор, тип события и полезную нагрузку. В нешифрованном соединении, указанные поля находятся в "сыром" виде.
Исходя из всего вышеописанного, минимальный размер сериализованного в бинарный вид события в нешифрованном соединении составляет 9 байт, а его итоговая структура выглядит следующим образом:
[Session ID: 4B][Async ID: 2B][Event Type: 2B][Payload: >0B]
В свою очередь, события в шифрованном соединении имеют размер не менее 25-и байт и следующую структуру:
[Session ID: 4B][Signed Hash: >=16B][Encrypted Blob: >=5B]
/ | \
[Async ID: 2B][Event Type: 2B][Payload: >0B]
Максимальный размер события не нормирован. Ответственность за менеджмент разделения события, в случае, если оно не помещается в один пакет, остаётся на транспортном уровне. Максимальный размер полезной нагрузки события определяется на этапе рукопожатия.