======Сообщения протокола SIP====== Согласно архитектуре <клиент-сервер> все сообщения делятся на запросы, передаваемые от клиента к серверу, и на ответы сервера клиенту. Например, чтобы инициировать установление соединения, вызывающий пользователь должен сообщить серверу ряд параметров, в частности, адрес вызываемого пользователя, параметры информационных каналов и др. Эти параметры передаются в специальном SIP-запросе. От вызываемого пользователя к вызывающему передается ответ на запрос, также содержащий ряд параметров. ======Структура сообщений SIP ====== Все сообщения протокола SIP (запросы и ответы), представляют собой последовательности текстовых строк, закодированных в соответствии с документом **RFC 2279**. Структура и синтаксис сообщений SIP, как уже упоминалось ранее, идентичны используемым в протоколе **HTTP**. На рисунке 5 представлена структура сообщений протокола **SIP**. |Стартовая строка| |Заголовки| |Пустая строка| |Тело сообщения| **Рис. 5 Структура сообщений протокола SIP** Стартовая строка представляет собой начальную строку любого **SIP**-сообщения. Если сообщение является запросом, в этой строке указываются тип запроса, адресат и номер версии протокола. Если сообщение является ответом на запрос, в стартовой строке указываются номер версии протокола, тип ответа и его короткая расшифровка, предназначенная только для пользователя. Заголовки сообщений содержат сведения об отправителе, адресате, пути следования и др., в общем, переносят информацию, необходимую для обслуживания данного сообщения. О типе заголовка можно узнать по его имени. Оно не зависит от регистра (т.е. буквы могут быть прописные и строчные), но обычно имя пишут с большой буквы, за которой идут строчные. Сообщения протокола **SIP** могут содержать так называемое тело сообщения. В запросах **АСК, INVITE и OPTIONS** тело сообщения содержит описание сеансов связи, например, в формате протокола **SDP**. Запрос **BYE** тела сообщения не содержит, а ситуация с запросом **REGISTER** подлежит дальнейшему изучению. С ответами дело обстоит иначе: любые ответы могут содержать тело сообщения, но содержимое тела в них бывает разным. ======Заголовки сообщений SIP====== В протоколе SIP определено четыре вида заголовков (Таблица 1): * Общие заголовки, присутствующие в запросах и ответах; * Заголовки содержания, переносят информацию о размере тела сообщения или об источнике запроса (начинаются со слова ); * Заголовки запросов, передающие дополнительную информацию о запросе; * Заголовки ответов, передающие дополнительную информацию об ответе. Заголовок содержит название, за которым, отделенное двоеточием, следует значение заголовка. В поле значения содержатся передаваемые данные. Следует отметить, что если сервер принимает сообщения, заголовки которых ему не известны, то эти заголовки игнорируются. Ниже представлены наиболее часто используемые заголовки. **Заголовок Call-ID** - уникальный идентификатор сеанса связи или всех регистрации отдельного клиента, он подобен метке соединения (call reference) в сигнализации DSS-1 . Значение идентификатору присваивает сторона, которая инициирует вызов. Заголовок Call-ID состоит из буквенно-числового значения и имени рабочей станции, которая присвоила значение этому идентификатору. Между ними должен стоять символ @, например, 2345call@rts.domen.ru Возможна следующая ситуация: к одной мультимедийной конференции относятся несколько соединений, тогда все они будут иметь разные идентификаторы **Call-ID**. **Заголовок То** - определяет адресата. Кроме SIP-адреса здесь может стоять параметр для идентификации конкретного терминала пользователя (например, домашнего, рабочего или сотового телефона) в том случае, когда все его терминалы зарегистрированы под одним адресом SIP URL. Запрос может множиться и достичь разных терминалов пользователя; чтобы их различать, необходимо иметь метку tag. Ее вставляет в заголовок терминальное оборудование вызванного пользователя при ответе на принятый запрос. Если необходим визуальный вывод имени пользователя, например, на дисплей, то имя пользователя также размещается в поле То. **Заголовок From** - идентифицирует отправителя запроса; по структуре аналогичен полю То. **Таблица 1. Виды заголовков сообщений SIP** ^Общие заголовки ^Заголовки содержания ^Заголовки запросов ^Заголовки ответов^ |Call-ID (идентификатор сеанса связи) |Content-Encoding (кодирование тела сообщения) |Accept (принимается) |Allow (разрешение)| |Contact (контактировать) |Content-Length (размер тела сообщения) |Accent-Encoding (метод кодирования поддерживается) |Proxy-Authenticate (подтверждение подлинности прокси-сервера)| |CSeq (последовательность) |Content-Type (тип содержимого) |Accent-Language (язык поддерживается) |Retro-After (повторить через некоторое время)| |Date (Дата)| |Authorization (авторизация) Server (сервер)| |Encryption (шифрование)| |Unsupported (не поддерживается)| |Expires (срабатывание таймера)| |Hide (скрыть) Warning (предупреждение)| |From (источник запроса)| |Max-Forwards (максимальное количество переадресаций) |WWW-Authenticate (подтверждение подлинности WWW-сервера)| |Record-Route (запись маршрута)| |Organization (организация) | |Timestamp (метка времени)| |Priority (приоритет) | |То (Адресат)| |Proxy-Authorization (авторизация прокси-сервера)| |Via (через)| |Proxy-Require (требуется прокси-сервер) | | | |Route (маршрут)| | | |Require (требуется)| | | |Response-Key (ключ кодирования ответа)| | | |Subject (тема) | | | |User-Agent (агент пользователя) | **Заголовок CSeq** - уникальный идентификатор запроса, относящегося к одному соединению. Он служит для корреляции запроса с ответом на него. Заголовок состоит из двух частей: натурального числа из диапазона от 1 до 232 и типа запроса. Сервер должен проверять значение CSeq в каждом принимаемом запросе и считать запрос новым, если значение CSeq больше предыдущего. Пример заголовка: CSeq: 2 INVITE. **Заголовок Via** служит для того, чтобы избежать ситуации, в которых запрос пойдет по замкнутому пути, а также для тех случаев, когда необходимо, чтобы запросы и ответы обязательно проходили по одному и тому же пути (например, в случае использования межсетевого экрана - firewall). Дело в том, что запрос может проходить через несколько прокси-сервером, каждый из которых принимает, обрабатывает и переправляет запрос к следующему прокси-серверу, и так до тех пор, пока запрос не достигнет адресата. Таким образом, в заголовке Via указывается весь путь, пройденный запросом: каждый прокси-сервер добавляет поле со своим адресом. При необходимости (например, чтобы обеспечить секретность) действительный адрес может скрываться. Например, запрос на своем пути обрабатывался двумя прокси-серверами: сначала сервером domen.ru, потом sip.telecom.com. Тогда в запросе появятся следующие поля: Via: SIP/2.0/UDP sip.telecom.com:5060;branch=721 e418c4.1 Via: SIP/2.0/UDP domen.ru: 5060, где параметр означает, что на сервере sip.telecom.com запрос был размножен и направлен одновременно по разным направлениям, и наш запрос был передан по направлению, которое идентифицируется следующим образом: 721е418c4.1. Содержимое полей Via копируется из запросов в ответы на них, и каждый сервер, через который проходит ответ, удаляет поле Via со своим именем. **В заголовок Record-route** прокси-сервер вписывает свой адрес - SIP URL, - если хочет, чтобы последующие запросы прошли через него. **Заголовок Content-Type** определяет формат описания сеанса связи. Само описание сеанса, например, в формате протокола SDP, включается в тело сообщения. **Заголовок Content-Length** указывает размер тела сообщения. После того, как мы рассмотрели наиболее часто встречающиеся заголовки сообщений протокола SIP, следует обратить внимание на то, что запросы и ответы на них могут включать в себя лишь определенный набор заголовков (Таблица 2). Здесь опять буква означает обязательное присутствие заголовка в сообщении, буква - необязательное присутствие, буква запрещает присутствие заголовка. **Таблица 2. Связь заголовков с запросамии ответами протокола SIP v2.0** ^Название заголовка ^Место использования заголовка^ ACK^ BYE^ CAN^ INV^ OPT^ REG^ |Accept |Заголовок в запросах |F |F |F| 0 |0 |0| |Accept |Заголовок в ответе 415| F| F| F |0 0| 0| |Accent-Encoding |Заголовок в запросах |F| F| F |0| 0| 0| |Accent-Encoding |Заголовок в ответе 415 |F| F |F |0| 0| 0| |Accent-Language |Заголовок в запросах |F |0 |0 |0| 0| 0| |Accent-Language |Заголовок в ответе 415| F |0 |0| 0| 0 |0| |Allow |Заголовок в ответе 200 |F| F| F| F| M| F| |Allow |Заголовок в ответе 405 |0| 0 |0 |0| 0| 0| |Authorization |Заголовок в запросах| 0| 0|0 |0| 0| 0| |Call-ID |Общий заголовок - копируется из запросов в ответы |М| М| М| М| М| М| |Contact |Заголовок в запросах| 0| F| F| 0| 0| 0| |Contact |Заголовок в ответах 1хх| F| F| F| 0| 0| F| |Contact |Заголовок в ответах 2хх| F| F| F| 0| 0| 0| |Contact |Заголовок в ответах Зхх| F| 0| F| 0| 0| 0| |Contact |Заголовок в ответе 485| F| 0| F| 0| 0| 0| ||Content-Encoding |Заголовки содержания| 0| F| F| 0| 0| 0| |Content-Length |Заголовки содержания| 0| F| F| 0| 0| 0| |Content-Type |Заголовки содержания| *| F| F| *| *| *| |Cseq |Общий заголовок - копируется из запросов в ответы| М| М| М| М| М| М| |Date |Заголовок в ответах| 0| 0| 0| 0| 0| 0| |Encryption |Заголовок в ответах| 0| 0| 0| 0| 0| 0| |Expires |Заголовок в ответах| F| F| F| 0| F| 0| |From |Общий заголовок - копируется из запросов в ответы| М| М| М| М| М| М| |Hide |Заголовок в запросах| 0| 0| 0| 0| 0 |0| |Max-Forwards |Заголовок в запросах| 0|0 |0 |0 |0 0| |Organization |Общий заголовок| F |F |F|0| 0| 0| |Proxy-Authenticate |Заголовок в ответе 407| 0| 0| 0| 0| 0| 0| |Proxy-Authorization |Заголовок в запросах| 0| 0| 0| 0| 0| 0| |Proxy-Require |Заголовок в запросах| 0| 0|0| 0| 0| 0| |Priority |Заголовок в запросах| F| F| F| 0 |F| F| |Require |Заголовок в запросах| 0| 0| 0| 0| 0| 0| |Retry-After |Заголовок в запросах| F| F| F| P| F| 0| |Retry-After |Заголовок в ответах 404, 480, 486, 503, 600 и 603| 0| 0 |0 |0 |0| 0| |Response-Key |Заголовок в запросах| F| 0| 0| 0| 0| 0| |Record-Route |Заголовок в запросах| 0| 0| 0| 0| 0| 0| |Record-Route |Заголовок в ответах 2хх| 0| 0| 0| 0| 0 |0| |Route |Заголовок в запросах| 0| 0| 0| 0| 0| 0| |Server |Заголовок в ответах| 0| 0| 0| 0| 0| 0| |Subject |Заголовок в запросах| F| F| F| 0| F| F| |Timestamp |Общий заголовок| 0| 0| 0| 0| 0| 0| |To |Общий заголовок - копируется из запросов в ответы| М| М| М| М| М| М| |Unsupported |Заголовок в ответе 420| 0| 0| 0| 0| 0| 0| |User-Agent |Общий заголовок| 0| 0| 0 |0 |0| 0| |Via |Общий заголовок - копируется из запросов в ответы| М| М| М| М|М |М| |Warning |Заголовок в ответах| 0| 0| 0| 0| 0| 0| |WWW-Authenticate |Заголовок в ответе 401| 0| 0| 0| 0| 0| 0| * Примечание - поле необходимо только в случае, когда тело сообщения содержит какую-либо информацию, т.е. не является пустым.