Найти тему
Олег Тимашевский

Asterisk PBX. Протокол IAX

Оглавление

..

В одной из предыдущих публикаций, в частности в этой Asterisk PBX. Внутренняя связь с затратами в 0 рублей, я озвучивал как организовать внутреннюю связь за 0 рублей. Мною было озвучено что для этого нужно подключить IP телефон по протоколу SIP к Asterisk PBX. Если ради любопытства зайти в настройки IP телефона, настольного или программного, то часто можно увидеть раздел подключение по IAX.

..

ОБЗОР

..

Что это за IAX такой? В переводе на русский это означает протокол связи между Asterisk PBX, в IP сетях естественно. Он был разработан Марком Спенсером, создателем Asterisk PBX, специально для связи между серверами Asterisk PBX. Но как оказалось он отлично подходит и для подключения IP телефонов к АТС Asterisk PBX и к другим.

Чем он принципиально отличается от SIP? Концепция протокола SIP идёт от HTTP, это долгоиграющий протокол, он будет вечен как HTTP, наверно до конца времён, пока не настанет конец света, без шуток. В общем SIP вырос из HTTP, а IAX? Он основан на сигнализации в сетях ISDN. Я считаю что Марк Спенсер позаимствовал сигнализацию ISDN и на её основе создал протокол IAX и зарегистрировал его в треке стандартов интернета. Что это значит? То что производители оборудования должны руководствоваться этим стантартом и должны заложить реализацию этого протокола в своё оборудование, в настольные IP телефоны или в программные софтфоны.

Чем IAX отличается от SIP? IAX намного проще и компактнее, но и функционал его ограничен. Как бы это принято говорит, палка о двух концах. Несмотря на то что Марк Спенсер, основатель IAX, придумал свой URL в IAX'е, этот URL никто не использует, он только для галочки. А вот URL в SIP'е очень мощный, нереально просто.

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

..

СТРУКТУРА

..

В отличие от текстового SIP'а IAX это бинарный протокол и вся сигнальная информация передаётся в бинарном виде. Плюс вся сигнальная информация и медиа (т.е. голос) передаются в фреймах, т.е. по русски в кадрах. В основе протокола лежат Full-фреймы, для передачи сигнальной информации, и Mini-фреймы, для передачи медиа нагрузки.

На изображении выше представлена структура этих фреймов.

Full-фреймы состоят из заголовка и информационных элементов (IE), в которых содержатся все необходимые данные. Например, вызывающий номер, вызываемый номер, имя пользователя для авторизации и поддерживаемые аудио кодеки. Некоторые IE обязательные другие опциональные, например, без указания вызываемого номера не обойтись.

Mini-фреймы также состоят из заголовка, но сокращённого, и медиа данных, т.е. из полезной нагрузки. Размер медиа данных не указывается, а ограничивается размеров IP пакетов, передача двух Full-/Mini-фреймов в одном IP пакете не допускается.

Ниже на изображении представлены полные заголовки этих двух видов фреймов, схемы взяты из стандарта IAX.

-2

Фреймы, относящиеся к разным вызовам, т.к. к телефонным звонкам, разделяются по меткам вызовов. Также в рамках одного вызова у Full-фреймов есть нумерация, т.е. порядковые номера.

..

СИГНАЛИЗАЦИЯ

..

Full-фреймы бывают разных видов, например, есть "NEW", который запрашивает соединение, т.е. новый вызов, "AUTHREQ" запрашивает пройти авторизацию, "ACCEPT" принимает вызов в ответ на "NEW", а "HANGUP" завершает вызов.

Приведу схему установления вызова с запросом авторизации, изображение ниже.

-3

Здесь Asterisk PBX отправляет сообщение "NEW" (Full-фрейм) на телефон пользователя с тем чтобы начать вызов. Телефон запрашивает пройти авторизацию сообщением "AUTHREQ", в котором указывается имя пользователя. Asterisk PBX использует пароль для этого пользователя и отправляет ответ на авторизацию "AUTHREP". IP телефон проверяет авторизацию и в случае успеха принимает вызов отправкой сообщения "ACCEPT". В этот момент устанавливается виртуальный вызывной линк.

На изображении не указано, но после создания линка после подачи вызывного сигнала на телефон к Asterisk PBX отправляется сообщение "Ringing", а по ответу "Asnwer".

Далее после ответа начинается фаза передачи Mini-фреймов с сжатым голосом абонентов.

Для завершения соединения одна из сторон отправляет сообщение "HANGUP", вторая сторона подтверждает разъединение квитанцией "ACK".

..

НАСТРОЙКА

..

Как уже написал, у IAX концепция проще и настраивать его проще. Здесь все соответствия и авторизация выполняются только по имени пользователя, у пользователя есть пароль естественно.

Рассмотрим простую конфигурацию двух пользователей IAX и соответственно двух каналов "11" и "12".

-4

Текст конфигурации следующий.

[11]
type=friend
username=11
secret=190123fx

context=loc
disallow=all
allow=alaw,ulaw

[12]
type=friend
username=12
secret=12123hl

context=loc
disallow=all
allow=alaw,ulaw

Конфигурация каждого пользователя идентична и состоит из 6ти строчек. Здесь "type=friend" означает что пользователь может как принимать вызовы так и совершать их. Для всех внутренних пользователей всегда ставим тип пользователя "type=friend".

Вторая строчка "username=11" это имя пользователя, третья "secret=190123fx" содержит пароль после знака равенства. Когда совершается входящий вызов с телефона пользователя на Asteisk PBX (или с другого сервера Asterisk PBX, не принципиально), то сервер Asterisk PBX в своей конфигурации ищет пользователя с указанным именем, авторизует его по указанному паролю и при успешной авторизации направляет вызов в диалплан в контекст "loc", это я указал в следующей строчке "context=loc"

В последних двух строчках я указал что для компрессии голоса будем использовать аудио кодеки "alaw" и "ulaw". В ITU-T это кодек G.711 с a-законом и u-законом сответственно. Голос можно передавать вообще без компрессии и такая возможность в Asterisk PBX есть, но не все телефоны это поддерживают.

Чтобы можно было позвонить внутренние номера "11" и "12" и на соответствующих пользователей в диалплан "extensions.conf" я для простоты добавил всего две строчки.

e
e

Вот они.

exten => _1X,1,Dial(IAX2/${EXTEN},60,tTL(3600000))
exten => _1X,n,Hangup()

Если набрать внутренний номер "11", то ч\з приложение "Dial" Asterisk PBX ищет такого пользователя в своей конфигурации и направляет вызов на телефон, который был зарегистрирован под пользователем "11", звенит телефон.

Телефон может также запросить авторизацию входящего вызова у Asteisk PBX чтобы удостовериться что это именно он (по тому же самому имени пользователя и паролю), а может выполнить сверку только по адресу Asterisk PBX, на котором он был зарегистрирован.

..

ИТОГИ

..

IAX проще и быстрее, плюс он заточен для голосовой связи. IAX также подойдёт для сетей с узкой полосой пропускания и для каких-либо проблемных и экзотических. Если что не получается по SIP'у, например, пройти многократный NAT, то используйте IAX.

Про минусы. Между двумя узлами, например, между двумя Asterisk PBX, более одного видевызова сделать невозможно, возможно через какие-либо костыли или расширения IAX'а это можно сделать, но не с ходу. В SIP'е каких-либо ограничений нет. Между двумя узлами Asterisk PBX нельзя создать более 32767 одновременных вызовов. В SIP'е ограничений в этом плане нет. В IAX поддерживается ограниченный набор аудио и видео кодеков со стандартными параметрами, в SIP'е ограничений нет. Но никто не мешает Марку Спенсеру выпустить дополнение к IAX или его расширение с тем чтобы обойти это ограничение.

SIP намного круче и мощнее. Чтобы я выбрал? IAX или SIP? Мой выбор SIP.

..

@ Ярошенко О. Ю. 2024