Согласно рассмотренной в предыдущем параграфе архитектуре «клиент-сервер» все сообщения SIP делятся на запросы клиента серверу и ответы сервера клиенту. Так, для инициирования установления соединения вызывающий пользователь должен сообщить серверу ряд обязательных параметров, в том числе, параметры информационных каналов, адрес вызываемого пользователя и другую информацию. Указанные параметры передаются в соответствующем SIP-запросе. От вызываемого пользователя приходит ответ на запрос, также содержащий ряд параметров. Все сообщения протокола SIP - запросы и ответы - представляют собой последовательности текстовых строк, структура и синтаксис которых, как уже упоминалось ранее, соответствуют протоколу НТТР. На рис. 4.2 представлена структура сообщения протокола SIP.
Стартовая строка представляет собой начальную строку любого SIP-сообщения. Если сообщение является запросом, то в стартовой строке указываются тип запроса, текущий узел-адресат и номер версии протокола. Если сообщение является ответом на запрос, то в стартовой строке указываются номер версии протокола, тип ответа и короткая расшифровка ответа, предназначенная
только для обслуживающего персонала и не обрабатываемая клиентом.
Заголовки сообщений несут информацию об отправителе, адресате, пути следования и др., в общем, переносят информацию, необходимую для обслуживания сообщения. В протоколе SIP определено четыре вида заголовков:
• общие заголовки, присутствующие в запросах и ответах, к которым относятся, в частности, Call-ID (идентификатор соединения), Contact (контакт), CSeq (порядковый номер запроса/ответа), Date (дата), Encryption (кодирование), From (источник запроса), То (адресат), Via (через), Record-Route (запись маршрута);
• заголовки содержания переносят информацию о размере тела сообщения или об источнике запроса, начинаются со слова 'Content', например, Content-Encoding (кодирование тела сообщения), Content-Length (размер тела сообщения), Content-Type, (тип содержимого);
• заголовки, передающие дополнительную информацию о запросе, например, Accept (принимается), Accept-Encoding (кодирование принимается), Accept-Language (язык поддерживается), Authorization (авторизация), Hide (скрыть), Max-Forwards (максимальное количество переадресаций), Organization (организация), Priority (приоритет), Proxy-Authorization (авторизация прокси-сервера), Proxy-Require (требование прокси-сервера), Route (маршрут), Response-Key (ключ кодирования ответа), Subject (тема), User-Agent (агент пользователя);
• заголовки ответов, передающие дополнительную информацию об ответе, например Allow (разрешение), Proxy-Authenticate (подтверждение подлиности прокси-сервера), Retry-After (повторить через некоторое время), Server (сервер), Unsupported (не поддерживается), Warning (предупреждение), WWW-Authenticate (аутентификация WWW-сервера).
Заголовок состоит из названия, за которым следует отделенное двоеточием значение заголовка. В поле значения содержатся передаваемые данные. Если сервер принимает сообщения, заголовки которых ему не известны, то они игнорируются при обработке. Поясним некоторые из упомянутых выше, наиболее часто используемых заголовков.
/ | / | |
Стартовая строка | / | |
Заголовки | / | |
Пустая строка | ||
/ | / | |
Тело сообщения | / | |
Рис. 4.2. Структура сообщения протокола SIP |
Заголовок Call-ID - уникальный идентификатор сеанса связи; он подобен метке соединения Call reference в сигнализации DSS1 [5].
Значение идентификатору присваивается стороной, инициирующей вызов. Заголовок Call-ID состоит из буквенно-числового значения и имени рабочей станции, которая присвоила значение этому идентификатору. Между ними должен стоять символ @, например, 2345call@niits.ru.
Заголовок То - определяет адресата. Кроме SIP-адреса, здесь может стоять параметр tag для идентификации определенного терминала пользователя, например, домашнего, рабочего или мобильного телефона, в том случае, когда все они зарегистрированы под одним адресом SIP URL. Запрос может множиться и достичь разных терминалов одного пользователя; чтобы их различить и нужна метка tag. Если необходим визуальный вывод имени пользователя, например, на дисплей, то имя пользователя также размещается в поле То.
Заголовок From - идентифицирует отправителя запроса; по структуре он аналогичен полю То.
Заголовок CSeq — уникальный идентификатор запроса, относящегося к одному соединению. Он служит для корреляции запроса с ответом на него. Заголовок состоит из двух частей: натурального числа в диапазоне от 1 до 232 и типа запроса. Сервер должен проверять значение величины CSeq в каждом принимаемом запросе, и считает его новым, если значение больше предыдущего. Пример заголовка CSeq: 2 INVITE.
Заголовок Via необходим, чтобы избежать зацикливания запроса, а также в тех случаях, когда требуется, чтобы запросы и ответы обязательно проходили по одному и тому же пути (например, при использовании межсетевого экрана firewall). Дело в том, что запрос может проходить через несколько прокси-серверов, каждый из которых принимает, обрабатывает и переправляет запрос к следующему прокси-серверу, пока этот запрос не достигнет адресата.
В заголовке Via указывается весь путь, пройденный запросом: каждый прокси-сервер добавляет поле со своим адресом. При необходимости (в частности, чтобы обеспечить секретность) действительный адрес может скрываться. Например, пусть запрос на своем пути обрабатывался двумя прокси-серверами: сначала сервером niits.ru, потом sip.telecom.com. Тогда в запросе появятся следующие поля: Via: SIP/2.0/UDP sip.telecom.com:5060;branch=721e418c4.1 и Via: SIP/2.0/UDP niits.ru:5060, где параметр branch означает, что на сервере sip.telecom.com запрос был размножен и направлен одновременно по разным направлениям, и наш запрос был передан по направлению, которое идентифицируется 721e418c4.1. Содержимое полей Via копируется из запросов в ответы на них, и каждый сервер, через который проходит ответ, удаляет поле со своим именем.
В заголовок Record-route прокси-сервер вписывает свой адрес - SIP URL, - если хочет, чтобы следующие запросы прошли через него.
Сообщения протокола SIP могут содержать так называемое тело сообщения. Некоторые запросы, например, запрос BYE, не содержат тела сообщения. С ответами дело обстоит иначе: тело сообщения могут содержать любые ответы, но содержимое их тела довольно сильно различается.
Заголовок Content-Type определяет формат описания сеанса связи. Само описание сеанса, например, в формате протокола SDP, включается в тело сообщения.
Заголовок Content-Length показывает размер тела сообщения.