Иван Санников
05.03.2020
1065

RTCP для автоматического контроля качества VoIP-соединений и уведомления о проблемах

В статье будет рассмотрен протокол RTCP (Real-Time Transport Control Protocol) — протокол управления передачей в реальном времени, который используется совместно с RTP, суть работы данного протокола в том что он периодически рассылает управляющие пакеты всем участникам вызова. Для начала необходимо внести рефренсные значения параметров, на которые можно опираться при анализе качества связи. Основной параметр — […]

В статье будет рассмотрен протокол RTCP (Real-Time Transport Control Protocol) — протокол управления передачей в реальном времени, который используется совместно с RTP, суть работы данного протокола в том что он периодически рассылает управляющие пакеты всем участникам вызова.

Для начала необходимо внести рефренсные значения параметров, на которые можно опираться при анализе качества связи.

Основной параметр — это потеря пакетов (Packet Lost): для приемлемого качества связи должно быть менее 1%, предпочтительно даже не превышать 0,5%,  при превышении порога в 3% заметно ухудшение связи, но еще не критично, при превышении 10% качество становится практически полностью неприемлемым.

Существует два варианта мониторить показатели RTCP:
1) прослушивая и собирая AMI события
2) при выполнении Hangup получать и анализировать показатели RTCP напрямую в диалплане

Следует учитывать что при втором способе будут получены усредненные показатели за весь разговор, а при подключении по AMI, можно получить информацию в динамике изменений показателей.

Далее будут рассмотрены оба варианта.

Прослушивание AMI событий.

В данном варианте интересны следующие события (AMI Events):

— RTCPSent — событие отправки RTCP
— RTCPReceived — событие получения RTCP

Для тестирования была создана учетка AMI в которой с помощью eventfilter были отфильтрован показ только событий связанных с RTCP

Для более детального ознакомления с AMI рекомендуем ознакомиться со статьей: https://voxlink.ru/kb/book/interfejs-upravlenija-asterisk-ami/

На скриншоте ниже представлен пример учетки AMI c фильтрацией событий.

пользователь AMI
пользователь AMI


Далее будет рассмотрены события RTCP, приходят они в виде как указано на скриншоте:

Общий вид RTCP события в AMI
Общий вид RTCP события в AMI

Для оповещений интересны следующие поля:
Channel: — отслеживаемый канал
SentPackets: — количество отправленных пакетов
Report0CumulativeLost: — количество пакетов потерянных с начала вызова

To: — адрес назначения
From: — адрес источника

RTT: — Round Trip Time — время приема передачи, время задержки передачи между двумя точками, состоит из времени, затраченного на отправку сигнала и времени получения подтверждения, значение RTT менее 200-250 мс указывает на нормальное качество связи.

Самая простая формула аппроксимированного вычисления процента потерь выглядит следующим образом Lost = Report0CumulativeLost * 100 / SentPackets, анализируя это значение, можно высылать уведомления при превышении определенного процента потерь на канале.

Второй способ более простой, он заключается в анализе определенных переменных получаемых с помощью функции CHANNEL, для их получения переменная вызывается в следующем виде:
${CHANNEL(ARG1,ARG2,ARG3)},

в большинстве случаев аргументы будут следующие: ARG1 — rtpqos. ARG2 — audio, ARG3 — интересующие параметры

Ниже показано как получить эти параметры:
RTT — ${CHANNEL(rtpqos,audio,rtt)} — круговая задержка
To: ${CHANNEL(rtpdest,audio)} — адрес назначения
From: ${CHANNEL(rtpsource,audio)} — адрес источника
Packets Sent: ${CHANNEL(rtpqos,audio,txcount)} — количество отправленных пакетов
Packets Received: ${CHANNEL(rtpqos,audio,rxcount)} — количество полученных пакетов
Local RX Packet Loss: ${CHANNEL(rtpqos,audio,rxploss)} — количество потерянных полученных пакетов
Local TX Packet Loss: ${CHANNEL(rtpqos,audio,txploss)} — количество потерянных отправленных пакетов

Исходя из этих значений также можно посчитать приблизительный процент потерянных пакетов:

TX_Loss=  txploss * 100 / txcount
RX_Loss = rxploss * 100 / rxcount

Эти данные лучше всего получать при выполнении завершения вызова (Hangup), для этих целей служит навешивание на канал hangup_handler`а. Подробнее об этом методе можно прочитать в статье: https://voxlink.ru/kb/asterisk-configuration/mehanizm-hangup-handler-v-asterisk/

Ниже приведен пример диалплана, выполняющего проверку параметров и отправку оповещения на email, для подключения hangup-handler`а на канал оператора связи, при вызове в транк выполняется вызов sub-set-handler, через опцию Dial`а U.

[outbound]
exten => _8XXXXXXXXXX,1,Noop()
same  => n,Dial(SIP/operator/${EXTEN},30,TtrU(sub-set-handler,s,1))
same  => n,Hangup()

[sub-set-handler]
exten => s,1,Set(CHANNEL(hangup_handler_push)=sub-rtcp-handler,s,1)
same  => n,Return()

[sub-rtcp-handler]
exten => s,1,NoOp(Start QoS ${CHANNEL(peername)})
same  => n,Set(TX_PLOS=${CHANNEL(rtpqos,audio,txploss)})
same  => n,Set(RX_PLOS=${CHANNEL(rtpqos,audio,rxploss)})
same  => n,Set(TX_COUNT=${CHANNEL(rtpqos,audio,txcount)})
same  => n,Set(RX_COUNT=${CHANNEL(rtpqos,audio,rxcount)})
same  => n,Set(TX_LOSS_PERC=$[${TX_PLOS}*100/${TX_COUNT}])
same  => n,Set(RX_LOSS_PERC=$[${RX_PLOS}*100/${RX_COUNT}])
same  => n,Noop(RX_LOSS_PERC: ${RX_LOSS_PERC}  TX_LOSS_PERC: ${TX_LOSS_PERC})
same  => n,ExecIf($[$["${RX_LOSS_PERC}" != "0" | "${TX_LOSS_PERC}" != "0"]]?System(/usr/local/bin/sendEmail.pl -f pbx1@company.ru -t info@company.ru -u "Packet Loss on trunk ${CHANNEL(peername)}" -m "RX Packet Loss ${RX_LOSS_PERC} TX Packet Loss ${TX_LOSS_PERC} on trunk ${CHANNEL(peername)}" -o message-charset=UTF-8))
same  => n,Return()

На скриншоте ниже показан лог вызова в котором были потери пакетов:

вызов с потерями пакетов
вызов с потерями пакетов
Подписаться
Уведомление о
guest
0 Комментарий
Inline Feedbacks
View all comments

Остались вопросы?

Я - Першин Артём, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.

VoIP оборудование

ближайшие курсы

ближайшие Вебинары

ONLINE

10 доводов в пользу Asterisk

Распространяется бесплатно.

Asterisk – программное обеспечение с открытым исходным кодом, распространяется по лицензии GPL. Следовательно, установив один раз Asterisk вам не придется дополнительно платить за новых абонентов, подключение новых транков, расширение функционала и прочие лицензии. Это приближает стоимость владения станцией к нулю.

Безопасен в использовании.

Любое программное обеспечение может стать объектом интереса злоумышленников, в том числе телефонная станция. Однако, сам Asterisk, а также операционная система, на которой он работает, дают множество инструментов защиты от любых атак. При грамотной настройке безопасности у злоумышленников нет никаких шансов попасть на станцию.

Надежен в эксплуатации.

Время работы серверов некоторых наших клиентов исчисляется годами. Это значит, что Asterisk работает несколько лет, ему не требуются никакие перезагрузки или принудительные отключения. А еще это говорит о том, что в районе отличная ситуация с электроэнергией, но это уже не заслуга Asterisk.

Гибкий в настройке.

Зачастую возможности Asterisk ограничивает только фантазия пользователя. Ни один конструктор шаблонов не сравнится с Asterisk по гибкости настройки. Это позволяет решать с помощью Asterisk любые бизнес задачи, даже те, в которых выбор в его пользу не кажется изначально очевидным.

Имеет огромный функционал.

Во многом именно Asterisk показал какой должна быть современная телефонная станция. За многие годы развития функциональность Asterisk расширилась, а все основные возможности по-прежнему доступны бесплатно сразу после установки.

Интегрируется с любыми системами.

То, что Asterisk не умеет сам, он позволяет реализовать за счет интеграции. Это могут быть интеграции с коммерческими телефонными станциями, CRM, ERP системами, биллингом, сервисами колл-трекинга, колл-бэка и модулями статистики и аналитики.

Позволяет телефонизировать офис за считанные часы.

В нашей практике были проекты, реализованные за один рабочий день. Это значит, что утром к нам обращался клиент, а уже через несколько часов он пользовался новой IP-АТС. Безусловно, такая скорость редкость, ведь АТС – инструмент зарабатывания денег для многих компаний и спешка во внедрении не уместна. Но в случае острой необходимости Asterisk готов к быстрому старту.

Отличная масштабируемость.

Очень утомительно постоянно возвращаться к одному и тому же вопросу. Такое часто бывает в случае некачественного исполнения работ или выбора заведомо неподходящего бизнес-решения. С Asterisk точно не будет такой проблемы! Телефонная станция, построенная на Asterisk может быть масштабируема до немыслимых размеров. Главное – правильно подобрать оборудование.

Повышает управляемость бизнеса.

Asterisk дает не просто набор полезных функций, он повышает управляемость организации, качества и комфортности управления, а также увеличивает прозрачность бизнеса для руководства. Достичь этого можно, например, за счет автоматизации отчетов, подключения бота в Telegram, санкционированного доступа к станции из любой точки мира.

Снижает расходы на связь.

Связь между внутренними абонентами IP-АТС бесплатна всегда, независимо от их географического расположения. Также к Asterisk можно подключить любых операторов телефонии, в том числе GSM сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.