From 77127fecb46458c57c30c1bda053a0ac322eb09b Mon Sep 17 00:00:00 2001 From: shr3dd3r Date: Sun, 9 Jun 2024 17:45:33 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9A=D0=BE=D0=BD=D0=BA=D1=80=D0=B5=D1=82?= =?UTF-8?q?=D0=BD=D1=8B=D0=B5=20=D1=82=D0=B8=D0=BF=D1=8B=20=D1=81=D0=B8?= =?UTF-8?q?=D1=81=D1=82.=20=D1=81=D0=BE=D0=B1=D1=8B=D1=82=D0=B8=D0=B9=20?= =?UTF-8?q?=D0=B8=20=D1=82=D0=B0=D0=B9=D0=BC=D0=B0=D1=83=D1=82=20=D0=BF?= =?UTF-8?q?=D0=BE=D1=82=D0=BE=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Описаны некоторые типы системных событий; добавлено понятие категории системных событий; у потоков теперь есть таймауты. --- Поток.md | 2 ++ Системное событие.md | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/Поток.md b/Поток.md index 8b3f4e6..4e5e1fa 100644 --- a/Поток.md +++ b/Поток.md @@ -4,6 +4,8 @@ У потока есть некий набор параметров, часть из которых он разделяет с сессией. У каждого потока есть свой уникальный идентификатор (StreamId) и секрет (StreamSecret), последний задаётся на этапе создания нового потока. У потока есть параметры криптографии и шума. Поток может быть как "шифрованным", так и "нешифрованным", что влияет на формат пакетов: в нешифрованном потоке, идентификатор потока статичен, а в шифрованном - обновляется и уникален для каждого пакета. Шифрованный поток может находиться в одном из двух состояний: "работает" или "рассинхронизирован", а нешифрованный только в первом. В случае непредвиденного нарушения работоспособности шифрованного потока, он переходит в состояние "рассинхронизирован", а вернуть его обратно в состояние "работает" клиент может путём отправки серверу пакета со специальным видом рукопожатия, содержащим StreamSecret. +У каждого потока также есть собственный таймаут. Таймер запускается узлом сразу после получения любого валидного пакета. Если новый валидный пакет получен до его истечения, то таймер сбрасывается и начинает отсчёт с начала. Если по истечению таймера не было получено валидных пакетов, то узел молча уничтожает поток. Таймаут может быть в любой момент изменён клиентом, о чём должен быть оповещён сервер. + Значительная часть функциональности протокола, в том числе касающаяся криптографии, опциональна в том смысле, что может не использоваться в рамках отдельного потока. К примеру, в нём может быть не только настроено количество шума, но и полностью отключен. Таким-же образом, коммуникация может происходить вовсе без шифрования, что может быть полезно, например, для снижения нагрузки на железо, когда протокол используемый транспортным адаптером уже обеспечивает требуемый уровень приватности. У шума может быть настроен "характер", т.е. его статистические характеристики. Поток также может гарантировать последовательность отправки пакетов и информирование в случае недоставки или повреждения пакета, но это остаётся на усмотрение клиента и отключаемо в случае ненадобности. Поток привязан к транспортному адаптеру, по которому осуществляется физическая передача пакетов и существует в рамках жизни сессии. Один транспортный адаптер может использоваться сразу несколькими потоками. Все потоки двунаправленны, т.е. пакеты могут отправляться как от клиента к серверу, так и наоборот. diff --git a/Системное событие.md b/Системное событие.md index ecc3f28..6fd0e62 100644 --- a/Системное событие.md +++ b/Системное событие.md @@ -4,6 +4,8 @@ Тип события является однобайтным целым числом без знака. Событие может предполагать ответ от противоположного узла или не требовать оный. Наличие необходимости ответа определяется типом, в каждом случае индивидуально. Корректный тип события никогда не равен нулю. +У каждого типа события есть категории: Client-to-Server (C2S) и Server-to-Client (S2C). Один тип события может находится сразу в двух категориях. Первая категория подразумевает, что событие этого типа должен обрабатывать только сервер, второе - только клиент. Если тип события находится в обоих категориях, то оно должно обрабатываться как сервером, так и клиентом. + Структура события может быть представлена следующим образом: ```text @@ -15,3 +17,42 @@ B: byte(s) | Body: ~B | |----------| ``` + + +### Список конкретных типов системных событий + +Для справки: представленный перечень не является исчерпывающим, а также тут не будут описаны поля и соответствия между ними и KLV-ключами, что будет сделано в полной версии спецификации. + +#### EnumerateTransport + +**Категория**: C2S + +Запрос на выдачу списка адаптеров, по которым можно подключиться к текущему серверу. Ответ содержит либо ошибку, либо перечень адресов транспортных адаптеров. В содержимом события могут быть указаны критерии фильтрации выдачи, например, конкретный вид транспортного адаптера. + +#### UpdateStreamParams + +**Категория**: C2S + +Запрос на обновление параметров потока. Ответ содержит либо ошибку с указанием на конкретный её источник, либо сообщение об успешности операции. В содержимом события указаны лишь те параметры, которые предполагается изменить. + +#### CreateStream + +**Категория**: C2S + +Запрос на создание нового потока с избранными параметрами. Ответ содержит либо ошибку, либо сообщение об успехе. + +#### TerminateStream + +**Категория**: C2S + +Запрос на уничтожение существующего потока. Ответ содержит либо ошибку об отсутствии указанного потока, либо сообщение об успехе. + +#### TerminateSession + +**Категория**: C2S, S2C + +Запрос на уничтожение сессии. Так как в протоколе существует понятие таймаута, для корректного завершения сессии требуется оповещение противоположного узла. После получения события этого типа узлом - он обязан ответить сообщением об успешности операции, после доставки которого оба узла должны уничтожить все потоки в сессии и саму сессию. + +#### Answer + +Ответ на любой из запросов. Содержит код ответа (успеха или ошибки), описание ошибки (опционально) и произвольные данные (опционально).