Pull to refresh

Обзор протокола RTMFP

Reading time 4 min
Views 14K

Доброго времени суток


Сегодня я расскажу о замечательном протоколе вещания RTMFP. В нём реализовано много интересных подходов и бытует очень много предрассудков относительно его возможностей. Хочу подогреть интерес к этой теме и развеять существующие иллюзии. Я не нашёл ничего лучше для вещания в реальном времени, и решил написать этот пост.

Предыстория


Давным-давно в далёкой галактике...
В 2004'ом жила-была Amicima, Inc. в которой были разработана GPL реализация протокола MFPMFPNet. Потом они выпустили amiciPhone — одного из конкурентов Skype, но из-за проблем позиционирования дела пошли не очень хорошо. В 2007'ом их приобрели Adobe так как им нужен был хороший протокол вещания реального времени.

А что не так с RTMP ?

RTMP не является протоколом вещания реального времени:
  • не решается проблема минимизации задержек;
  • вещание прекращается при смене адреса устройства;
  • TCP значительно увеличивает задержки и раздувает сообщения ненужными проверками доставки;
  • нет контроля размера окна.

Учитывая скорость развития мобильных сетей, покупка Amicima была довольно логичным и перспективным решением.

Предрассудки по поводу RTMFP

  1. Это проприетарный протокол

    Adobe решила его опубликовать в виде RFC7016 для того, чтобы подогреть внимание общественности, но как-то обошлось. Как ни странно, это не похоже на кривую спецификацию RTMP и больше напоминает MFP.

    Сам по себе протокол модульный: обмен сертификатами, шифрование, синхронизация потоков выполнены в виде отдельного профиля. То, что происходит в Flash'е, остаётся в Flash'e. Для разработчиков сторонних решений, типа Cumulus, Flash оставался чёрным ящиком; как-то тихо и незаметно в апреле 2014-го вышел Adobe's RTMFP Profile for Flash Communication.

  2. Это UDP — значит, нет гарантии доставки

    Достаточно много протоколов реального времени используют UDP, для гарантии доставки добавляют сетевую контрольную сумму и избирательные проверки доставки. Проверяют только то, что обязательно должно прийти, а не всё в подряд. Для аудио/видео контроль доставки пакетов не имеет большего смысла. Размер окна (MTU) обычно максимален и статичен, что повышает вероятность возникновения ситуации проигрывания пустоты с последующим приёмом неактуальных данных при потере пакета.

  3. RTMFP нам не нужен — у нас есть WebRTC

    WebRTC это не протокол, это браузерная технология — попытка интегрировать SIP с RTP стэком в браузер. Если скрестить в кучу RTP, SRTP, SCTP, RTCP, ZRTP, RTSP — получится RTMFP. Но в ряде случаев у подобных связок есть избыточность и проблемы с адресацией которых нет в RTMFP.

    У RTMFP есть и проброс через NAT, и контроль размера окна, и метаданные для потоков с контролем избыточности со стороны приложения, и forwarding/redirect сессий, и свой DHT.

    Сколько нужно инкапсулировать RTP-подобных протоколов, чтобы это всё реализовать?.. Думаю, где-то 4-5 штук.

    Текущая реализация протоколов вещания напоминает ситуацию:
    «Существует 6 протоколов, но у них всех есть фатальный недостаток, и мы разработаем ещё один...»
    Проходит год.
    «Существует 7 протоколов, и у них всех есть фатальный недостаток...»

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

RTMFP и модель OSI


Итак, давайте рассмотрим, какие уровни модели OSI покрывает RTMFP протокол.

  • Физический и канальный
    Эфемерных энергетических флуктуаций от порхающих бабочек тут нет, а так хотелось бы избыточности посредством передачи данных в подпространствах варпа.

  • Сетевой и транспортный
    Это IP и UDP multicast.
    Тут и Path MTU discovery и Congestion Control, уже в коробке, для каждого конкретного потока. Есть режим передачи данных с выборочной частотой проверкой доставки — проверяем раз в N пакетов. Все пакеты имеют временные метки для замера задержки при доставке. Встроенная кольцевая хэш-адресация конечных точек типа DHT.

  • Уровень представления
    Для Flash это, конечно же, AMF3 и инкапсулированный RTMP, но передавать можно любые другие данные.

  • Прикладной уровень
    Есть поддержка URI, сетевых групп и pub/sub по идентификаторам потоков. Подробнее можно почитать в документации API NetStream и NetGroup.

Безопасность в RTMFP


  • Классический обмен ключами по Диффи-Хелману c статическими и эфемерными ключами.
  • Cookies и сертификаты в сессиях, с возможностью цифровой подписи пакетов. Правда, по умолчанию неподписанные пакеты считаются валидными
  • Для шифрования используется AES128, но можно использовать любой другой блочный алгоритм.
  • HMAC-SHA256 или сетевые контрольные суммы.

Пользовательскую аутентификацию и авторизацию можно реализовать со стороны приложения. Вопрос фильтрации зловреда остаётся открытым.

Где функция-убийца ?


Я думаю, все помнят провал трансляции последней презентации нового поп-телефона IPhone 6 Plus?

Так вот представьте себе, что один клиент получает входящий поток и транслирует его ещё двум и больше (если возможно), и так — пока позволяет максимально возможная задержка. При этом в дереве клиентов происходят перестановки и сортировки в реальном времени с целью минимизации задержек и оптимизации окна пакета. В итоге можно добиться многократного уменьшения исходящего трафика сервера вещания.



И все его увидят…

Варианты использования


  1. Вещание контента в реальном времени
    Собственно, это предназначение самого протокола, и с этой задачей он справляется очень хорошо.
    Его можно использовать не только для передачи аудио/видео, но и как основной транспорт в Flash играх.

  2. CDN
    Это Р2Р и для загрузки файла нужно лишь знать его имя, хэш и размер.
    Можно реализовать http2rtmfp шлюз — возможности открываются довольно занимательные.

  3. Видео-конференции и чаты
    В пост-сноуденовскую эпоху RTMFP — доступный и защищённый Р2Р транспорт. Также основным преимуществом является возможность продолжить вещание при смене сетевого адреса устройства. WebRTC может отвалится при смене соты в 3G/4G. RTP стэк плохо подходит для вещания в подобной среде.

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


Как обстоят дела с существующими решениями на базе RTMFP?


Если кратко — дела обстоят очень плохо. На сегодняшний день из открытых реализаций есть разве что Cumulus. Развивается он очень вяло. Основан не на RFC, а на первых реверсах RTMFP Cirrus 1, так что совместимость с текущим Flash Profile Cirrus 2 довольно сомнительна. В нём реализована большая часть полезностей, в том числе организация избыточности в Р2Р и вещание между устройствами. Есть FMS, но он работает как FMS…

Буду рад конструктивным замечаниям.

В комментариях прошу указать аналоги RTMFP, если вам они известны.
Tags:
Hubs:
+16
Comments 31
Comments Comments 31

Articles