Протокол Secure Reliable Transport (SRT)
Обзор
SRT обеспечивает соединение и управление, надёжную передачу, аналогичную TCP; однако реализует это на прикладном уровне, используя протокол UDP как транспортный уровень. Он поддерживает восстановление пакетов при сохранении низкой задержки (по умолчанию: 120 мс). SRT также поддерживает шифрование с использованием AES.
Протокол был создан на основе проекта UDT[2], который был разработан для быстрой передачи файлов. Он обеспечивал механизм надёжности, используя схожие методы для соединения, номеров последовательности, подтверждений и повторной передачи потерянных пакетов. Используется выборочная и немедленная (NAK-основная) повторная передача.
SRT добавил несколько функций для поддержки режима потоковой передачи в реальном времени:
- Управляемая задержка с передачей времени источника (доставка пакетов на основе временных меток)
- Ослабленный контроль скорости отправителя
- Условное отбрасывание пакетов «слишком поздно» (предотвращает head-of-line blocking, вызванную потерянным пакетом, который не был восстановлен вовремя)
- Оперативная повторная передача пакетов (периодический NAK-отчёт)
Заголовок пакета
Пакеты SRT создаются на прикладном уровне и передаются транспортному уровню для доставки. Каждый блок медиа- или управляющих данных SRT, созданный приложением, начинается с заголовка пакета SRT[1].
| Смещения | Октет | 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)
| Смещения | Октет | 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)
| Смещения | Октет | 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 также предлагает следующие возможности:
- Шифрование с использованием заранее согласованного ключа. Поддержка шифрования изначально обеспечивалась OpenSSL, теперь также могут использоваться Nettle (GNU TLS) или mbedTLS.
- SRT Access Control (также «StreamID») может использоваться приложениями для идентификации ресурсов и применения метода доступа по имени пользователя и паролю при использовании одного и того же сервисного порта для нескольких целей[13].
- Опциональный механизм Forward Error Correction.
Более подробная документация доступна в документации исходного кода.