Разбор структуры SIP-сообщения и типов запросов
Мы уже разобрались с архитектурой Asterisk, его компонентами, научились устанавливать FreePBX Distro и настраивать базовую сеть. Теперь пришло время углубиться в сердце VoIP-связи — протокол SIP. Понимание SIP-сообщений критически важно для диагностики и тонкой настройки вашей АТС.
Основы SIP-сообщений
SIP (Session Initiation Protocol) — это протокол прикладного уровня, который устанавливает, изменяет и завершает мультимедийные сеансы, например, голосовые и видеозвонки. По структуре SIP-сообщения похожи на HTTP-запросы, что облегчает их понимание.
Каждое SIP-сообщение состоит из трёх частей:
- Стартовая строка: Определяет тип сообщения (запрос или ответ) и версию SIP.
- Заголовки: Содержат метаданные о сообщении, отправителе, получателе, маршрутизации и параметрах сеанса.
- Тело сообщения: Необязательная часть, которая обычно содержит описание сеанса в формате SDP (Session Description Protocol).
Вот пример:
INVITE sip:user@example.com SIP/2.0
Via: SIP/2.0/UDP 192.168.1.100:5060;branch=z9hG4bK-323423-123
From: Alice <sip:alice@example.com>;tag=12345
To: Bob <sip:user@example.com>
Call-ID: 67890@192.168.1.100
CSeq: 1 INVITE
Contact: <sip:alice@192.168.1.100:5060>
Content-Type: application/sdp
Content-Length: 142
v=0
o=alice 2890844526 2890844526 IN IP4 192.168.1.100
s=SIP Call
c=IN IP4 192.168.1.100
t=0 0
m=audio 5004 RTP/AVP 0 8 101
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-16
Здесь:
INVITE sip:user@example.com SIP/2.0— стартовая строка, тип запросаINVITE.Via,From,To,Call-ID,CSeq,Contact,Content-Type,Content-Length— это заголовки.v=0и далее — тело сообщения в формате SDP, описывающее параметры аудиосеанса (кодеки, порты).
Важно: SIP сам по себе не передаёт медиа-трафик (голос, видео). Он лишь управляет установлением сеанса. Медиа-трафик передаётся по протоколу RTP (Real-time Transport Protocol), параметры которого описываются в SDP.
Ключевые заголовки SIP-сообщений
Понимание основных заголовков поможет вам быстро ориентироваться в SIP-трафике:
Via: Показывает путь сообщения. Каждый прокси-сервер добавляет свой адрес. Используется для маршрутизации ответов.From: Идентификатор инициатора запроса (кто звонит). Содержит SIP URI и уникальныйtag.To: Идентификатор получателя запроса (кому звонят). Содержит SIP URI.Call-ID: Уникальный идентификатор для всего сеанса вызова. Все сообщения одного вызова имеют одинаковыйCall-ID.CSeq(Command Sequence): Порядковый номер и метод запроса. Увеличивается с каждым новым запросом в рамках одногоCall-ID.Contact: Прямой адрес для связи с инициатором или получателем. Используется для маршрутизации последующих сообщений.Max-Forwards: Аналог TTL в IP-пакетах. Уменьшается на единицу при прохождении через каждый прокси-сервер. Предотвращает зацикливание сообщений.User-Agent: Идентифицирует ПО, отправившее запрос (например, "Asterisk PBX 18.x.x").
Типы SIP-запросов (методы)
SIP определяет несколько типов запросов, или методов, каждый из которых выполняет свою функцию в жизненном цикле вызова. Вот наиболее частые:
INVITE: Инициирует новый сеанс. Содержит SDP для описания медиа-параметров.ACK(Acknowledgement): Подтверждает получение финального ответа наINVITE.BYE: Завершает установленный сеанс.CANCEL: Отменяет ожидающий запрос (например, если вызываемый абонент не ответил, а вызывающий положил трубку).REGISTER: Регистрирует местоположение пользователя на SIP-сервере (например, IP-адрес телефона).OPTIONS: Запрашивает у сервера или клиента информацию о его возможностях (поддерживаемые методы, кодеки).INFO: Передаёт информацию внутри установленного сеанса (например, DTMF-сигналы).MESSAGE: Передаёт мгновенные сообщения (текстовый чат).SUBSCRIBE: Запрашивает подписку на события (например, статус присутствия).NOTIFY: Уведомляет подписчиков о произошедших событиях.
Пример использования REGISTER
Когда ваш IP-телефон или софтфон включается, он отправляет REGISTER запрос на Asterisk, чтобы сообщить свой текущий IP-адрес и порт.
REGISTER sip:pbx.example.com SIP/2.0
Via: SIP/2.0/UDP 192.168.1.101:5060;branch=z9hG4bK-reg-123
From: <sip:101@pbx.example.com>;tag=abcde
To: <sip:101@pbx.example.com>
Call-ID: fghij@192.168.1.101
CSeq: 1 REGISTER
Contact: <sip:101@192.168.1.101:5060>;expires=3600
Content-Length: 0
Asterisk получает этот запрос, записывает информацию о местоположении абонента 101 и отправляет ответ 200 OK, подтверждая регистрацию.
Практическое задание
Подключитесь к вашей FreePBX Distro по SSH и выполните команду asterisk -rvvv. Затем совершите тестовый звонок с одного внутреннего номера на другой (если настроено) или на внешний номер. Внимательно следите за выводом в консоли Asterisk. Вы увидите множество SIP-сообщений.
Попробуйте найти в логах:
- Запрос
INVITEи его заголовкиFrom,To,Call-ID. - Ответ
200 OKнаINVITE. - Запрос
BYEпри завершении вызова.
Это поможет вам сопоставить теорию с практикой и начать "читать" SIP-трафик.
Теперь, когда мы понимаем структуру SIP-сообщений и их типы, мы готовы рассмотреть, как эти сообщения взаимодействуют между собой, формируя полный жизненный цикл SIP-вызова. Это позволит нам увидеть общую картину и понять, как звонок проходит от начала до конца.