SRT协议学习

时间:2024-12-14 22:52:36

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数据包,其中包含了必要的头部信息和一些示例数据。在实际应用中,数据包可能包含更多的头部信息,如源地址、目的地址、扩展头部等,并且数据负载部分会根据实际传输的数据进行变化。