Основы телефонии
Фундаментальные протоколы и концепции, на которых строится любая современная телефонная система. Понимание этих основ — ключ ко всему остальному.
Что такое VoIP
VoIP (Voice over Internet Protocol) — это технология передачи голоса через IP-сети (интернет, локальная сеть) вместо традиционных телефонных линий. Голос оцифровывается, сжимается кодеком и отправляется в виде IP-пакетов — точно так же, как веб-страницы или электронная почта.
Выделенный канал на всё время разговора (circuit-switching). Один провод — один звонок. Дорогая инфраструктура, ограниченные возможности, фиксированная маршрутизация.
Голос передаётся пакетами через общую IP-сеть (packet-switching). Один канал — тысячи звонков. Дешёвая инфраструктура, гибкая маршрутизация, интеграция с ПО.
Стоимость: междугородние и международные звонки почти бесплатны. Гибкость: можно звонить с телефона, компьютера, браузера. Интеграция: CRM, аналитика, запись, IVR — всё через API. Масштабирование: добавление линий не требует нового оборудования.
В VoIP есть чёткое разделение сигнализации и медиа. Сигнализация (SIP) — это «кто кому звонит, принять/отклонить». Медиа (RTP) — это сам голос. Они передаются по разным каналам и могут идти разными путями.
Протокол SIP
SIP — протокол сигнализации. Он отвечает только за установку, изменение и завершение сеансов связи. SIP не передаёт голос — для этого используется RTP. SIP похож на HTTP: текстовый, читаемый, с заголовками и методами. Стандартные порты: 5060 (UDP/TCP) и 5061 (TLS).
Полный диалог SIP-вызова между двумя телефонами через АТС (PBX):
Телефон A PBX (АТС) Телефон B │ │ │ │ ──── INVITE ────> │ │ │ │ ──── INVITE ────> │ │ │ │ │ │ <── 100 Trying ─── │ │ <── 100 Trying ─── │ │ │ │ │ │ │ <── 180 Ringing ── │ │ <── 180 Ringing ── │ │ │ │ │ │ │ <──── 200 OK ───── │ │ <──── 200 OK ───── │ │ │ │ │ │ ────── ACK ──────> │ ────── ACK ──────> │ │ │ │ │ ═══════════════════ RTP (голос) ═══════════════════ │ │ │ │ │ ────── BYE ──────> │ ────── BYE ──────> │ │ │ │ │ │ <──── 200 OK ───── │ │ <──── 200 OK ───── │ │ │ │ │
Анатомия SIP INVITE-сообщения — ключевые заголовки:
From / To — кто звонит и кому
Via — маршрут прохождения запроса
Contact — прямой адрес для ответа
Call-ID — уникальный идентификатор звонка
CSeq — порядковый номер транзакции
SDP (Session Description Protocol) передаётся внутри SIP-сообщений и описывает медиа-параметры:
— IP-адрес и порт для RTP
— Список поддерживаемых кодеков
— Тип медиа (аудио, видео)
Обе стороны обмениваются SDP для согласования параметров (offer/answer).
Протокол RTP
RTP — протокол, который передаёт сам голос (и видео). В отличие от SIP, RTP работает поверх UDP и отправляет пакеты с аудио-данными 50 раз в секунду (каждые 20 мс). RTP-поток идёт отдельно от SIP — часто напрямую между устройствами, минуя сервер.
SIP-сигнализация RTP-медиа Телефон A ──SIP──> PBX ──SIP──> Телефон B Телефон A ═══RTP═══ Телефон B (порт 5060) (порт 5060) (порт 10000-20000) Сигнализация проходит через PBX, Медиа может идти напрямую а медиа — напрямую между телефонами (если PBX не нужен для записи/мониторинга)
Структура RTP-пакета:
Payload Type — какой кодек используется (определён в SDP при установке).
Sequence Number — порядковый номер для обнаружения потерь пакетов.
Timestamp — когда был записан аудио-семпл (для синхронизации).
SSRC — уникальный идентификатор потока (один на каждого участника).
Пакеты приходят с разной задержкой (jitter). Джиттер-буфер накапливает несколько пакетов и выдаёт их с равномерным интервалом. Слишком маленький буфер — потери и щелчки. Слишком большой — заметная задержка голоса. Типичный размер: 20–60 мс. Адаптивный буфер подстраивается автоматически.
Вместе с RTP работает протокол RTCP (RTP Control Protocol) — он передаёт статистику качества: потери пакетов, джиттер, задержку. RTCP используется для мониторинга качества связи, но не для самого голоса.
Кодеки
Кодек (Codec) — алгоритм кодирования и декодирования голоса. Определяет качество звука, требуемую полосу пропускания и вычислительную нагрузку. Выбор кодека — компромисс между качеством и трафиком.
| Кодек | Битрейт | Качество | Сжатие | Особенности |
|---|---|---|---|---|
| G.711 (a-law / u-law) | 64 kbps | Отличное | Нет | Стандарт для LAN. a-law — Европа, u-law — Северная Америка. Минимальная задержка. |
| G.722 | 64 kbps | HD Voice | Нет | Широкополосный (wideband, 16 kHz). Звучит заметно лучше G.711. Поддерживается большинством IP-телефонов. |
| G.729 | 8 kbps | Хорошее | 8:1 | Сильное сжатие — идеален для каналов с ограниченной полосой. Лицензируемый (есть бесплатный G.729a). |
| Opus | 6–510 kbps | Лучшее | Переменное | Современный, адаптивный. Используется в WebRTC. Open-source, без лицензий. Лучшее качество на любом битрейте. |
| iLBC | 13.3 / 15.2 kbps | Хорошее | ~4:1 | Устойчив к потерям пакетов (каждый фрейм независим). Хорош для нестабильных сетей. |
| GSM | 13 kbps | Среднее | ~5:1 | Унаследованный кодек мобильных сетей. Используется редко, но иногда встречается в legacy-системах. |
Для внутренней сети (LAN) используйте G.711 или G.722 — максимальное качество, полоса не проблема. Для WebRTC — Opus (он обязателен). Для каналов с ограниченной полосой — G.729. Opus является лучшим универсальным выбором, если оборудование его поддерживает.
DTMF
DTMF — тоновые сигналы, генерируемые при нажатии кнопок на телефоне. Каждая кнопка — это комбинация двух частот (отсюда «dual-tone»). DTMF используется для навигации по голосовым меню (IVR), ввода PIN-кодов, управления конференциями и других интерактивных сценариев.
Три способа передачи DTMF в VoIP:
Тоны передаются прямо в RTP-потоке как обычный звук. Проблема: сжимающие кодеки (G.729) искажают тоны, и они не распознаются. Работает только с G.711.
Ненадёжный
Цифры передаются как специальные RTP-пакеты с payload type 101. Не зависит от кодека — работает всегда. Самый распространённый метод.
Рекомендуемый
Цифра отправляется в SIP-сообщении типа INFO. Используется в некоторых специфичных сценариях (например, при взаимодействии с определёнными шлюзами).
Специальный
Если ваши голосовые меню не реагируют на нажатия — почти всегда проблема в режиме DTMF. Убедитесь, что и сервер, и телефон используют один и тот же метод (обычно RFC 2833).
NAT и телефония
NAT (Network Address Translation) заменяет приватные IP-адреса на публичный при выходе в интернет. Проблема: SIP-сообщения содержат приватный IP телефона («отправляй голос на 192.168.1.100:10000»), который недоступен извне. Результат — одностороннее аудио или полное его отсутствие.
Проблема NAT в VoIP: Телефон A NAT/Роутер SIP-сервер 192.168.1.100 203.0.113.50 198.51.100.10 │ │ │ │ SIP INVITE │ │ │ Contact: 192.168.1.100 │ │ │ SDP: audio 192.168.1.100:10000 │ │ ──────────────────────>│ │ │ │ SIP INVITE │ │ │ Contact: 192.168.1.100 <── Приватный IP! │ │ ──────────────────────>│ │ │ │ │ │ RTP → 192.168.1.100 │ │ │ НЕДОСТУПЕН! │ │ │ ✗ ✗ ✗ ✗ ✗ ✗ ✗ ✗ ✗ │
Решения проблемы NAT:
Session Traversal Utilities for NAT. Телефон спрашивает STUN-сервер: «какой у меня публичный IP и порт?» — и подставляет их в SDP. Работает с большинством NAT. Не работает с symmetric NAT.
Traversal Using Relays around NAT. Весь медиа-трафик проходит через TURN-сервер (relay). Работает всегда, но увеличивает задержку и нагрузку на сервер. Используется когда STUN не помогает.
Interactive Connectivity Establishment. Собирает все возможные «кандидаты» (прямой IP, STUN, TURN) и проверяет каждый путь. Выбирает лучший рабочий вариант. Стандарт для WebRTC.
Application Layer Gateway. Функция роутера, которая «умно» переписывает SIP-пакеты. На практике почти всегда ломает SIP. Рекомендация: отключить SIP ALG на роутере.
Если звонок устанавливается (вы слышите гудки), но после ответа нет голоса — в 90% случаев это проблема NAT. Проверьте: STUN настроен? SIP ALG отключён? Порты RTP (10000–20000) проброшены?
WebRTC
WebRTC (Web Real-Time Communication) — стандарт, встроенный во все современные браузеры (Chrome, Firefox, Safari, Edge), позволяющий передавать голос, видео и данные без плагинов. Для VoIP это означает: пользователь открывает веб-страницу и сразу может звонить.
Технологический стек WebRTC:
Opus — обязательный аудио-кодек (лучшее качество)
DTLS-SRTP — шифрование медиа (обязательно, нельзя отключить)
ICE + STUN + TURN — решение NAT-проблем
SDP — описание медиа-сессии (offer/answer)
Способ 1: SIP over WebSocket
Библиотека SIP.js или JsSIP в браузере отправляет SIP-сообщения через WebSocket (WSS). Сервер (FreeSWITCH) принимает их как обычные SIP.
Способ 2: Verto Protocol
Собственный протокол FreeSWITCH поверх WebSocket (JSON-RPC). Проще, чем SIP, но привязан к FreeSWITCH.
Браузер (WebRTC) FreeSWITCH SIP-телефон ┌─────────────┐ ┌──────────────┐ ┌───────────┐ │ SIP.js │ │ mod_verto │ │ │ │ (JavaScript│──WSS──│ mod_sofia │──SIP──│ IP Phone │ │ WebRTC API)│ │ │ │ │ └─────────────┘ └──────────────┘ └───────────┘ │ │ │ └─────── DTLS-SRTP (шифрованный RTP) ───────┘ или через сервер
WebRTC делает телефонию доступной любому пользователю с браузером — без установки ПО, без настроек сети, с обязательным шифрованием. Идеально для контакт-центров, CRM-интеграций и клиентских порталов.