SRT(Secure Reliable Transport)协议是一种开源的视频传输协议,旨在提供安全,可靠,低延迟的视频流传输。以下是SRT协议的一些关键的工作原理。
1 安全传输,SRT通过使用AES加密和数据完整性验证来确保数据的安全传输。它可以在不信任的网络环境中提供端到端的安全性。
2 可靠传输,SRT使用ARQ 技术来实现可靠传输。它通过在发送端和接受端之间进行反馈循环来检测和纠正数据包的丢失和损坏,从而确保数据的可靠传输。
3 低延迟:SRT通过使用最小的数据包大小和最少的协议开销来实现低延迟传输,通过优化数据包的大小和发送时间来降低传输延迟。
4 流控制:SRT提供了灵活的流控制机制,可以根据网络状况和带宽限制来动态调整传输速率,以确保最佳的传输性能。
5 带宽自适应: SRT支持带宽自适应功能,可以根据网络带宽的变化来自动调整传输参数,以最大程度的利用可用带宽。
6 跨平台支持: SRT可以在各种操作系统平台上运行
7 链接建立:发送端和接收端通过SRT握手协议建立连接。在握手过程中,交换协商参数,包括加密密钥,传输参数,缓冲区大小等。
8 数据传输:发送端讲视频流分成数据包,并加密,打包成SRT数据包发送到接收端。接收端收到数据包后,进行解密和解包,并通过ARQ技术检测和纠正丢失或损坏的数据包。
9 流控制:发送端根据的反馈信息来动态调整发送速率,确保流量控制和带宽自适应。
10 连接维护:发送端和接收端定期发送心跳包来维护连接,并根据需要进行连接重连。
SRT协议的数据包二进制格式主要分为两种类型:数据包Data Packet和控制包Control Packet 以下是SRT数据包的结构细节。
Data Packet数据包
数据包用于承载实际的媒体数据,其结构如下:
1 Packet Sequence Number 数据包序列号,占31位,用于确保数据包的顺序传输。
2 PP 数据包位置标识位;占2位,表示数据包在消息中的位置,10代表第一个数据包,00代表中间的数据包,01代表最后一个数据包,11代表单个数据包。
3 O(顺序标志位):占1位,用于标识数据包的顺序。
4 KK加密密钥标志位:占2位,表示使用的加密密钥,“00”代表不用加密,“01”代表偶数密钥,“10”代表奇数密钥。
Control Packet(控制包)
控制包用于协议控制,如握手、ACK/NAK等,其结构如下:
- PH_SEQNO(Packet Header Sequence Number,数据包序列号):用于确保数据包的顺序传输。
- PH_MSGNO(Packet Header Message Number,消息号):表示消息的编号,用于标识数据包属于哪个消息。
- PH_TIMESTAMP(Packet Header Timestamp,时间戳):用于记录数据包的发送时间,接收端可以利用这个时间戳来计算传输延迟。
- PH_ID(Packet Header ID,标识符):用于区分不同类型的包(如数据包、控制包等)。
控制数据包又包含了握手(Handshake)、肯定应答(ACK)、否定应答(NAK)、对肯定应答的应答(ACKACK),保持连接(Keepalive)、关闭连接(Shutdown)等多种类型。
SRT数据包的首部长度为16字节,最高位为标志位,0代表信息数据包,1代表控制数据包。
这些数据包结构的设计使得SRT协议能够有效地处理多媒体数据的实时传输,确保数据的顺序、完整性和安全性。
SRT 数据包结构示例
+-------+------+----------+----------+--------+--------+----------+
| Magic | Fam | SeqNo | MsgNo | TS/TSC | Flags | Payload |
+-------+------+----------+----------+--------+--------+----------+
- Magic(4字节):用于识别SRT协议的魔数(Magic Number),通常是 0x52 0x54 0x6F 0x73(即 "RTos")。
- Fam(1字节):Family字段,用于标识地址族,例如 0x01 表示IPv4。
- SeqNo(4字节):序列号,用于确保数据包的顺序性。
- MsgNo(4字节):消息编号,用于标识数据包属于哪个消息。
- TS/TSC(4字节):时间戳/时间戳和序列号,用于同步和延迟计算。
- Flags(2字节):标志位,包含多种控制位,如是否是最后一个数据包、是否加密等。
- Payload(可变长):实际传输的数据内容。
十六进制表示
52 54 6F 73 01 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 12 34 56 78 ... (Payload)
- 52 54 6F 73:Magic Number,用于识别SRT协议。
- 01:Family字段,表示IPv4。
- 00 00 00 01:SeqNo,序列号为1。
- 00 00 00 00:MsgNo,消息编号为0。
- 00 00 00 00:TS/TSC,时间戳或时间戳和序列号。
- 00 00:Flags,没有特殊标志。
- 12 34 56 78 ...:Payload,数据负载部分。
这个示例展示了一个包含Magic Number的SRT数据包,其中包含了必要的头部信息和一些示例数据。在实际应用中,数据包可能包含更多的头部信息,如源地址、目的地址、扩展头部等,并且数据负载部分会根据实际传输的数据进行变化。