02

Протоколы АТС

В телефонии один звонок задействует 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 Session Initiation Protocol — главный протокол телефонии

Что делает: устанавливает, изменяет и завершает звонки. Это «управляющий» протокол — он НЕ передаёт голос, а только договаривается о звонке.

Аналогия: 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:

ТранспортПортКогда
UDP5060Внутренняя сеть (быстро, без overhead). Между Kamailio и FreeSWITCH
TCP5060Большие SIP-сообщения (>MTU), надёжная доставка
TLS5061Шифрование. SIP-телефоны через интернет к SBC
WSS443WebSocket Secure. Браузеры (WebRTC) к SBC

SDP

SDP Session Description Protocol — «визитная карточка» медиа

Что делает: передаётся внутри SIP-сообщений (INVITE и 200 OK). Говорит: «Мой IP для голоса — такой-то, мои кодеки — такие-то, слушаю на порту таком-то».

Аналогия: SIP — это «Давай созвонимся». SDP — это «Вот мой номер и я говорю по-русски и по-английски».

;; SDP внутри SIP INVITE — «вот что я умею» v=0 o=- 123456 1 IN IP4 10.0.1.50 ← мой IP s=call c=IN IP4 10.0.1.50 ← куда слать голос t=0 0 m=audio 20000 RTP/AVP 111 0 8 ← порт 20000, кодеки 111, 0, 8 a=rtpmap:111 opus/48000/2 ← кодек 111 = Opus a=rtpmap:0 PCMU/8000 ← кодек 0 = G.711 μ-law a=rtpmap:8 PCMA/8000 ← кодек 8 = G.711 A-law a=sendrecv ← и отправляю, и принимаю

Второй участник отвечает своим SDP в 200 OK — выбирает кодек из предложенных. После этого оба знают куда и как слать голос.

Медиа (RTP/SRTP/RTCP)

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Зашифрованный RTPAES-128Между SBC и клиентами, между SBC и провайдерами
DTLS-SRTPSRTP с обменом ключами по DTLSAES-128 + DTLS handshakeWebRTC (обязательно) — браузер отказывается без шифрования
RTCPСтатистика качества (потери, jitter, RTT)Параллельно с RTP, для мониторинга

DTMF

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 — стек протоколов для браузера

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

STUN / TURN / ICE — пробиваем NAT

Большинство устройств находятся за 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 / NATS / HEP — внутренние протоколы стека

Кроме стандартных телефонных протоколов, в нашем стеке есть протоколы для связи между компонентами:

ПротоколМежду кемЗачемПорт
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/TCP5060Установка/завершение звонковВезде
SIP/TLSСигнализацияTLS5061Шифрованный SIPSBC ↔ телефоны
SIP/WSSСигнализацияWebSocket+TLS443SIP из браузераSBC ↔ браузер
SDPСигнализациявнутри SIPОписание медиа-параметровВ каждом INVITE/200 OK
RTPМедиаUDP10000-20000Голос (незашифрованный)Внутренняя сеть
SRTPМедиаUDP10000-20000Голос (зашифрованный)SBC ↔ внешний мир
DTLS-SRTPМедиаUDP10000-20000Голос WebRTC (обязательно шифрованный)RTPEngine ↔ браузер
RTCPМедиаUDPRTP+1Статистика качестваПараллельно RTP
DTMF (RFC 2833)Медиавнутри RTPНажатия клавиш в IVRВ RTP-потоке
STUNNATUDP3478Определение публичного IPБраузер → STUN-сервер
TURNNATUDP/TCP3478Relay медиа через серверБраузер → TURN-сервер
ICENATФреймворк: STUN + TURN + выбор лучшего путиWebRTC
ESLВнутреннийTCP8021Go управляет FreeSWITCHGo API ↔ FS
NATSВнутреннийTCP4222Шина событий между сервисамиGo API ↔ сервисы
HEPМониторингUDP9060Копирование SIP для HomerKamailio/FS → Homer
DMQКластерUDP5062Синхронизация Kamailio-нодKamailio ↔ Kamailio
HTTP/RESTAPITCP+TLS443/8080REST API, CDR, конфигурацияReact ↔ Go API ↔ FS
WebSocketAPITCP+TLS443Реалтайм дашборды, уведомленияReact ↔ Go API
Один звонок = 8 протоколов одновременно

Когда оператор в браузере звонит клиенту на мобильный через 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 протоколов задействованы в одном звонке. Вот почему телефония сложнее веб-разработки.