Протокол SCTP

sctp-команда

SCTP-команда состоит из двух частей: * заголовок команды - часть команды, в которой указан её тип и некоторая дополнительная информация о ней. Заголовок команды имеет фиксированный размер. * аргументы - часть команды, которая содержит её аргументы. Размер аргументов может быть разным и зависит лишь от типа команды.

Таким образом размер команды зависит от её типа.

Заголовок sctp-команды Заголовок sctp-команды имеет следующую структуру:

Поле Размер Примечание
code 1 байт Используется для указания типа команды (описание команд приведено дальше)
flags 1 байт Используется для передачи дополнительных флагов команды (описаны далее)
id 4 байта Уникальный идентификатор команды (должен быть уникальным в рамках клиента, так как по нему клиент устанавливает соотвествие между результатом и конкретной командой)
size 4 байта Размер поля с аргументами (в байтах)

После выполнения каждой sctp-команды возвращается результат, который привязан к id команды. Так как команда выполняется асинхронно, то результат может может быть возвращен в любой момент. Схема выполнения команды выглядит следующим образом:

Структура sc-машины

Важно: протокол является двусторонним. Другими словами часть команд может быть отправлена сервером клиенту, в тот момент, когда клиент ожидает ответ на запрос. Сервер гарантирует целостность сообщений, но не гарантирует порядок их прихода.

sctp-результат

SCTP-результат состоит из двух частей: * заголовок результата - часть результата, в которой указан его тип и некоторая дополнительная информация о нем. Заголовок результата имеет фиксированный размер. * значения - часть результата, которая содержит возвращаемые значения. Размер этого поля может быть разным и зависит лишь от типа результата.

Таким образом размер реузльтата зависит от его типа. Тип результата всегда совпадает с типом команды которой соотвествует этот результат.

Заголовок sctp-результата имеет следующую структуру:

Поле Размер Примечание
code 1 байт Тип команды к которой возвращается результат
id 4 байта Уникальный идентификатор команды которой соответствует этот результат
return 1 байт Код возврата - один из базовых кодов возврата, который говорит об успешности выполнения команды или в противном случае содержит код ошибки
size 4 байта Размер поля с результатами (в байтах)

Таблица кодов возврата:

Код Описание
0x00 Успешное выполнение команды
0x01 Безуспешное выполнение команды
0x02 Указанный sc-элемент не найден (не верный sc-адрес)
0x03 Не достаточно прав доступа для выполнения команды

Важно: если sctp-команда выполнена с ошибкой то sctp-результат состоит лишь из заголовка

Таблица базовых шаблонов поиска:

Код Шаблон
0 3f_a_a
1 3a_a_f
2 3f_a_f
3 5f_a_a_a_f
4 5_a_a_f_a_f
5 5_f_a_f_a_f
6 5_f_a_f_a_a
7 5_f_a_a_a_a
8 5_a_a_f_a_a

Таблица кодов событий:

Код Событие
0 Добавление выходящей дуги (ребра)
1 Добавление входящей дуги (ребра)
2 Удаление выходящей дуги (ребра)
3 Удаление входящей дуги (ребра)
4 Удаление sc-элемента
5 Изменение содержимого sc-ссылки

Далее перечислены коды всех команд с описанием их аргументов и результатов:

Код: 0x01
Команда: Проверка существования элемента с указанным sc-адресом
Аргументы: 4 байта - sc-адрес проверяемого sc-элемента
Результат: Результат выполнения лежит в возвращаемом коде. Если там код успешного выполнения, то элемент с указанным sc-адресом существует, иначе возвращается код ошибки.


Код: 0x02
Команда: Получение типа sc-элемента по sc-адресу
Аргументы: 4 байта - sc-адрес элемента для получения типа
Результат: Если выполнение команды успешно, то в качестве результата возвращаются 2 байта обозначающих тип sc-элемента. Иначе размер поля с результатами равен нулю (результатов нет)


Код: 0x03
Команда: Удаление sc-элемента с указанным sc-адресом
Аргументы: 4 байта - sc-адрес удаляемого sc-элемента
Результат: Команда возвращает лишь код удачного выполнения, если элемент удален успешно, иначе возвращается код ошибки.


Код: 0x04
Команда: Создание нового sc-узла указанного типа
Аргументы: 2 байта - тип создаваемого sc-узла
Результат: Если выполнение команды успешно, то в качестве результата возвращаются 4 байта обозначающих адрес созданного sc-узла. Иначе размер поля с результатами равен нулю (результатов нет)

Код: 0x05
Команда: Создание новой sc-ссылки
Аргументы: нет
Результат: Если выполнение команды успешно, то в качестве результата возвращаются 4 байта обозначающих адрес созданной sc-ссылки. Иначе размер поля с результатами равен нулю (результатов нет)


Код: 0x06
Команда: Создание новой sc-дуги указанного типа, с указнным начальным и конечным элементами
Аргументы:
2 байта - тип создаваемой sc-дуги
4 байта - sc-адрес начального элемента sc-дуги
4 байта - sc-адрес конечного элемента sc-дуги
Результат: Если выполнение команды успешно, то в качестве результата возвращаются 4 байта обозначающих адрес созданной sc-дуги. Иначе размер поля с результатами равен нулю (результатов нет)


Код: 0x07
Команда: Получение начального и конечного элемента sc-дуги
Аргументы: 4 байта - sc-адрес дуги у которой необходимо получить начальный и конечный элемент
Результат:
4 байта - sc-адрес начального элемента дуги
4 байта - sc-адрес конечного элементе дуги


Код: 0x08
Команда:
Аргументы:
Результат:


Код: 0x09
Команда: Получение содержимого sc-ссылки
Аргументы: 4 байта - sc-адрес ссылки для получения содержимого
Результат: Если выполнение команды успешно, то в качестве размера поля с результатми возвращается размер содержимого, а качестве данных выступает само модержимое. Иначе размер поля с результатами равен нулю (результатов нет)


Код: 0x0a
Команда: Поиск всех sc-ссылок с указанным содержимым
Аргументы:
4 байта - N (размер содержимого в байтах)
N байт - содержимое для поиска
Результат: Если выполнение команды успешно, то в качестве результата возвращается:
N - количество найденных sc-ссылок (4 байта)
N sc-адресов - найденные sc-ссылки.


Код: 0x0b
Команда: Установка содержимого sc-ссылки
Аргументы:
4 байт - sc-адрес ссылки
4 байт - размер содержимого в байтах
N байт - данные устанавливаемого содержимого
Результат: Результат выполнения лежит в возвращаемом коде. Если там код успешного выполнения, то содержимое установлено, иначе возвращается код ошибки.


Код: 0x0c
Команда: Найти конструкции по указанному 3-х или 5-ти элементному шаблону
Аргументы: 1 байт - тип шаблонной конструкции для поиска
N байт - аргументы для постановки в шаблон для поиска. Зависят от шаблона поиска. К примеру, для шаблона 3f_a_a они будут следующие: 4 байта - адрес начального sc-элемента; 2 байта тип искомой дуги; 2 байта тип конечного sc-элемента. Другими словами каждому f в шаблоне поиска соответсвует sc-адрес (4 байта), а каждому a тип sc-элемента (2 байта)
Результат: Если выполнение команды успешно, то в качестве результата возвращается
4 байта - количество найденных, по указанному шаблону, конструкций
N байт , в которых хранятся найденные коснтрукции. К примеру, если найдено K конструкций соотвествующие указанному шаблону, то N = T * K * 4 байт, где T - количество аргументов в искомом шаблоне, для 3-х элементных конструкций оно равно 3, для 5-ти элементных - 5. В результатах лежат последовательно все найденные конструкции, они задаются sc-адресами найденых sc-элементов.


Код: 0x0d
Команда: Итерирование сложных конструкций (улучшить описание)
Аргументы:
1 байт - количество итераторов (max 50)
N байт - данные итераторов
Каждый итератор описывается следующей структурой:
1 байт - тип итератора
nF байт - правила подстановки (Для первого итератора этих правил нет). Правило подстановки это номер адреса в результате, который необходимо подставить в качестве аргумента итератора (255 - отсутсвующая подстановка). Результаты последовательного выполнения итераторов попадают в общий массив. Другими словами если у нас есть два итератора 3-х и 5-ти элементных конструкций, то номер адреса 4 даст первый элемент 5-ти элементной конструкции. nF - это количество известных аргументов итератора (fixed), nA - количество неизвестных аргументов итератора (assign). Итераторы выполняются последовательно, поэтому номер подстановки должен быть меньше количества аргументов итераторов до этого.
(nF - k) * 4 + nA * 2 байт - все подстановки, пропускаются, их нет необходимости указывать (k - количество подстановок)
Результат:
4 байта - количество результатов (rCount)
N байт - результаты итерирования. N = 4 * rCount * k, где k - сумма аргументов всех итераторов в запросе (для примера с двумя итераторами 3-х и 5-ти элементных конструкций, k = 8)


Код: 0x0e
Команда: Создание подписки на событие
Аргументы:
1 байт - тип события
4 байта - адрес sc-элемента для подписки на событие
Результат: В случае, если подписка на событие произведена успешно, то возвращается id подписки состоящий из 4 байт. Если же подписаться на событие не удалось, то возвращается лишь заголовок ответа, который содержит код ошибки.


Код: 0x0f
Команда: Удаление подписки на событие
Аргументы: 4 байта - id подписки, которую необходимо удалить
Результат: В результате неудачнго выполнения запроса возвращается только заголовок с кодом ошибки. Если же запрос обработан без ошибок, то в заголовке будет код удачного выполнения а в результате будет 4 байта - id подписки, которая удалена


Код: 0x10
Команда: Запрос произошедших событий
Аргументы: нет
Результат: Если запрос обработан успешно, то в результате содержится количество произошедших событий 4 байта и описание всех этих событий. Каждое из которых описывается следующей последовательностью байт:
4 байта - id события
4 байта - адрес sc-элемента событие с которым произошло
4 байта - аргумент события (адрес sc-дуги, которая была удалена/создана (для событий генерации/удаления дуги))


Код: 0x11
Команда: Генерация сложных конструкций (улучшить описание). Параметры задаются также как и в итерировании сложных конструкций, только вместо поиска осуществляется их генерация. Важно! Команда не проверяет наличие уже существующих конструкций по указанным шаблонам!
Аргументы:
1 байт - количество итераторов/шаблонов (max <= 50)
N байт - данные итераторов/шаблонов
Каждый итератор описывается следующей структурой:
1 байт - тип итератора
nF байт - правила подстановки (Для первого итератора этих правил нет). Правило подстановки это номер адреса в результате, который необходимо подставить в качестве аргумента итератора (255 - отсутсвующая подстановка). Результаты последовательного выполнения итераторов попадают в общий массив. Другими словами если у нас есть два итератора 3-х и 5-ти элементных конструкций, то номер адреса 4 даст первый элемент 5-ти элементной конструкции. nF - это количество известных аргументов итератора (fixed), nA - количество неизвестных аргументов итератора (assign). Итераторы выполняются последовательно, поэтому номер подстановки должен быть меньше количества аргументов итераторов до этого.
(nF - k) * 4 + nA * 2 байт - все подстановки, пропускаются, их нет необходимости указывать (k - количество подстановок)
Результат:
N байт - результаты генерации N = 4 * k, где k - сумма аргументов всех итераторов в запросе (для примера с двумя итераторами 3-х и 5-ти элементных конструкций, k = 8)


Код: 0xa0
Команда: Поиск sc-элемента по его системному идентификатору
Аргументы:
4 байта - N (размер идентификатора в байтах)
N байт - данные идентификатора
Результат: Если выполнение команды успешно, то в качестве результата возвращаются 4 байта обозначающих адрес найденого sc-эелемента. Иначе размер поля с результатами равен нулю (результатов нет)


Код: 0xa1
Команда: Установка системного идентификатора sc-элемента
Аргументы:
4 байта - адрес sc-элемента
4 байта - N (размер идентификатора в байтах)
N байт - данные идентификатора
Результат:


Код: 0xa2
Команда: Получение статистики с сервера, в ременных границах. Время используется в формате http://en.wikipedia.org/wiki/Unix_time
Аргументы:
8 байт - Нижняя временная граница
8 байт - Верхняя временная граница
Результат: Если выполнение команды успешно, то в качестве результата возвращаются 4 байта обозначающих количество временных отметок результаты которых возвращаются. Каждая такая временная отметка состоит из следуюзик полей:
8 байт - Время сбора статистики
8 байт - Общее количество sc-узлов, которые есть в sc-памяти
8 байт - Общее количество sc-дуг, которые есть в sc-памяти
8 байт - Общее количество sc-ссылок, которые есть в sc-памяти
8 байт - Количество пустых ячеек в sc-памяти
8 байт - Общее количество подключений клиентов к sctp серверу (не активных, а общее число включая и завершенные)
8 байт - Количество обработанных sctp команд (включая обработанные с ошибками)
8 байт - Количество обработанных с ошибками sctp команд
1 байт - Флаг начального сбора статистики. Другими словами, если это значание равно 1, то статистика была собрана при запуске sctp сервера. Если значание равно 0, то статистика собрана уже во время работы сервера


Код: 0xa3
Команда: Получение версии протокола
Аргументы: нет
Результат: Если команда выполнена успешно, то в качестве результата возвращается 4 байта, которые обозначают версию используемого сервером sctp протокола. (способ кодирования версии необходимо уточнить)