项目总览
Secure Reliable Transport(SRT)是一个开源传输协议项目,专注于超低延迟(亚秒级)的音视频流传输以及通用批量数据传输。该项目由 Haivision Systems Inc. 主导开发,以 Mozilla Public License v2.0 开源,代码托管于 GitHub,同时发布了 IETF Internet Draft 规范文档,并拥有持续增长的 SRT 联盟社区生态(README.md:24-26)。
SRT 协议名称本身即概括了其三大核心能力:Secure(安全加密)、Reliable(可靠恢复)、Transport(动态自适应传输)。该协议主要应用于视频流工作流的贡献和分发端点,确保在任何网络条件下都能以最低延迟交付最佳质量的视频内容(README.md:30-34)。
核心特性与技术优势
SRT 协议围绕低延迟流媒体传输场景,提供了一系列关键特性,使其在不可靠网络环境中仍能保持高质量的传输表现。
恒定端到端延迟与网络自适应
在直播流配置中,SRT 协议维持恒定的端到端延迟。这使得直播流的信号特征能够在接收端精确重建,从而减少缓冲需求。当数据包从源端传输到目的端时,SRT 检测并适应两端之间的实时网络状况,帮助补偿因拥塞网络上的噪声导致的抖动和带宽波动(README.md:36-37)。
AES 加密与错误恢复机制
SRT 实现了 AES 加密以保护媒体流的有效载荷,并提供多种错误恢复机制来最小化 Internet 连接中典型的丢包问题。其中,自动重传请求(ARQ)是主要方法——当接收方检测到丢包时,会向发送方发送警报请求重传丢失的数据包。此外,协议还支持前向纠错(FEC)和连接绑定功能,后者可提供无缝流保护和无中断故障切换(README.md:38)。
核心特性概览
| 特性 | 说明 |
|---|---|
| 高质量可靠性 | 无论网络多不可靠,都能从严重的丢包和抖动中恢复,确保视频流的完整性和质量(README.md:48-56) |
| 低延迟传输 | 流错误纠正可配置以适应用户部署条件,延迟显著低于 TCP/IP,同时提供 UDP 传输速度(README.md:58-66) |
| 内容格式无关 | SRT 在网络传输层运行,作为内容的包装器,可传输任何视频格式、编解码器、分辨率或帧率(README.md:68-76) |
| 防火墙穿透 | 握手过程支持出站连接,无需在防火墙中开放永久外部端口,维护企业 LAN 安全策略(README.md:78-86) |
| AES 加密 | 使用 128/192/256 位 AES 加密,确保内容从贡献到分发的端到端保护(README.md:88-95) |
技术架构与版本信息
核心实现架构
SRT 的核心实现基于 C/C++,以跨平台库的形式提供。核心头文件 srtcore/srt.h 定义了整个公共 API 的基础结构,包含平台系统头文件、字符串处理库以及日志 API 的引用(srtcore/srt.h:35-42)。
该头文件通过条件编译宏处理不同平台的导出符号:在 Windows 平台上使用 __declspec(dllexport) 或 __declspec(dllimport),在其他平台使用 __attribute__((visibility("default"))),确保库在动态链接和静态链接场景下均能正确导出符号(srtcore/srt.h:19-33)。
版本特性与编译支持
项目定义了版本特性宏 SRT_VERSION_FEAT_HSv5(值为 0x010300),用于特性测试,可与 SRTO_MINVERSION 选项配合使用。同时,通过 C++ 标准版本检测自动判断是否启用 C++17 支持(SRT_HAVE_CXX17),体现了项目对现代 C++ 标准的兼容性(srtcore/srt.h:52-60)。
技术栈概览
| 技术维度 | 详情 |
|---|---|
| 核心语言 | C/C++(支持 C++17) |
| 许可证 | Mozilla Public License v2.0(srtcore/srt.h:5-7) |
| 构建系统 | CMake |
| 支持平台 | Linux(Ubuntu/CentOS)、Windows、macOS、iOS、Android |
| 包管理器 | Ubuntu、Fedora、Debian、Homebrew、Vcpkg、ConanCenter(README.md:16-21) |
| 协议规范 | IETF Internet Draft |
系统架构与模块关系
以下架构图展示了 SRT 项目的核心模块层次与依赖关系:
正在加载图表渲染器...
架构图说明要点:
- 应用层:外部应用程序通过包含
srt.h头文件调用 SRT API,该头文件是整个公共接口的入口点(srtcore/srt.h:16-17)。 - 公共 API 层:
srt.h负责处理跨平台符号导出(SRT_API宏),并引入日志 API 接口供上层使用(srtcore/srt.h:19-42)。 - 核心协议层:传输引擎基于 UDP 构建,集成加密、错误恢复和拥塞控制三大子系统,分别对应 SRT 名称中的 Secure、Reliable、Transport 特性(README.md:30-34)。
- 平台抽象层:通过
platform_sys.h屏蔽不同操作系统的底层差异,version.h管理版本信息与特性宏定义(srtcore/srt.h:35-37)。 - 依赖方向:所有依赖严格自上而下,上层模块不直接依赖平台特定实现,保证了跨平台可移植性。
关键数据流与传输时序
以下时序图展示了 SRT 协议在典型直播场景中的核心数据流:
正在加载图表渲染器...
时序图说明要点:
- 加密流程:发送端应用提交媒体数据后,SRT 发送栈首先对载荷执行 AES 加密,然后通过 UDP 发送,确保端到端内容安全(README.md:38)。
- ARQ 重传机制:当接收栈检测到丢包时,发送 NAK(Negative Acknowledgment)请求重传,发送端响应并重传丢失数据包,这是 SRT 的主要错误恢复方法(README.md:38)。
- 恒定延迟保障:接收栈在解密后执行恒定延迟排序,确保端到端延迟保持稳定,从而重建发送端的信号特征(README.md:36-37)。
- 网络自适应:整个传输过程中,SRT 持续检测并适应两端之间的实时网络状况,动态调整以补偿抖动和带宽波动(README.md:36-37)。
文档体系与项目结构
文档组织架构
SRT 项目维护了一套完整的分层文档体系,涵盖 API 参考、构建指南、开发规范和特性说明四大类别(docs/README.md:1-35)。
API 文档层:包含 SRT C API 详细描述、API 函数参考、Socket 选项说明、拒绝码列表、统计信息使用指南以及缓冲区配置指南,为开发者提供完整的接口参考(docs/README.md:5-13)。
构建指南层:覆盖 CMake 构建系统配置说明,以及 Linux(Ubuntu/CentOS)、Windows、macOS、iOS、Android 五大平台的详细构建步骤,并汇总了支持 SRT 库的各包管理器信息(docs/README.md:15-26)。
开发文档层:提供开发者指南(开发环境设置、项目结构、编码规范、Issue 与 PR 提交流程)、底层技术信息(互斥锁机制)以及问题报告与调试日志收集指南(docs/README.md:28-35)。
核心目录结构
srt/
├── srtcore/ # 核心协议实现
│ ├── srt.h # 公共 API 头文件(入口点)
│ ├── version.h # 版本定义
│ └── logging_api.h # 日志 API 接口
├── docs/ # 文档体系
│ ├── API/ # API 参考文档
│ ├── build/ # 多平台构建指南
│ ├── dev/ # 开发者文档
│ └── features/ # 特性说明(FEC、Bonding 等)
├── CMakeLists.txt # CMake 构建配置
└── LICENSE # MPLv2.0 许可证
核心模块深度解析
模块一:公共 API 接口模块
职责边界:该模块负责定义 SRT 库的公共编程接口,处理跨平台符号导出,不涉及具体协议实现逻辑。
入口与关键 API:核心入口为 srtcore/srt.h 头文件,通过 SRT_API 宏控制函数符号的导出行为。在 Windows 动态链接场景下使用 __declspec(dllexport),静态链接时不添加额外修饰;非 Windows 平台使用 GCC/Clang 可见性属性(srtcore/srt.h:19-33)。
关键数据结构:模块定义了版本特性常量 SRT_VERSION_FEAT_HSv5(0x010300),用于握手协议 v5 特性检测;以及 SRT_HAVE_CXX17 编译期常量,标识当前编译环境是否支持 C++17 特性(srtcore/srt.h:54-60)。
错误处理与边界条件:通过条件编译宏 _WIN32、SRT_DYNAMIC、SRT_EXPORTS 的组合处理四种编译场景(Windows 动态导出、Windows 动态导入、Windows 静态、非 Windows),确保在任何编译配置下符号可见性正确(srtcore/srt.h:20-32)。
模块二:传输引擎模块
职责边界:基于 UDP 协议实现数据包的发送与接收,负责载荷加密、错误恢复和网络自适应,不负责上层媒体编解码。
关键调用链:发送路径为"应用提交数据 → AES 加密载荷 → UDP 发送";接收路径为"UDP 接收 → 丢包检测 → NAK 重传请求 → 恒定延迟排序 → AES 解密 → 交付应用"(README.md:36-38)。
关键数据结构:传输层处理的数据包包含加密后的载荷,接收端维护重排序缓冲区以实现恒定延迟输出。NAK 控制消息携带丢失数据包的序列号信息用于请求重传。
错误处理与边界条件:ARQ 作为主要错误恢复机制处理丢包,FEC 作为补充手段在丢包率较高时提供前向纠错能力。连接绑定功能在主链路故障时提供无中断故障切换(README.md:38)。
模块三:安全加密模块
职责边界:对媒体流载荷执行 AES 加密/解密,确保端到端内容安全,不负责连接认证和密钥协商的完整流程。
关键 API 与配置:支持 AES-128、AES-192、AES-256 三种密钥长度,通过 Socket 选项进行配置。加密作用于数据包载荷层面,协议头部信息保持明文以支持网络中间设备的正常处理(README.md:38)。
关键调用链:发送端在数据包提交到 UDP 层之前执行加密;接收端在重排序完成后、交付应用之前执行解密。加密与解密操作嵌入在传输引擎的发送/接收路径中。
模块四:平台抽象与版本管理模块
职责边界:屏蔽不同操作系统的底层差异,管理版本信息与特性标志,不包含业务逻辑。
入口与关键 API:通过 platform_sys.h 提供操作系统相关的类型定义和系统调用抽象;通过 version.h 管理版本号。srt.h 同时引入这两个头文件作为基础依赖(srtcore/srt.h:35-37)。
关键数据结构:SRT_VERSION_FEAT_HSv5 宏定义了握手协议 v5 的最小版本要求值 0x010300,可与 SRTO_MINVERSION Socket 选项配合使用,用于在运行时强制最低协议版本要求(srtcore/srt.h:54)。
错误处理与边界条件:C++ 标准版本检测通过 __cplusplus 预处理器宏判断是否大于 201406(C++17 标准值),自动设置 SRT_HAVE_CXX17 标志。对于旧版编译器(不支持 C++17),该标志设为 0,确保向后兼容(srtcore/srt.h:56-60)。
适用场景
SRT 协议的设计目标使其适用于以下典型场景:
- 直播贡献:从现场采集点到广播中心的低延迟视频传输,要求在不可靠网络(如公共 Internet)上保持高质量
- 内容分发:从广播中心到边缘节点的视频流分发,需要端到端加密保护内容安全
- 跨防火墙传输:企业网络间的视频流传输,利用 Rendezvous 模式避免开放永久外部端口
- 远程制作:需要亚秒级延迟的远程制作工作流,对抖动和带宽波动有容忍需求
- 通用数据传输:除音视频外,SRT 也支持通用批量数据的可靠传输(README.md:26)
报告阅读路线图
以下图表展示了本技术分析报告各章节的关系与推荐阅读顺序:
正在加载图表渲染器...
阅读路线说明:
- 项目总览(当前页面)提供全局视角,建议首先阅读以建立整体认知
- 核心特性详解 深入分析各特性的实现机制与配置选项
- 架构设计分析 剖析模块间依赖关系与设计决策
- 数据流与调用链 追踪关键路径上的函数调用与数据变换
- API 设计与接口规范 详细说明公共 API 的使用方法与参数语义
- 构建与部署指南 覆盖多平台构建、包管理器集成与生产部署注意事项
项目核心能力量化
| 量化指标 | 数值 |
|---|---|
| 支持加密密钥长度 | 3 种(AES-128/192/256) |
| 支持操作系统平台 | 5 个(Linux、Windows、macOS、iOS、Android)(docs/README.md:20-24) |
| 支持包管理器 | 6 个(Ubuntu、Fedora、Debian、Homebrew、Vcpkg、ConanCenter)(README.md:16-21) |
| 错误恢复机制 | 2 种主要(ARQ、FEC)+ 连接绑定故障切换(README.md:38) |
| API 文档类别 | 6 类(API 参考、函数参考、Socket 选项、拒绝码、统计信息、配置指南)(docs/README.md:5-13) |
| 开源许可证 | MPLv2.0(srtcore/srt.h:5-7) |
| 目标延迟 | 亚秒级(README.md:26) |
