Протоколы АТС
В телефонии один звонок задействует 5-8 протоколов одновременно. Каждый отвечает за свою задачу: один устанавливает звонок, другой передаёт голос, третий шифрует, четвёртый пробивает NAT. Без понимания этих протоколов невозможно диагностировать проблемы.
Карта протоколов
Браузер SIP-телефон SBC Kamailio FreeSWITCH Go API (WebRTC) (аппаратный) (граница) (Core) (медиа) (логика) │ │ │ │ │ │ │◄──── WSS ────────┼──────────────►│ │ │ │ │ SIP over │ │ │ │ │ │ WebSocket │ │ │ │ │ │ (порт 443) │ │ │ │ │ │ │◄── SIP/TLS ──►│ │ │ │ │ │ (порт 5061) │ │ │ │ │ │ │◄── SIP/UDP ──►│ │ │ │ │ │ (порт 5060) │ │ │ │ │ │ │◄── SIP/UDP ──►│ │ │ │ │ │ (порт 5060) │ │ │ │ │ │ │ │ │◄──DTLS-SRTP──────┼──────────────►│ │ │ │ │ голос │ │RTPEngine │ │ │ │ шифрованный │◄── RTP ──────►│ SRTP↔RTP │ │ │ │ (порты │ голос │ транскод. │ │ │ │ 10000-20000) │ (порты │ │◄── RTP ──────►│ │ │ │ 10000-20000) │ │ (внутренний) │ │ │ │ │ │ │ │ │◄──ICE/STUN───────┼───────────────┼──►STUN-сервер │ │ │ │ NAT traversal │ │ │ │ │ │ │ │ │ │◄── ESL ──────►│ │ │ │ │ │ (порт 8021) │ │ │ │ │ │ TCP, текст │ │ │ │ │ │ │ │ │ │ │ │── HTTP ──────►│ │ │ │ │ │ JSON CDR │ │ │ │ │ │ (порт 8080) │ │ │ │ │ │ │ │◄──────────── HTTPS / WSS ────────────────────────────────────────────────────────►│ │ REST API, WebSocket (дашборд, управление) │ (порт 443) │
┌───────────────────────────────────────────────────────────────┐ │ УРОВЕНЬ 1: СИГНАЛИЗАЦИЯ (кто кому звонит, куда направить) │ │ │ │ SIP ─── установка/завершение звонка │ │ SDP ─── «мой IP для голоса: X, мои кодеки: Y» │ │ OСОБЕННОСТЬ: сигнализация и голос идут РАЗНЫМИ путями! │ └───────────────────────────────────────────────────────────────┘ ┌───────────────────────────────────────────────────────────────┐ │ УРОВЕНЬ 2: МЕДИА (сам голос / видео) │ │ │ │ RTP ──── голосовые пакеты (каждые 20мс = 50 пакетов/сек) │ │ RTCP ─── «качество связи: потери 2%, jitter 15мс» │ │ SRTP ─── зашифрованный RTP (TLS для голоса) │ │ DTLS ─── обмен ключами для SRTP (WebRTC) │ └───────────────────────────────────────────────────────────────┘ ┌───────────────────────────────────────────────────────────────┐ │ УРОВЕНЬ 3: ТРАНСПОРТ И ВСПОМОГАТЕЛЬНЫЕ │ │ │ │ TLS ──── шифрование SIP (SIP/TLS = SIPS, порт 5061) │ │ WSS ──── SIP поверх WebSocket (для браузеров) │ │ STUN ─── «мой публичный IP = X» (NAT discovery) │ │ TURN ─── relay через сервер (когда STUN не помог) │ │ ICE ──── комбинация STUN+TURN для надёжного соединения │ │ DNS ──── SRV-записи для нахождения SIP-серверов │ └───────────────────────────────────────────────────────────────┘
Сигнализация (SIP)
Что делает: устанавливает, изменяет и завершает звонки. Это «управляющий» протокол — он НЕ передаёт голос, а только договаривается о звонке.
Аналогия: SIP — это когда вы набираете номер на телефоне и слышите гудки. Сам разговор — это уже RTP.
Телефон A FreeSWITCH Телефон B │── INVITE ──────────►│ │ │ «Хочу позвонить │── INVITE ────────────────►│ │ на 1002» │ «Звонок для тебя» │ │ │ │ │◄── 100 Trying ──────│ │ │ «Обрабатываю» │◄── 180 Ringing ──────────│ │◄── 180 Ringing ─────│ «Звоню» │ │ «Звонит» │ │ │ │◄── 200 OK ────────────────│ │◄── 200 OK ───────────│ «Поднял трубку» │ │ «Ответил!» │ │ │── ACK ───────────────►│── ACK ──────────────────►│ │ «Подтверждаю» │ │ │ │ │ │◄═══════════ RTP (голос) ═══════════════════════════►│ │ разговор идёт... │ │ │ │ │── BYE ───────────────►│── BYE ──────────────────►│ │ «Кладу трубку» │ │ │◄── 200 OK ───────────│◄── 200 OK ────────────────│
| SIP-метод | Что делает | Когда |
|---|---|---|
| INVITE | Начинает звонок или изменяет параметры (re-INVITE) | Набор номера, hold, перевод |
| ACK | Подтверждает 200 OK | Завершение handshake |
| BYE | Завершает звонок | Кто-то повесил трубку |
| REGISTER | «Я телефон 1001, я по адресу 192.168.1.50» | При включении телефона, каждые 60 сек |
| OPTIONS | «Ты живой?» — проверка доступности | Keep-alive, мониторинг |
| CANCEL | Отменяет INVITE до ответа | Звонящий повесил трубку пока звонит |
| REFER | Перевод звонка на другой номер | Attended/blind transfer |
| SUBSCRIBE/NOTIFY | Подписка на события (BLF, presence) | Лампочки занятости на телефоне |
| INFO | Передача данных в диалоге (DTMF) | SIP INFO метод для DTMF |
Транспорт SIP:
| Транспорт | Порт | Когда |
|---|---|---|
| UDP | 5060 | Внутренняя сеть (быстро, без overhead). Между Kamailio и FreeSWITCH |
| TCP | 5060 | Большие SIP-сообщения (>MTU), надёжная доставка |
| TLS | 5061 | Шифрование. SIP-телефоны через интернет к SBC |
| WSS | 443 | WebSocket Secure. Браузеры (WebRTC) к SBC |
SDP
Что делает: передаётся внутри SIP-сообщений (INVITE и 200 OK). Говорит: «Мой IP для голоса — такой-то, мои кодеки — такие-то, слушаю на порту таком-то».
Аналогия: SIP — это «Давай созвонимся». SDP — это «Вот мой номер и я говорю по-русски и по-английски».
Второй участник отвечает своим SDP в 200 OK — выбирает кодек из предложенных. После этого оба знают куда и как слать голос.
Медиа (RTP/SRTP/RTCP)
RTP (Real-time Transport Protocol)
Собственно голос. Аудио нарезается на пакеты по 20мс (50 пакетов/сек) и отправляется по UDP. Каждый пакет — ~160 байт (G.711).
Аналогия: если SIP — это «Давай поговорим», то RTP — это сам разговор по телефону.
Порты: 10000–20000 (UDP). Каждый звонок занимает 2 порта (чётный для RTP, нечётный для RTCP).
Ключевой момент:
SIP и RTP идут разными путями! SIP — через Kamailio (сигнализация). RTP — через RTPEngine или напрямую (медиа). Это создаёт проблемы с NAT и файрволами.
A ──SIP──► Kamailio ──SIP──► B │ │ A ──RTP──► RTPEngine ──RTP──► B (разные IP и порты!)
| Протокол | Что | Шифрование | Когда |
|---|---|---|---|
| RTP | Голос / видео | Нет | Внутренняя сеть (доверенная) |
| SRTP | Зашифрованный RTP | AES-128 | Между SBC и клиентами, между SBC и провайдерами |
| DTLS-SRTP | SRTP с обменом ключами по DTLS | AES-128 + DTLS handshake | WebRTC (обязательно) — браузер отказывается без шифрования |
| RTCP | Статистика качества (потери, jitter, RTT) | — | Параллельно с RTP, для мониторинга |
DTMF
Когда в IVR нажимаете «1» — как эта цифра попадает на сервер? Три способа:
| Метод | Как | Плюсы | Минусы |
|---|---|---|---|
| RFC 2833 Рекомендуем | Специальные RTP-пакеты с типом 101 (telephone-event). Цифра передаётся внутри RTP-потока, но отдельно от голоса | Надёжный, не зависит от кодека, не искажается транскодированием | — |
| SIP INFO | SIP-сообщение INFO с телом Signal=1, Duration=250. Идёт через сигнализацию (SIP), не через медиа (RTP) |
Работает когда RTP недоступен | Задержки (SIP медленнее RTP), не все устройства поддерживают |
| In-band | Звук тонального сигнала (бип) кодируется прямо в голосовой поток | Работает с любым устройством | Искажается при сжатии (G.729). Ненадёжный |
WebRTC стек
WebRTC — это не один протокол, а стек из 5-6 протоколов:
┌──────────────────────────────────────────┐ │ БРАУЗЕР │ │ │ │ ┌──────────────────────────────┐ │ │ │ SIP.js / JsSIP │ │ │ │ SIP-клиент в JavaScript │ │ │ └──────────┬───────────────────┘ │ │ │ │ │ ┌──────────▼───────────────────┐ │ │ │ WebSocket (WSS) │ │ │ │ SIP-сообщения через WS │ │ │ │ порт 443, TLS обязателен │ │ │ └──────────┬───────────────────┘ │ │ │ │ │ ┌──────────▼───────────────────┐ │ │ │ ICE (Interactive Connectivity │ │ │ │ Establishment) │ │ │ │ Пробует все варианты связи: │ │ │ │ 1. Напрямую (host candidate) │ │ │ │ 2. Через NAT (STUN) │ │ │ │ 3. Через relay (TURN) │ │ │ └──────────┬───────────────────┘ │ │ │ │ │ ┌──────────▼───────────────────┐ │ │ │ DTLS (Datagram TLS) │ │ │ │ Обмен ключами шифрования │ │ │ │ (как TLS, но для UDP) │ │ │ └──────────┬───────────────────┘ │ │ │ │ │ ┌──────────▼───────────────────┐ │ │ │ SRTP │ │ │ │ Зашифрованный голос / видео │ │ │ │ AES-128 │ │ │ └──────────────────────────────┘ │ └──────────────────────────────────────────┘
STUN/TURN/ICE
Большинство устройств находятся за NAT (роутером). Их внутренний IP (192.168.x.x) не виден из интернета. Как доставить голос?
| Протокол | Что делает | Аналогия |
|---|---|---|
| STUN | Браузер спрашивает STUN-сервер: «Какой у меня публичный IP?» Сервер отвечает: «203.0.113.55:12345». Теперь браузер знает свой внешний адрес и сообщает его в SDP | Спросить друга: «Какой у меня номер на определителе?» |
| TURN | Если STUN не помог (симметричный NAT, корпоративный файрвол) — TURN-сервер становится relay: весь голос идёт через него. Работает всегда, но дороже (трафик через сервер) | Звонить через посредника, который передаёт слова |
| ICE | Комбинирует STUN и TURN. Пробует все варианты связи и выбирает лучший: напрямую → через STUN → через TURN | Попробовать позвонить напрямую, если не получилось — через оператора |
Внутренние протоколы
Кроме стандартных телефонных протоколов, в нашем стеке есть протоколы для связи между компонентами:
| Протокол | Между кем | Зачем | Порт |
|---|---|---|---|
| ESL (Event Socket) | Go API ↔ FreeSWITCH | Управление звонками из Go: originate, transfer, hold, события | 8021 / TCP |
| NATS | Go API ↔ другие сервисы | Шина событий: «звонок завершён», «агент освободился», «новый CDR» | 4222 / TCP |
| HEP (Homer Encapsulation) | Kamailio / FS → Homer | Копирование SIP-пакетов для мониторинга и troubleshooting. Homer показывает call-flow диаграммы | 9060 / UDP |
| DMQ (Kamailio Dialog) | Kamailio ↔ Kamailio | Синхронизация состояния между нодами кластера (регистрации, диалоги) | 5062 / UDP |
Сводная таблица
Полная сводная таблица: все протоколы в одном месте
| Протокол | Уровень | Транспорт | Порт(ы) | Зачем | Где у нас |
|---|---|---|---|---|---|
| SIP | Сигнализация | UDP/TCP | 5060 | Установка/завершение звонков | Везде |
| SIP/TLS | Сигнализация | TLS | 5061 | Шифрованный SIP | SBC ↔ телефоны |
| SIP/WSS | Сигнализация | WebSocket+TLS | 443 | SIP из браузера | SBC ↔ браузер |
| SDP | Сигнализация | внутри SIP | — | Описание медиа-параметров | В каждом INVITE/200 OK |
| RTP | Медиа | UDP | 10000-20000 | Голос (незашифрованный) | Внутренняя сеть |
| SRTP | Медиа | UDP | 10000-20000 | Голос (зашифрованный) | SBC ↔ внешний мир |
| DTLS-SRTP | Медиа | UDP | 10000-20000 | Голос WebRTC (обязательно шифрованный) | RTPEngine ↔ браузер |
| RTCP | Медиа | UDP | RTP+1 | Статистика качества | Параллельно RTP |
| DTMF (RFC 2833) | Медиа | внутри RTP | — | Нажатия клавиш в IVR | В RTP-потоке |
| STUN | NAT | UDP | 3478 | Определение публичного IP | Браузер → STUN-сервер |
| TURN | NAT | UDP/TCP | 3478 | Relay медиа через сервер | Браузер → TURN-сервер |
| ICE | NAT | — | — | Фреймворк: STUN + TURN + выбор лучшего пути | WebRTC |
| ESL | Внутренний | TCP | 8021 | Go управляет FreeSWITCH | Go API ↔ FS |
| NATS | Внутренний | TCP | 4222 | Шина событий между сервисами | Go API ↔ сервисы |
| HEP | Мониторинг | UDP | 9060 | Копирование SIP для Homer | Kamailio/FS → Homer |
| DMQ | Кластер | UDP | 5062 | Синхронизация Kamailio-нод | Kamailio ↔ Kamailio |
| HTTP/REST | API | TCP+TLS | 443/8080 | REST API, CDR, конфигурация | React ↔ Go API ↔ FS |
| WebSocket | API | TCP+TLS | 443 | Реалтайм дашборды, уведомления | React ↔ Go API |
Когда оператор в браузере звонит клиенту на мобильный через PSTN:
Браузер оператора Наш стек Мобильный клиента 1. WSS SIP INVITE ──────► Access SBC (Kamailio) 2. SIP/UDP ──► Kamailio Core 3. SIP/UDP ──► FreeSWITCH 4. ESL Go получает event ◄── FreeSWITCH 5. SIP/UDP FS dial out ──► Kamailio Core 6. SIP/UDP ──► Trunk SBC 7. SIP/TLS ──► SIP-провайдер ──► PSTN ──► Мобильный Медиа (голос): 8. DTLS-SRTP браузер ──► RTPEngine (Access) 9. RTP RTPEngine ──► FreeSWITCH (транскод Opus→G.711) 10. RTP FreeSWITCH ──► RTPEngine (Trunk) 11. RTP RTPEngine ──► SIP-провайдер ──► PSTN ──► Мобильный Параллельно: 12. HEP SIP-пакеты ──► Homer (мониторинг) 13. NATS событие ──► Dashboard (React) 14. RTCP статистика ──► Prometheus → Grafana
14 протоколов задействованы в одном звонке. Вот почему телефония сложнее веб-разработки.