SIP Error 481 Call/Transaction Does Not Exist: траблшутинг диалогов и BYE/ACK
- Разрыв разговора или зависание сессии при попытке положить трубку (запрос
BYEвозвращает481 Call/Transaction Does Not Exist). - Сбой при постановке на удержание (Hold), снятии с удержания или отправке DTMF через
SIP INFO. - Зависание активных каналов в выводе
core show channelsIP-АТС.
1. Архитектура SIP Dialog и причины ошибки 481
Каждый вызов в SIP идентифицируется триплетом: Call-ID, From tag и To tag. Ошибка 481 возвращается узлом, когда он получает запрос внутри диалога (BYE, re-INVITE, ACK, INFO, UPDATE, NOTIFY), но в его памяти нет активного состояния для указанного диалога.
BYE sip:101@192.168.1.50:5060 SIP/2.0
Call-ID: c2b84f90-1234@192.168.1.10
From: <sip:100@pbx>;tag=as321
To: <sip:101@pbx>;tag=wrong-tag ; Ошибочный или несуществующий To-tag
CSeq: 102 BYEОтвет абонента:
SIP/2.0 481 Call/Transaction Does Not Exist2. Анализ причин в дампах трафика (sngrep)
- Таймаут сессии: Сервер уже уничтожил диалог по внутреннему таймауту (RTP timeout, Session Timer), а клиент прислал запоздалый
BYE. - Спуфинг или искажение To-tag / From-tag: Промежуточный SBC некорректно перезаписал теги диалога.
- Смена IP/порта за NAT: Ответ или запрос пришел с другого сокета без привязки к активному диалогу.
3. Настройка RTP Keepalive и таймаутов в Asterisk
Предотвратите преждевременное закрытие канала АТС из-за отсутствия медиа:
# /etc/asterisk/pjsip.conf
[endpoint-template](!)
type=endpoint
rtp_timeout=60
rtp_timeout_hold=300
rtp_keepalive=154. Принудительное закрытие зависших каналов в CLI
# Поиск зависшего канала
asterisk -rx "core show channels"
# Принудительное уничтожение канала
asterisk -rx "channel request hangup PJSIP/trunk-000001a2" Частые вопросы (FAQ)
Почему запрос ACK никогда не вызывает генерацию ошибки 481?
Согласно RFC 3261, запрос ACK на негативные ответы является частью транзакции, а ACK на 200 OK не порождает самостоятельных ответов протокола SIP во избежание бесконечных циклов подтверждения.
Что должен делать софтфон при получении 481 на отправленный BYE?
Клиент должен считать сессию успешно завершенной, освободить аудиоустройства, очистить структуры памяти диалога и вернуться в состояние готовности (IDLE).
Может ли несовпадение номеров CSeq стать причиной ошибки 481?
Если CSeq в запросе внутри диалога меньше предыдущего обработанного значения, сервер отклонит его с кодом 500 Internal Server Error или 400 Bad Request, но если транзакция не найдена — отдаст 481.
Как кластеризация серверов (Kamailio / OpenSIPS) влияет на возникновение 481?
Если входящий mid-dialog запрос (BYE/re-INVITE) из-за сбоя балансировщика попадает на соседнюю ноду кластера, которая не имеет данных о диалоге в распределенной памяти (DMQ/Redis), она ответит 481.