SIP Error 420 Bad Extension: диагностика заголовков Require и Unsupported
- Входящий или исходящий звонок отклоняется сервером с кодом
420 Bad Extension. - В теле ответа 420 присутствует обязательный заголовок
Unsupportedсо списком отвергнутых расширений протокола (например,Unsupported: 100rel, timer). - Сессия завершается сразу после первичного
INVITE, не доходя до этапа вызова абонента (Ringing).
1. Анализ заголовка Require в SIP-трейсе
Откройте сигнатурный трейс и найдите заголовок Require или Proxy-Require в отправленном запросе:
INVITE sip:user@provider.com SIP/2.0
Require: 100rel, sec-agree, path
Supported: replaces, timerОтвет удаленной стороны:
SIP/2.0 420 Bad Extension
Unsupported: sec-agree, pathОшибка 420 означает, что инициатор принудительно затребовал поддержку функций через Require, которых сервер не имеет в своем стеке.
2. Исправление настроек 100rel (PRACK) в Asterisk
Если сервер отклоняет надежную доставку предварительных ответов (RFC 3262 100rel), отключите принудительное требование в /etc/asterisk/pjsip.conf:
[my-endpoint]
type=endpoint
# Варианты: no (выключено), yes (поддерживается), required (строго требуется)
100rel=yesЕсли оператор не поддерживает 100rel, установите значение в no:
100rel=no3. Корректировка заголовков в FreeSWITCH
В файле конфигурации SIP-профиля vars.xml или internal.xml измените принудительные флаги:
<!-- Переместить флаг из Require в Supported -->
<param name="enable-100rel" value="true"/>
<param name="session-timers" value="supported"/>4. Очистка кастомных заголовков Require через диалплан
В Asterisk extensions.conf можно удалить лишние параметры перед отправкой вызова в транк:
exten => _X.,1,NoOp(Cleaning Require Headers)
same => n,Set(PJSIP_HEADER(remove,Require)=)
same => n,Dial(PJSIP/${EXTEN}@my-outbound-trunk) Частые вопросы (FAQ)
В чем фундаментальная разница между заголовками Supported и Require?
Заголовок 'Supported' сообщает узлу, что клиент понимает расширение, но не настаивает на нем. Заголовок 'Require' делает использование расширения строго обязательным для продолжения вызова; если узел его не знает, он обязан выдать ошибку 420.
Какой заголовок обязательно должен присутствовать в ответе SIP 420?
Согласно RFC 3261, сервер, возвращающий 420 Bad Extension, обязан включить заголовок 'Unsupported', перечислив в нем все неподдерживаемые им опции из заголовка Require.
Что такое расширение 100rel и почему оно часто вызывает 420 ошибку?
100rel обеспечивает гарантированную доставку временных ответов (180 Ringing, 183 Session Progress) с использованием запроса PRACK и подтверждения. Устаревшие софтсвитчи не поддерживают PRACK и отвечают 420.
Как софтфон должен реагировать на ответ 420 Bad Extension?
Корректный клиент должен повторить отправку запроса INVITE, предварительно исключив из заголовка Require те опции, которые были перечислены в заголовке Unsupported полученного ответа 420.