SIP 513 Message Too Large: превышение MTU, фрагментация UDP и переход на TCP
Случайные или постоянные сбои при установлении сложных сессий вызовов:
- Сервер или пограничный маршрутизатор возвращает ответ
SIP/2.0 513 Message Too Large. - Вызов отбивается при включении большого числа кодеков, длинных списков маршрутизации
Record-Routeили передачи сертификатов/токенов безопасности. - Размер сигнального UDP-пакета превышает стандартный лимит MTU (1500 байт) или порог
1300 байт, определенный RFC 3261. - Потеря фрагментов IP-пакетов на промежуточных маршрутизаторах интернета.
1. Архитектурное требование RFC 3261 (Раздел 18.1.1)
Согласно стандарту, если размер SIP-сообщения в ненадежном транспорте UDP превышает величину Path MTU минус 200 байт (при неизвестном MTU — более 1300 байт), клиентский терминал или прокси ОБЯЗАН переключиться на использование протокола TCP.
2. Перевод транков и абонентов на TCP / TLS
Для гарантированного устранения ошибки 513 включите транспорт TCP в pjsip.conf:
; Настройка TCP транспорта:
[transport-tcp]
type=transport
protocol=tcp
bind=0.0.0.0:5060
; Привязка транспорта к транку оператора:
[provider-endpoint]
type=endpoint
transport=transport-tcp
media_address=203.0.113.10
context=from-trunk3. Очистка и минимизация размера заголовков в Asterisk / Kamailio
Если переключение на TCP невозможно со стороны оператора, уменьшите размер UDP-пакета:
- Сократите список кодеков: Оставьте только 1–2 используемых кодека (например,
alawиg729), удалив тяжелые видеокодеки и избыточные профили. - Удалите лишние кастомные заголовки: Исключите громоздкие заголовки
X-CRM-*,User-Agentи неиспользуемыеP-Header.
Пример оптимизации в диалплане:
[macro-clean-headers]
exten => s,1,NoOp(Removing custom headers)
same => n,Set(PJSIP_HEADER(remove,X-Long-Data)=)
same => n,Return()4. Проверка и увеличение MTU на сетевых интерфейсах
Если в инфраструктуре используются VPN-туннели (IPsec, WireGuard, GRE), где заголовок туннеля уменьшает полезный размер MTU:
# Проверка текущего MTU:
ip link show eth0
# Включение фрагментации в iptables TCPMSS (для TCP):
iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu Частые вопросы (FAQ)
Почему размер UDP-пакета в SIP критичен?
При превышении размера стандартного MTU (1500 байт) IP-пакет фрагментируется на уровне операционной системы. Потеря даже одного маленького фрагмента делает невозможной сборку всего SIP-сообщения, приводя к 'тихому' сбросу звонка.
Что должен сделать клиент при получении ответа 513?
Клиентский стек (UAC) должен повторить тот же самый запрос INVITE, автоматически переключив транспортный протокол с UDP на TCP.
Может ли включение WebRTC вызывать ошибку 513?
Да. SDP-оферы WebRTC содержат огромный объем данных (ICE кандидаты, DTLS отпечатки, криптографические атрибуты) и их размер часто достигает 2-4 КБ, что делает невозможным их передачу через стандартный UDP.
Как в Kamailio принудительно переключать большие сообщения на TCP?
Используйте модуль corex и функцию msg_apply_changes(): if (msg_size > 1300 && proto == UDP) { t_relay_to_tcp(); exit; }.