SIP 504 Server Time-out: таймауты upstream-шлюзов и зависшие транзакции
Длительная задержка при вызове с последующим аварийным завершением сессии:
- После набора номера тишина в трубке продолжается 10–32 секунды, после чего приходит
SIP/2.0 504 Server Time-out. - Промежуточный прокси-сервер не дождался ответа на запрос (например,
INVITE) от вышестоящего сервера в течение отведенного времени. - Потери пакетов в магистральном канале связи между АТС и оператором.
- Блокировка сигнального трафика межсетевым экраном (Stateful Firewall / NAT Timeout Drop).
1. Проверка потерь сигнальных пакетов (MTR / Traceroute)
Запустите трассировку сети с проверкой потерь пакетов до целевого хоста:
mtr -u -P 5060 -c 100 <IP_адрес_SIP_прокси_оператора>Если на промежуточных узлах наблюдается потеря пакетов (Packet Loss > 1%), это приводит к сгоранию транзакционных таймеров SIP.
2. Анализ стандартных таймеров SIP (RFC 3261)
Протокол SIP определяет поведение транзакций следующими таймерами:
- Timer T1: Базовый RTT (по умолчанию 500 мс). Определяет интервалы повтора пакетов UDP.
- Timer B (INVITE Transaction Timeout):
64 * T1(обычно 32 секунды). Если за это время не получен даже100 Trying, прокси генерирует 504. - Timer F (Non-INVITE Timeout): Таймаут для REGISTER/OPTIONS.
3. Оптимизация NAT и UDP Keep-Alive в PJSIP
Если удаленный шлюз находится за NAT и сбрасывает трансляции портов:
[provider-transport]
type=transport
protocol=udp
bind=0.0.0.0:5060
[provider-registration]
type=registration
transport=provider-transport
outbound_auth=provider-auth
server_uri=sip:provider.com
client_uri=sip:user@provider.com
; Отправка пакетов поддержки сессии NAT каждые 20 сек:
keep_alive_interval=20
[provider-endpoint]
type=endpoint
force_rport=yes
rewrite_contact=yes
rtp_symmetric=yes4. Настройка Failover по таймауту в Kamailio
Настройте переключение на резервный шлюз до наступления глобального тайм-аута:
# Установка таймаута ожидания первого ответа (Fr_Inv_Timer) в 4 секунды:
modparam("tm", "fr_timer", 4000)
modparam("tm", "fr_inv_timer", 20000)
failure_route[GW_FAILOVER] {
if (t_branch_timeout()) {
if (use_next_gw()) {
t_relay();
exit;
}
}
} Частые вопросы (FAQ)
В чем разница между SIP 408 Request Timeout и SIP 504 Server Time-out?
Код 408 генерируется конечным клиентом (UAC) или непосредственным сервером, если он сам не дождался ответа. Код 504 генерируется промежуточным прокси/SBC, сообщающим, что таймаут произошел глубже в сети (на вышестоящем сервере).
Почему вызов отваливается по 504 ровно через 32 секунды?
32 секунды — это стандартное значение таймера B (64 * 500мс T1) для ненадежного транспорта UDP согласно спецификации RFC 3261.
Как предотвратить зависание очередей вызовов при ошибках 504?
Уменьшайте время ожидания ответа от каждого транка в диалплане: Dial(PJSIP/${EXTEN}@trunk1,15) — если за 15 секунд шлюз не ответил, управление перейдет к следующему шагу диалплана.
Может ли переход на TCP/TLS устранить ошибку 504?
Да, если проблема была вызвана потерей больших фрагментированных пакетов UDP на маршрутизаторах или блокировкой UDP-сессий межсетевыми экранами.