Voice

Voice over Internet Protocol (VoIP) — сегодня это один из самых популярных стандартов для голосовых и видеозвонков в мире Интернет. В этой заметке я попробую на простых примерах рассказать, как работают голосовые и видеозвонок.

Почти каждый день мы с вами используем голосовые либо видеозвонка в различных приложениях, таких как Skype, Viber, Telegram, WhatsApp, Facebook Messenger или Webitel 🙂 В общем, передача аудио либо видео зависит от того, как приложение передаст медиапоток между двумя клиентами. И в большинстве случаем для потоковой передачи мультимедиа мы используем WebRTC.

WebRTC — это стандарт c открытым исходным кодом, который предоставляет браузеры и мобильные приложения возможности взаимодействовать в реальном времени (RTC) через простые API. Все компоненты WebRTC были оптимизированы именно для работы мультимедиа в различных сетях интернет.

Но наличие только WebRTC не достаточно. Наши клиенты могут находиться в разных сетях, требовать дополнительные функции и много других вещей, без которых только WebRTC недостаточно, а именно:

  • Сигнальный протокол
  • STUN
  • TURN

Что такое сигнализация?

Учитывая последние события, возникла необходимость обезопасить нашу внутреннюю связь. Для этих целей уже давно существует SIPS и SRTP. Давайте посмотрим, как это все работает.

Когда мы используем обычный SIP, то каждый звонок выглядит вот так:

SIP

Достаточно встать вразрез между нами и провайдером, и все звонки, как на ладони. Более того, перехватив RTP трафик, можно и разговоры подслушать.

Для IP-телефонии критичны задержки пакетов в сети, хотя технология обладает некоей толерантностью (устойчивостью) к потерям отдельных пакетов. Так, потеря до 5 % пакетов не приводит к ухудшению разборчивости речи. Максимальное отклонение между последовательной передачей пакетов в сети Интернет не должны превышать 50 мс. Максимальный процент потерь при передачи пакетов в сети Интернет – не более 3%.

Причины задержек в передаче голосовых данных по сети IP в большой степени связаны с особенностями транспорта пакетов. Протокол TCP обеспечивает контроль доставки пакетов, однако достаточно медленный и потому не используется для передачи голоса. UDP быстро отправляет пакеты, однако восстановление потерянных данных не гарантируется, что приводит к потерянным частям разговора при восстановлении (обратном преобразовании) звука. Немалые проблемы приносит джиттер (отклонения в периоде поступления-приёмки пакетов), появляющийся при передаче через большое число узлов в нагруженной IP-сети. Недостаточно высокая пропускная способность сети (например при одновременной нагрузке несколькими пользователями), серьёзно влияет не только на задержки (то есть рост джиттера), но и приводит к большим потерям пакетов.

Между конечными точками пользователей и серверами IP-телефонии, а также между серверами IP-телефонии и оборудованием оператора связи (поставщика VoIP) программных или аппаратных устройств, канал должен отвечать описанным выше требованиям.

Проверить пропускную способность каналов можно с помощью простой утилиты iperf-2.0.5. Предположим, что мы хотим гарантировать 10 одновременных разговоров с использованием G.711 кодека. Рекомендуемое требование к каналу составляет 1 Мбит/с.

На сервере запускаем iperf с параметрами (ожидать на стандартном порте 5001 входящие UDP запросы):
iperf -u -s

На клиенте запускаем тестирование UDP c длиной 160 байт со скоростью 1 Мбит/с в течение 180 секунд на сервер 10.10.10.119:
iperf -u -c 10.10.10.119 -l 160 -b 1M -t 180

Получаем результат:

Канал пригоден для 10 одновременных соединений.

Прочитал статью на habrahabr.ru и решил проверить у себя. Вот запись аудио: message.mp3, а вот что пришло на мыло:

добрый день александр трофименко игра 1000 для работы я не могу дойти до 120 инуяша телефону номер
для девчонок которая 3 3 3 он метро смоленская

Прочитав такое, я все равно буду слушать запись 🙂

Все знают о возможности «подслушивать» телефонные разговоры. А как Вам вариант слушать разговор в любимом медиаплеере, как обычное аудио вещание в сети? Оказывается, во FreeSWITCH это возможно! Все, что Вам нужно — включить модуль Mod_shout (о котором я уже писал). С модулем становиться доступная функция telecast . Через webAPI (по адресу http://<Ваш_Сервер>:8080/webapi/telecast/index) Вы сможете увидеть список текущих разговоров:

И открыть выбранный разговор в плеере:

Сегодня поговорим о безопасных разговорах 🙂 Вы конечно же поняли: шифрование в SIP. Хочу научить FreeSWITCH использовать TLS (вместо UDP) и шифровать голос по SRTP (с помощью ZRTP), в качестве клиента будет телефон Yealink.

Я искал модуль, который бы мог воспроизводить и записывать MP3 в FreeSWITCH и нашел. Но, как оказалось Mod_shout не только это умеет, а еще и воспроизводить потоковое вещание (Интернет-радио), которое можно подключить вместо Music On Hold. Вот простой пример диалплана:

<extension name="RadioRocks">
     <condition field="destination_number" expression="^0000$">
       <action application="answer"/>
       <action application="playback" data="shout://online-radioroks.tavrmedia.ua:7000/RadioROKS"/>
       <action application="hangup"/>
     </condition>
   </extension>

Послушать радио можно через эту кнопку »

Звонок с сайта«.

Стоит задача на Oktell IP PBX ограничить длительность внешних разговоров для всех сотрудников до 10 мин. Решил задачу так:

1. Создаем служебный сценарий который проверяет активность на каждой из внешних SIP-линий и если превышено 10 мин. — разрывает соединение:

2. Прописываем служебный сценарий на периодический запуск каждых 20 сек.

Задача решена 🙂