Flash мультикаст. Начало.

Мультикаст — это одна из новых возможностей Flash Player 10.1, которая позволяет распределять потоки данных по p2p сети. Это могут быть потоки аудио, видео или просто данные(AMF3), например поток данных игры, где требуется реал-тайм рассылка изменений состояния. Для таких задач мультикаст подходит лучше чем простая публикация через Flash Media Server, который оптимизирован для работы приложений с большим количеством отправителей, например, где есть чат, изменение онлайн статуса и тд.

Различия между Юникастом и Мультикастом

Юникаст

Юникаст просто доставляет потоки с сервера на N клиентов. Для этих целей можно использовать Flash Media Server и TCP протоколы такие как RTMP/T/S/E или HTTP протокол. Для использование Юникаста требуется большое количество ресурсов: например, чтобы доставить поток в 1Мб/сек 1000 клиентам требуется исходящий канал с сервера в 1Гб/сек, мощный CPU и возможность пропускать огромное количество траффика.

Мулькаст на уровне приложения

Иногда Мультbкаст на уровне приложения называют оптимизированным распределением потока среди пиров. Это очень эффективный способ, потому что поток распределяется среди пиров посредством другого клиента или FMS (поддерживается в 4ой версии).

Нативный IP Мультикаст

Этот вариант мультикаста распределяется по сети не используя P2P соединения, а используя возможности сетевого роутинга. В основном это работает в сетях, которые поддерживают такую возможность: VPN, LAN, внутренние сети. Существует возможность комбинировать Нативный Мультикаст и Мультикаст Уровня Приложений, что называется Мультикаст Фьюжн(Multicast Fusion). Для использования этой возможности требуется FMS 4.

Мультикаст во Flash

Для примера создадим два приложения, одно будет Получателем а другое — Бродкастером. После того, как установили соединение со Stratus или FMS, нужно настроить NetStream таким же образом как и NetGroup(см. Simple Chat using NetGroup tutorial). Назовем, для примера, группу “myGroup/multicastOne, а поток — “multicast”.

Приложение бродкастер:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
private function setupStream():void{
        var groupspec:GroupSpecifier = new GroupSpecifier("myGroup/multicastOne");
        groupspec.serverChannelEnabled = true;
        groupspec.multicastEnabled = true;
 
        stream = new NetStream(nc, groupspec.groupspecWithAuthorizations());
        stream.addEventListener(NetStatusEvent.NET_STATUS,netStatus);
 
        var cam:Camera = Camera.getCamera();
        video.attachCamera(cam);
 
        stream.attachCamera(cam);
        stream.publish("multicast");                            
}

Приложение Получатель:

1
2
3
4
5
6
7
8
9
10
11
12
private function setupStream():void{
        var groupspec:GroupSpecifier = new GroupSpecifier("myGroup/multicastOne");
        groupspec.serverChannelEnabled = true;
        groupspec.multicastEnabled = true;
 
        stream = new NetStream(nc, groupspec.groupspecWithAuthorizations());
        stream.addEventListener(NetStatusEvent.NET_STATUS,netStatus);
 
        stream.play("multicast");
 
        video.attachNetStream(stream);
}

Распространение пакетов в Мультикаст режиме

Мультикаст во Flash оптимизирован, чтобы быть эффективным: он работает таким образом, чтобы не отдавать весь полученный поток(хотя конечно может это делать), а отдает только часть потока. Большенство нормальных DSL линий имеют 8Мбит/сек входящий канал и 1Мб/сек исходящий канал, таким образом позволяя получать 8Мбит/сек, но отдавать обратно только 1 1Мб/сек. Поэтому для Мультикаста нужно больше пиров и возможность комбинировать пакеты с этих пиров.

Мультикаст во Flash — это Pull/Push система. Pull гарантирует доставку данных пирам, а Push — оптимизирует таблицу контента (карта блоков), уменьшая задержки и создавая несколько структурных деревьев. Если бы была только часть Pull, то задержка онлайн потоков на самом далеком пире была бы слишком большая. Push решает эту проблему.

Pull

Pull работает по следующему алгоритму:

1.Как только начинается вещание потока, происходит рассылка карты блоков данных одному или всем соседним пирам
2.Соседний пир ждет небольшой промежуток времени, чтобы понять кто может предоставить каждый блок данных
3.Соседний пир выбирает источник, чтобы получить некоторые блоки данных, и шлет запрос пиру-источнику
4.Источник шлет запрошенные блоки данных пиру-соседу
5.Все передачи данных гарантированы только частично
6.В случае невыполнения запроса к источнику, пир будет запрашивать другие источники

Push

Алгоритм Push следующий:

1.Пир шлет карту блоков данных, которые у него есть, одному или всем соседним пирам
2.Соседний пир запоминает источники данных
3.Соседний пир выбирает исчтоник для каждой части данных, которые ему требуются
4.Потом шлет маску источнику, которая описывает требуемую последовательность данных
5.Меняет размер маски(каждый 3й, 5й и 6й)
6.Периодически опрашивает соседей на предмет меньшей задержки
7.Для каждой последовательности данных запоминает только самый быстрый источник
8.Данные отсылаются источником сразу
9.Для каждого среза данных существует лимит на количество операций push

Заключение

Для Мультикаста во Flash мы используем класс NetStream вместе с GroupSpecifier и NetConnection. Мультикаст — это самая сложная вещь во Flash P2Pи в тоже время самая интеллектуальная в плане оптимизированной доставки и распространении частей данных, и операций над сеткой(мешем) пиров. Существует 3 типа мультикаста: P2P, IP и Fusion(P2P+IP). Мультикаст доступен в Adobe Stratus и в новом релизе FMS 4.