Сообщения SUBSCRIBE и NOTIFY |
|
Для большинства реализованных на базе протокола SIP услуг, которые требуют взаимодействия между конечными точками, представляет интерес возможность запрашивать асинхронное уведомление о событиях. Эти услуги включают в себя: услуги автоматического обратного вызова (связанные с изменениями состояния терминала пользователя), интерактивные списки контактов «buddy lists» (связанные с определением присутствия пользователя), оповещения об ожидающем сообщении (связанные с событиями изменения состояния почтового ящика) и передача информации о состоянии процесса обслуживания вызова при взаимодействии сетей Интернет и ТфОП. Объекты сети SIP могут подписаться на предоставление информации о состоянии определенного ресурса или процесса обслуживания вызова в сети, и объекты, располагающие этими сведениями (или объекты, действующие от их лица), будут передавать уведомления каждый раз, когда это состояние изменится.
Запрос SUBSCRIBE используется для запроса информации о текущем состоянии и информации об обновлениях состояния удаленного ресурса. SUBSCRIBE -это запрос, создающий диалог. Когда подписчик (subscriber - агент пользователя, запрашивающий и получающий информацию о состоянии ресурса) желает подписаться на получение информации о состоянии ресурса, он формирует сообщение SUBSCRIBE. Если начальное сообщение SUBSCRIBE представляет собой запрос вне диалога, как зачастую и бывает, его формирование проходит с привлечением процедур создания запроса вне диалога для UAC. Идентификация событий, на уведомления о которых производится подписка, обеспечивается с помощью трех компонентов запроса SUBSCRIBE: поля Request URI, заголовка Event и, опционально, тела сообщения. Request URI содержит исчерпывающую информацию идентификации ресурса, в отношении которого требуется провести процедуру уведомления (notification), но не обязательно содержит достаточно информации для того, чтобы уникально идентифицировать тип события (например, sip: This e-mail address is being protected from spambots, you need JavaScript enabled to view it был бы подходящим URI как для подписки на информацию о состоянии присутствия пользователя (user presence state), так и для подписки на информацию о состоянии ящика речевой почты пользователя). В запросе SUBSCRIBE должен присутствовать ровно один заголовок Event, указывающий событие или класс событий, на уведомление о котором производится подписка. Заголовок содержит значение, указывающее тип состояния, информация о котором затребована подписчиком. Это значение носит название event package и описывает значение события или класса событий. Заголовок Event может также содержать параметр «id». Параметр идентифицирует конкретную подписку в пределах диалога. Большинство event package потребуют наличия в запроcе SUBSCRIBE тел сообщения (синтаксис и семантику для таких тел определяют event package). Эти тела, как правило, будут модифицировать, уточнять, отфильтровывать, прерывать и/или устанавливать границы для запрашиваемого класса событий. В запросе SUBSCRIBE может присутствовать заголовок Allow, указывающий, какие типы event package он поддерживает. Когда время действия подписки истекает, подписчик может обновить таймер этой подписки путем передачи еще одного сообщения SUBSCRIBE с таким же значением параметра «id» заголовка Event в том же диалоге, где существует начальная подписка. Пользователь может также отказаться от подписки. Процедура отказа протекает так же, как и процедура обновления подписки с единственным отличием, заключающемся в том, что значение поля заголовка Expires - нулевое. Запрос SUBSCRIBE должен быть подтвержден окончательным ответом. При этом уведомитель (notifier - агент пользователя, информирующий его о состоянии ресурса) не должен ожидать от пользователя подтверждения, прежде чем передать окончательный ответ. Если уведомитель способен незамедлительно определить, что он поддерживает event package, что аутентифицированный подписчик авторизован на подписку и что не существует других препятствий, чтобы создать подписку, он создает подписку, и в случае необходимости - диалог, а затем передает ответ с кодом 200 (ОК). Может быть также передан ответ с кодом 202 (Accepted). Такой ответ означает, что запрос был получен и понят, но подписка, возможно, еще не авторизована. После того как подписка была успешно создана или обновлена, уведомитель должен незамедлительно передать сообщение NOTIFY, чтобы сообщить подписчику текущее состояние ресурса. Запрос NOTIFY передается в том же диалоге, который был создан ответом на запрос SUBSCRIBE (если не существовало заранее установленного диалога). Когда происходит изменение состояния, на уведомление о котором была открыта подписка, подписчику также передается запрос NOTIFY. Таким образом, тип запроса NOTIFY используется для уведомления узла SIP о том, что событие, информация о котором запрашивалась в запросе SUBSCRIBE, произошло. Он может также содержать подробности, связанные с этим событием. Запрос NOTIFY, так же, как SUBSCRIBE, содержит заголовок Event со значением event package, для которого производится уведомление; параметр «id» заголовка должен совпадать с аналогичным параметром в SUBSCRIBE. В запросах NOTIFY могут присутствовать тела сообщения, их семантику определяют event package. Тела содержат дополнительную информацию о типе произошедшего события и о новом состоянии ресурса. Сообщение NOTIFY должно содержать заголовок Subscription-State со значением либо active, либо pending, либо terminated. Значение active указывает, что запрос подписки был принят и авторизован. Значение pending означает, что запрос подписки был получен, но не может быть принят или отклоняется из-за недостатка информации. Значение terminated сообщает, что подписка окончена. После получения запроса NOTIFY подписчик должен проверить, соответствует ли запрос хотя бы одной из его существующих подписок (соответствие будет иметь место, если NOTIFY относится к тому же диалогу и имеет соответствующее значение заголовка Event). После того как подписчик принял уведомление, он должен передать ответ с кодом 200 (ОК). |

