Основы VoIP и протоколы SIP с PJSIP
Традиционная телефония десятилетиями опиралась на выделенные медные линии. Когда вы звонили в другой город, телефонная станция физически замыкала цепь между вашим аппаратом и аппаратом собеседника. Эта технология надежна, но крайне неэффективна: пока вы молчите, линия все равно занята, а прокладка кабелей стоит огромных денег.
IP-телефония (или VoIP — Voice over Internet Protocol) решает эту проблему, превращая человеческий голос в цифровые данные. Вместо удержания выделенной линии, голос сжимается, нарезается на мелкие кусочки (пакеты) и отправляется через интернет точно так же, как электронные письма или веб-страницы.
Представьте, что вы отправляете книгу по почте. В традиционной телефонии вам пришлось бы арендовать целый поезд, чтобы отвезти одну книгу. В IP-телефонии вы разрываете книгу на страницы, кладете каждую в отдельный конверт и отправляете обычной почтой. На стороне получателя страницы снова собираются в книгу. Если пара конвертов придет с задержкой, получатель все равно поймет смысл.
Такой подход кардинально снижает стоимость связи. Для расчета объема передаваемых данных в VoIP используется простая формула:
Где — итоговый объем данных в килобайтах, — скорость потока данных выбранного кодека (например, около 10 килобайт в секунду для стандартного кодека G.711), а — время разговора в секундах.
При таких параметрах минута непрерывного разговора потребует всего около 600 килобайт трафика. Это позволяет компаниям совершать тысячи одновременных звонков через стандартное интернет-подключение, экономя колоссальные бюджеты на междугородней и международной связи.
Разделение труда: протоколы SIP и RTP
Чтобы два устройства могли поговорить через интернет, им нужно договориться о правилах. В VoIP эти правила разделены на две независимые части: управление вызовом и передача самого голоса.
SIP (Session Initiation Protocol) — это протокол установления сеанса. Он не передает звук. Его единственная задача — найти абонента, сообщить ему о звонке, договориться о том, как именно будет передаваться голос, и завершить звонок, когда кто-то положит трубку.
RTP (Real-Time Transport Protocol) — это транспортный протокол реального времени. Именно он переносит пакеты с вашим голосом от одного устройства к другому после того, как SIP выполнил свою работу.
SIP — это администратор в ресторане. Он встречает вас, проверяет бронь, провожает к столику и уходит. Он не готовит еду и не кормит вас. Еда, которую вам приносят официанты — это RTP.
Программная АТС Asterisk и драйвер PJSIP
Чтобы управлять десятками или тысячами звонков, маршрутизировать их, записывать разговоры и создавать голосовые меню, нужен центральный мозг. Таким мозгом выступает Asterisk — самая популярная в мире программная АТС (Private Branch Exchange, PBX) с открытым исходным кодом.
Исторически в Asterisk использовался модуль chan_sip для работы с протоколом SIP. Однако со временем протокол усложнялся, и старый модуль перестал справляться с современными требованиями. Ему на смену пришел PJSIP — современный, модульный и высокопроизводительный стек.
Главное отличие PJSIP от предшественника заключается в его архитектуре. Если раньше все настройки абонента сваливались в одну кучу, то PJSIP разделяет конфигурацию на логические блоки:
- Endpoint (Конечная точка) — базовый профиль устройства (кодеки, таймеры, функции)
- Auth (Авторизация) — логин и пароль для подключения
- AOR (Address of Record) — адресная книга, которая знает, какой IP-адрес сейчас у устройства
| Характеристика | Старый chan_sip | Новый PJSIP |
|---|---|---|
| Архитектура | Монолитная (все в одном файле) | Модульная (разделение на Endpoint, Auth, AOR) |
| Поддержка устройств | Одно устройство на один аккаунт | Несколько устройств на один аккаунт (например, телефон на столе и приложение в смартфоне) |
| Статус | Устарел (Deprecated) | Активно развивается и поддерживается |
Подготовка сервера Ubuntu 22.04
Любая надежная система IP-телефонии начинается с правильно подготовленного фундамента. Мы будем использовать операционную систему Ubuntu 22.04 LTS.
Перед установкой Asterisk необходимо обновить систему и установить инструменты для сборки программ из исходного кода, а также библиотеки, необходимые для работы с криптографией, базами данных и медиа-форматами.
Откройте терминал вашего сервера и выполните команду обновления:
sudo apt update && sudo apt upgrade -y
После завершения обновления установите базовые зависимости. Этот процесс может занять несколько минут:
sudo apt install -y build-essential wget libssl-dev libncurses5-dev \
libnewt-dev libxml2-dev linux-headers-$(uname -r) libsqlite3-dev \
uuid-dev libjansson-dev
Каждая из этих библиотек выполняет свою роль. Например, libssl-dev нужна для шифрования звонков, а libjansson-dev позволяет Asterisk работать с форматом данных JSON, который активно используется в современных веб-интеграциях.
Установка Asterisk из исходного кода
Хотя Asterisk можно установить из стандартных репозиториев Ubuntu одной командой, в профессиональной среде его всегда собирают из исходного кода. Это дает полный контроль над тем, какие модули будут включены в систему, и позволяет использовать самую свежую стабильную версию.
Перейдите в директорию для загрузки исходников и скачайте архив с 20-й версией Asterisk (текущая LTS-версия):
cd /usr/src
sudo wget https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-20-current.tar.gz
Распакуйте скачанный архив и перейдите в созданную папку:
sudo tar xvf asterisk-20-current.tar.gz
cd asterisk-20.*
Перед компиляцией Asterisk должен проверить вашу систему и убедиться, что все необходимые компоненты присутствуют. Для этого в комплекте идет специальный скрипт, который автоматически скачает недостающие библиотеки для работы с MP3 и другими форматами:
sudo contrib/scripts/install_prereq install
Теперь запустите конфигуратор:
sudo ./configure
Если конфигурация прошла успешно, вы увидите на экране логотип Asterisk, нарисованный символами ASCII. Это значит, что система готова к сборке.
Запустите процесс компиляции. Команда make переведет исходный код на языке C в исполняемые бинарные файлы. Это самая ресурсоемкая часть установки:
sudo make
После успешной компиляции установите программу в систему:
sudo make install
Чтобы не писать конфигурационные файлы с абсолютно чистого листа, установите базовые примеры конфигураций. Они послужат отличным шаблоном для дальнейшей настройки:
sudo make samples
Наконец, создайте скрипты инициализации, чтобы Asterisk автоматически запускался при перезагрузке сервера:
sudo make config
sudo ldconfig
Запустите службу Asterisk и проверьте ее статус:
sudo systemctl start asterisk
sudo systemctl enable asterisk
sudo systemctl status asterisk
Если в выводе последней команды вы видите зеленую надпись active (running), значит, ядро вашей будущей IP-АТС успешно установлено и работает.