Протокол Secure Reliable Transport (SRT)

Протокол Secure Reliable Transport (SRT) — это открытый протокол передачи видео, использующий транспортный протокол UDP. Спецификация протокола SRT доступна как Internet Draft в IETF[1].

Обзор

SRT обеспечивает соединение и управление, надёжную передачу, аналогичную TCP; однако реализует это на прикладном уровне, используя протокол UDP как транспортный уровень. Он поддерживает восстановление пакетов при сохранении низкой задержки (по умолчанию: 120 мс). SRT также поддерживает шифрование с использованием AES.

Протокол был создан на основе проекта UDT[2], который был разработан для быстрой передачи файлов. Он обеспечивал механизм надёжности, используя схожие методы для соединения, номеров последовательности, подтверждений и повторной передачи потерянных пакетов. Используется выборочная и немедленная (NAK-основная) повторная передача.

SRT добавил несколько функций для поддержки режима потоковой передачи в реальном времени:

  1. Управляемая задержка с передачей времени источника (доставка пакетов на основе временных меток)
  2. Ослабленный контроль скорости отправителя
  3. Условное отбрасывание пакетов «слишком поздно» (предотвращает head-of-line blocking, вызванную потерянным пакетом, который не был восстановлен вовремя)
  4. Оперативная повторная передача пакетов (периодический NAK-отчёт)

Заголовок пакета

Пакеты SRT создаются на прикладном уровне и передаются транспортному уровню для доставки. Каждый блок медиа- или управляющих данных SRT, созданный приложением, начинается с заголовка пакета SRT[1].

Заголовок пакета SRT
Смещения Октет 0 1 2 3
Октет Бит[a] 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
0 0 F Значение поля зависит от типа пакета
4 32 Значение поля зависит от типа пакета
8 64 Временная метка
12 96 ID сокета назначения

Данные (Data packet)

Заголовок пакета данных SRT
Смещения Октет 0 1 2 3
Октет Бит[a] 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
0 0 0 Номер последовательности пакета
4 32 PP O KK R Номер сообщения
8 64 Временная метка
12 96 ID сокета назначения

Поля заголовка:

  • Номер последовательности пакета (31 бит)
  • PP (2 бита): флаг позиции пакета
  • O (1 бит): флаг порядка
  • KK (2 бита): флаг шифрования на основе ключа
  • R (1 бит): флаг повторной передачи пакета
  • Номер сообщения (26 бит)
  • Данные (переменная длина)

Управляющий пакет (Control packet)

Заголовок управляющего пакета SRT
Смещения Октет 0 1 2 3
Октет Бит[a] 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
0 0 1 Тип управления Подтип
4 32 Информация, специфичная для типа
8 64 Временная метка
12 96 ID сокета назначения

Поля заголовка:

  • Тип управления (15 бит): тип управляющего пакета
  • Подтип (16 бит)
  • Информация, специфичная для типа (32 бита)
  • Поле управляющей информации (переменная длина)

История

Secure Reliable Transport — это открытый протокол передачи видео, изначально разработанный компанией Haivision. По данным SRT Alliance, организации, продвигающей технологию, он оптимизирует производительность потоковой передачи. Это помогает минимизировать влияние джиттера и изменений пропускной способности, а механизмы коррекции ошибок способствуют минимизации потерь пакетов. SRT поддерживает сквозное шифрование с использованием AES[3]. При выполнении повторных передач SRT пытается повторно передавать пакеты только в течение ограниченного времени, определяемого задержкой, установленной приложением[4].

По словам Марка Цимонтковски, архитектора SRT, помимо передачи MPEG транспортных потоков через общедоступный интернет, протокол также используется для IoT-соединений, обмена метаданными, в качестве коммуникационного протокола, а также для передачи несжатых данных[5].

Референсная реализация протокола изначально была опубликована под лицензией Lesser General Public License версии 2.1[6], но затем была переведена на Mozilla Public License 22 марта 2018 года[7].

SRT поддерживается в свободных мультимедийных фреймворках GStreamer, FFmpeg, OBS Studio и в медиаплеере VLC[4][8].

Проект UDP-based Data Transfer Protocol (UDT) стал основой для проекта SRT[9]. C API SRT во многом основан по дизайну на API UDT[10]

SRT был разработан для передачи видео с низкой задержкой в реальном времени[9][3].

Компания Haivision выпустила протокол SRT и референсную реализацию как открытое программное обеспечение на выставке NAB Show в 2017 году[9].

В марте 2020 года индивидуальный Internet-Draft, draft-sharabayko-mops-srt[1], был представлен на рассмотрение рабочей группе Media OPerationS (MOPS) Internet Engineering Task Force.

Альянс SRT

SRT Alliance — это организация, члены которой разрабатывают, используют и продвигают протокол Secure Reliable Transport и программное обеспечение на его основе. Основателями альянса являются компании Haivision и Wowza Streaming Engine[11].

Реализации

Существует две доступные реализации: открытая библиотека SRT от Haivision, написанная на C, и GoSRT — версия, написанная на чистом Go[12].

Библиотека Haivision на C

API на языке C в основном основан на предыдущем API UDT, с последующими изменениями по мере добавления новых функций. API очень похож на API TCP.

SRT предлагает три рабочих режима, из которых первые два были заимствованы из UDT:

  • Режим потоковой передачи файлов: как TCP
  • Режим передачи сообщений файла: аналогично протоколу SCTP — отправка блоков данных с чётко определёнными границами
  • Режим реального времени: данные должны передаваться небольшими пакетами (обычно до 1316 байт, если передаваемый поток — MPEG-TS) с уже соответствующими временными интервалами между ними. Те же отдельные пакеты с теми же временными интервалами затем доставляются на стороне получателя.

Библиотека SRT также предлагает следующие возможности:

  1. Шифрование с использованием заранее согласованного ключа. Поддержка шифрования изначально обеспечивалась OpenSSL, теперь также могут использоваться Nettle (GNU TLS) или mbedTLS.
  2. SRT Access Control (также «StreamID») может использоваться приложениями для идентификации ресурсов и применения метода доступа по имени пользователя и паролю при использовании одного и того же сервисного порта для нескольких целей[13].
  3. Опциональный механизм Forward Error Correction.

Более подробная документация доступна в документации исходного кода.

Примечания

  1. 1 2 3 Биты упорядочены от наиболее значимого к наименее значимому; смещение бита 0 — это наиболее значимый бит первого октета. Октеты передаются в сетевом порядке. Порядок передачи бит зависит от среды.
  1. 1 2 3 Sharabayko, M.P & Sharabayko, M.A (2021), The SRT Protocol, IETF, I-D draft-sharabayko-srt-01, <https://datatracker.ietf.org/doc/html/draft-sharabayko-srt-01>. Проверено 20 октября 2023. 
  2. UDT: Breaking the Data Transfer Bottleneck. udt.sourceforge.io. Дата обращения: 27 августа 2020.
  3. 1 2 Haivision. Secure, Reliable, Transport. GitHub (26 сентября 2021).
  4. 1 2 Olivier Crête. SRT in GStreamer (16 февраля 2018).
  5. It glues everything together: an interview with Marc Cymontkowski, evangelist of SRT (5 ноября 2019).
  6. Michael Larabel. SRT Video Transport Protocol Open-Sourced. Phoronix (24 апреля 2017).
  7. Roman rndi. Change License to MPLv2.0 · Haivision/srt@a75d4c4. GitHub (22 марта 2018).
  8. Olivier Crête. Secure Video Comes of Age (June 2018).
  9. 1 2 3 Marc Cymontkowski. "Why We Created SRT and the Difference Between SRT and UDT".
  10. "Haivision srt API docs"
  11. Microsoft Joins SRT Open Source Streaming Project (17 сентября 2018).
  12. datarhei. Implementation of the SRT protocol in pure Go. GitHub (25 февраля 2025).
  13. SRT Access Control Guidelines. GitHub (7 ноября 2019).

Ссылки