Основным механизмом доставки телевизионных программ до абонентов в локальных сетях является вещание в виде широковещательных IP-пакетов (иногда такой поток называют «мультикаст» от английского «multicast»). Особенностью данной технологии является то, что все мультимедийные потоки всегда направляются в сеть, вне зависимости от количества активных подписчиков в настоящий момент времени. Например, для передачи 20 телевизионных каналов со средним битрейтом 4 Мбит/сек на канал потребует порядка 4*20 = 80 Мбит/сек пропускной способности. Эти 80 Мбит/сек будут направляться в сеть, даже если ни один абонент в данный момент не подключен к сети, а также в случае, если количество активных абонентов гораздо более 1000.
Вещание мультимедийного контента в локальную сеть в виде широковещательных пакетов сопряжено с необходимостью четко контролировать какие пакеты и к какому получателю должны доставляться. Необходимо избегать ситуации, когда все пакеты доставляются всем абонентам. В этом случае абонентские устройства будут тратить ресурсы на обработку «непрошенных» пакетов и в итоге не смогут выполнять свои функции. Абоненту необходимо доставлять пакеты только того потока, который он запросил. Для этого абонентское оборудование сообщает о желании вступить в определенную группу по протоколу IGMP. Далее этот запрос регистрируется на маршрутизаторе, в терминах IGMP это устройство называется «Querier». После успешной регистрации, Ethernet коммутатор приступает к копированию широковещательных пакетов, предназначенных для данной группы, в порт, к которому подключен абонент.
Благодаря протоколу IGMP, Ethernet-коммутаторы могут определить какие широковещательные пакеты копировать в абонентский порт, а какие нет.
В настоящей статье описывается настройка протокола IGMP для просмотра пакета IPTV через шлюз под управлением CentOS.
На шлюзе две сетевые карты.
eth0 - провайдер. eth1 - локальная сеть. ppp0 - интернет, привязан на eth0. |
Для начала прописываем правила в iptables. В файл /etc/sysconfig/iptables, добавляем:
секция *filter: -A FORWARD -p igmp -i eth0 -o eth2 -j ACCEPT -A INPUT -d 224.0.0.0/4 -j ACCEPT -A FORWARD -d 224.0.0.0/4 -j ACCEPT секция *mangle: -A PREROUTING -d 224.0.0.0/240.0.0.0 -p udp -j TTL --ttl-inc 1 |
Выполняем:
modprobe ipt_TTL service iptables reload service iptables restart route add -net 224.0.0.0/4 dev eth0 route add -net 224.0.0.0/4 dev eth2 |
Добавляем в файл /etc/rc.d/rc.local:
route add -net 224.0.0.0/4 dev eth0 route add -net 224.0.0.0/4 dev eth2 |
Теперь необходимо установить утилиту igmpproxy, которая и будет транслировать IPTV в локальную сеть.
Её можно собрать из исходников производителя, либо скачать собранный пакет.
wget http://centos.alt.ru/pub/repository/centos/6/x86_64/igmpproxy-0.1-1.el6.x86_64.rpm rpm -i igmpproxy-0.1-1.el6.x86_64.rpm |
или же подключить репозитарий CentALT
rpm -ivh http://centos.alt.ru/repository/centos/6/x86_64/centalt-release-6-1.noarch.rpm |
и установить
yum install igmpproxy |
Запускаем в режиме дебага:
/usr/sbin/igmpproxy -vd /etc/igmpproxy.conf |
Находим примерную строку:
The source address 172.18.3.1 for group 224.0.42.1, is not in any valid net for upstream VIF |
По ней определяем, что поток идет с IP 172.18.3.1
Открываем конфиг /etc/igmpproxy.conf:
в секцию phyint eth0 upstream ratelimit 0 threshold 1 добавляем подсеть транслятор:
altnet 172.18.3.1 |
в секцию phyint eth2 downstream ratelimit 0 threshold 1 можно ничего не добавлять, это локальная сеть.
Конфиг будет иметь вид:
##------------------------------------------------------ ## Enable Quickleave mode (Sends Leave instantly) ##------------------------------------------------------ quickleave ##------------------------------------------------------ ## Configuration for eth0 (Upstream Interface) ##------------------------------------------------------ phyint eth0 upstream ratelimit 0 threshold 1 altnet 172.18.3.1 ##------------------------------------------------------ ## Configuration for eth1 (Downstream Interface) ##------------------------------------------------------ phyint eth1 downstream ratelimit 0 threshold 1 ##------------------------------------------------------ ## Configuration for eth2 (Disabled Interface) ##------------------------------------------------------ phyint ppp0 disabled |
Теперь можно смотреть IPTV, запускаем:
/usr/sbin/igmpproxy /etc/igmpproxy.conf& |
Для автозапуска добавляем строку в файл /etc/rc.d/rc.local:
/usr/sbin/igmpproxy /etc/igmpproxy.conf& |
Проверено и работает: IpTvPlayer, провайдер ISTV.