Мультикаст

Мультикаст — это трафик, который может передаваться одновременно нескольким хостам в сети. Адрес назначения в этом случае представляет собой некий IP-адрес в диапазоне 224.0.0.0-239.255.255.255, называемый мультикаст-группой. Данный трафик распространяется в пределах сегмента сети как броадкаст с единственным отличием — будет ли компьютер принимать этот трафик зависит от того, подключен ли он к соответствующей мультикаст-группе. Все манипуляции с группами (вхождение в группу, выход из неё, запрос хостов с заданной группой и т.д.) осуществляется с помощью протокола IGMP. IGMP-пакеты по умолчанию имеют TTL=1, т.е. могут распространяться только в рамках одного сегмента сети. Сам мультикаст трафик это в основном UDP-пакеты с IP-адресом назначения из подсети 244.0.0.0/4.

TV-вещание представляет собой UDP мультикаст поток, номер канала — это определенная мультикаст группа, в qwerty — 239.255.2.1, 239.255.2.2 и т.д, порт 1234.

Когда Вы запускаете плеер на нужном канале, например, на первом альтернативном udp://@239.255.2.14:1234, компьютер подключается к мультикаст группе 239.255.2.14, посылая специальный IGMP-пакет IGMP REPORT с номером группы, ждёт поступления UDP трафика на порт 1234 и начинает воспроизводить этот видеопоток. Пока компьютер подключен к группе, он должен периодически напоминать о себе, посылая повторные пакеты IGMP REPORT и отвечать на запросы IGMP QUERY. Когда Вы выключаете плеер, компьютер выходит из мультикаст группы, посылая пакет IGMP LEAVE.

Задача маршрутизатора — не только переправлять UDP поток с одного интерфейса на другой, но и обрабатывать IGMP пакеты. Как правильно их обрабатывать, можно почитать в IGMP RFC или еще где в инете. Основная обработка заключается в следующем:
1. Роутер должен обрабатывать сообщения о принадлежности к группе (IGMP REPORT) от локальных хостов и подключаться в случае необходимости к соответствующей мультикаст группе на внешнем интерфейсе
2. Периодически опрашивать локальную сеть с помощью IGMP QUERY
3. Обрабатывать выход из группы IGMP LEAVE и в случае необходимости отключаться от группы на внешнем интерфейсе
4. Совершать дополнительные действия согласно IGMP RFC

Таким образом, роутер должен запоминать, к каким группам подключены локальные хосты и поддерживать принадлежность к этим группам на внешнем интерфейсе. С помощью этого мы добьёмся того, что от qwerty будет поступать UDP мультикаст поток на маршрутизатор. Остаётся только его перенаправить на внутренний интерфейс. Для этого существует встроенный в ядро multicast routing. Как сделать демона, описано в предыдущем моём посте.