SIP 485 Ambiguous: неоднозначность адресации и списки альтернатив в Contact
При попытке совершения вызова или запроса поиска абонента происходят следующие события:
- Сервер возвращает ответ
SIP/2.0 485 Ambiguous. - В теле ответа содержится список альтернативных контактов в заголовках
Contact, либо текстовое описание возможных совпадений. - Вызов прекращается, так как инициатор вызова (UAC) не может самостоятельно определить однозначного получателя.
- Проблема возникает при интеграциях со службами каталогов (LDAP/ENUM/Active Directory), где одно имя привязано к нескольким учетным записям.
1. Анализ заголовка Contact в ответе 485
Захватите пакет через sngrep и изучите заголовки ответа:
SIP/2.0 485 Ambiguous
Via: SIP/2.0/UDP 192.168.1.50:5060;branch=z9hG4bK776asdhds
To: <sip:john.smith@domain.com>;tag=12345
From: <sip:alice@domain.com>;tag=54321
Call-ID: a84b4c76e66710
CSeq: 101 INVITE
Contact: <sip:john.smith.dev@domain.com>, <sip:john.smith.sales@domain.com>
Content-Length: 02. Устранение коллизий в ENUM и адресных книгах
Если в системе используется модуль enum в Asterisk или Kamailio, проверьте записи NAPTR в DNS-зоне:
dig +short -t NAPTR 4.3.2.1.e164.arpaУбедитесь, что для одного телефонного номера не возвращается несколько равнозначных URI с одинаковым приоритетом (order/preference), приводящих к неопределенности маршрута.
3. Конфигурация диалплана во избежание неоднозначного поиска
В FreePBX / Asterisk исключите поиск по неполному CallerID Name при сопоставлении с внутренними экстеншенами:
[from-internal]
; Неправильно: поиск по общему имени
; exten => s,1,Set(DEST=${DB(DIRECTORY/smith)})
; Правильно: жесткая маршрутизация по уникальному табельному номеру / ID:
exten => _[1-8]XXX,1,Dial(PJSIP/${EXTEN},30)
same => n,Hangup()4. Корректировка логики SIP Proxy (Kamailio)
Если Kamailio выполняет lookup по таблице dbaliases или location:
# Если найдено несколько записей, выполняйте Forking (параллельный вызов), а не отдавайте 485:
lookup("location");
switch ($rc) {
case 1:
# Контакты загружены в R-URI и ветки (Branches)
t_relay();
break;
case -1:
case -3:
sl_send_reply("404", "User Not Found");
break;
default:
sl_send_reply("500", "Server Internal Error");
break;
} Частые вопросы (FAQ)
Что означает статус SIP 485 Ambiguous?
Этот статус сообщает, что указанный в Request-URI адрес получателя является неоднозначным (соответствует нескольким различным адресатам), и сервер не может самостоятельно выбрать конкретную конечную точку.
Должен ли UAC повторять вызов автоматически при получении 485?
Автоматический повтор не выполняется, если пользователь явно не выбрал один из альтернативных вариантов, возвращенных сервером в заголовке Contact.
Чем отличается обработка 485 от параллельного дозвона (Parallel Forking)?
При Parallel Forking сервер прокси сам клонирует INVITE на все найденные контакты абонента (например, мобильный и софтфон). Код 485 отправляется тогда, когда контакты принадлежат разным людям/сервисам и сервер делегирует выбор звонящему.
Используется ли статус 485 в классической голосовой телефонии?
В классических телефонных сетях этот статус крайне редок. Он чаще встречается в распределенных корпоративных коммуникациях Unified Communications и SIP-системах на базе ENUM-справочников.