Анализ заголовков маршрутизации SIP: Via, Route, Record-Route и Loose Routing
- SIP-запросы зацикливаются между прокси-серверами, приводя к ошибке
483 Too Many Hops. - Запрос
INVITEдоходит до телефона, но последующиеACKилиBYEуходят в никуда, подвешивая каналы. - Сообщения внутри диалога (Re-INVITE, INFO) отклоняются промежуточными узлами.
1. Назначение базовых заголовков маршрутизации
- Via: фиксирует путь прохождения запроса для возврата ответов (hop-by-hop). Защищает от петель через параметр
branch. - Record-Route: вставляется прокси-серверами, желающими оставаться в цепочке последующих запросов внутри установленного диалога.
- Route: используется клиентом/прокси для принудительной маршрутизации запроса через список узлов из
Record-Route. - Contact: прямой адрес оконечного устройства для прямой доставки новых запросов диалога.
2. Loose Routing против Strict Routing
В современном стандарте RFC 3261 используется Loose Routing (обозначается параметром ;lr). Адрес назначения в Request-URI остается адресом конечного абонента, а промежуточные узлы берутся из заголовков Route.
# Пример корректного Loose Routing заголовка
Record-Route: <sip:195.200.10.1;lr;ftag=as1234;nat=yes>3. Анализ формирования Route Set при ответе 200 OK
При получении ответа 200 OK вызывающая сторона строит список Route Set на основе зеркально отраженных заголовков Record-Route и отправляет ACK:
ACK sip:user@192.168.1.50:5060 SIP/2.0
Via: SIP/2.0/UDP 203.0.113.1:5060;branch=z9hG4bK4321
Route: <sip:195.200.10.1;lr>
To: <sip:user@domain.com>;tag=def567
From: <sip:caller@domain.com>;tag=as1234
Call-ID: c789@203.0.113.1 Частые вопросы (FAQ)
Что произойдет, если прокси-сервер не добавит заголовок Record-Route?
Прокси обработает только начальный INVITE. Все последующие сообщения диалога (ACK, BYE, Re-INVITE) пойдут напрямую между Contact-адресами клиентов, в обход данного прокси.
Как параметр 'branch' в заголовке Via защищает от петель?
Он содержит уникальный идентификатор транзакции, начинающийся с магического префикса 'z9hG4bK'. Если узел получает запрос со своим собственным branch, он фиксирует петлю и возвращает 482 Loop Detected.
Почему устаревший Strict Routing ломал маршрутизацию?
При Strict Routing прокси заменял Request-URI своим адресом, теряя оригинальный целевой адрес назначения из поля запроса.
В каком порядке должны располагаться заголовки Route?
Заголовки Route располагаются строго в порядке прохождения узлов от отправителя к получателю (прямой порядок для вызывающего и инвертированный для отвечающего).