Разбор структуры SIP-сообщения и типов запросов - Asterisk и FreePBX: От GUI к Глубокому Администрированию и Оптимизации - Qpel.AI

Разбор структуры SIP-сообщения и типов запросов

Мы уже разобрались с архитектурой Asterisk, его компонентами, научились устанавливать FreePBX Distro и настраивать базовую сеть. Теперь пришло время углубиться в сердце VoIP-связи — протокол SIP. Понимание SIP-сообщений критически важно для диагностики и тонкой настройки вашей АТС.

Основы SIP-сообщений

SIP (Session Initiation Protocol) — это протокол прикладного уровня, который устанавливает, изменяет и завершает мультимедийные сеансы, например, голосовые и видеозвонки. По структуре SIP-сообщения похожи на HTTP-запросы, что облегчает их понимание.

Каждое SIP-сообщение состоит из трёх частей:

  1. Стартовая строка: Определяет тип сообщения (запрос или ответ) и версию SIP.
  2. Заголовки: Содержат метаданные о сообщении, отправителе, получателе, маршрутизации и параметрах сеанса.
  3. Тело сообщения: Необязательная часть, которая обычно содержит описание сеанса в формате 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-сообщений.

Попробуйте найти в логах:

  1. Запрос INVITE и его заголовки From, To, Call-ID.
  2. Ответ 200 OK на INVITE.
  3. Запрос BYE при завершении вызова.

Это поможет вам сопоставить теорию с практикой и начать "читать" SIP-трафик.

Теперь, когда мы понимаем структуру SIP-сообщений и их типы, мы готовы рассмотреть, как эти сообщения взаимодействуют между собой, формируя полный жизненный цикл SIP-вызова. Это позволит нам увидеть общую картину и понять, как звонок проходит от начала до конца.