|SRT协议在电视直播中的应用( 三 )


2.4 ARQ机制原理

|SRT协议在电视直播中的应用
本文插图

这是关于一个自动重发请求的简图 。 数据包如果被正确接收 , 会返回一个肯定应答ACK给发送端 , 如果没有被正确接收 , 会返回一个否定应答NAK , 发送端接收到NAK后会重发相应数据包 。
值得注意的一点是有的传输协议虽然也是使用ARQ机制 , 但是它可能只使用ACK或者NAK , 而SRT既是用ACK也使用NAK 。
2.5 ARQ和FEC的对比

|SRT协议在电视直播中的应用
本文插图

上图是ARQ机制和FEC机制的对比 。
l假设发生了数据包丢失 , 我们不做纠错和控制 , 那丢包就是无法挽回的了 。
l但如果使用FEC机制 , 那么接收端就会通过一定的算法来恢复 , 当然FEC对于丢包的恢复有一定的上限 , 并且占用一定的额外带宽 。
l如果是ARQ机制 , 就会返回一个重发请求 , 发送端接收到请求之后便会重发该数据包 。
2.6 SRT协议流程图

|SRT协议在电视直播中的应用
本文插图

经常使用SRT的朋友一定对SRT中常用的“呼叫监听”模式很熟悉 。 一方是呼叫方(Caller) , 另一方是监听方(Listener) , 双方在连接成功之后 , 这两个角色便失效了 , 双方又恢复到发送端和接收端的角色 。
如图所示 , SRT在第一次握手往返时只是简单地交换一下cookie 。 第二个往返就会交换很多参数 , 比如版本、加密方式、双向延时量、StreamID等参数 。 开始传输之后 , 数据包首部就带有时间戳 , 另外还会交换很多控制数据 , 例如ACK、NCK、ACKACK(针对肯定应答的肯定应答)、Keepalive , Shutdown 。
通过这个简略的流程图 , 我们可以知道SRT是如何工作的 , 另外我们也可以看到数据包结构的雏形 , 首先它有一个传输有效数据的信息数据包 , 当然还有控制数据包 , 例如握手、ACK、NAK、ACKACK、Keepalive和Shutdown包 。
2.7 SRT协议数据包

|SRT协议在电视直播中的应用
本文插图

SRT中有四个比较重要的数据包类型 , 咱们从数据包结构来学习SRT协议有助于在实际工作中检测链路状态 , 或者是进行故障排除 。
2.7.1 SRT协议数据包结构

|SRT协议在电视直播中的应用
本文插图

首先SRT的首部是紧跟在UDP首部之后的 , SRT首部第一个标志位为0代表该数据包是信息数据包 。
数据包序列号字段:每发送一个数据包 , 数据包序列号的字段便会加1 。 序列号起始数值是随机生成 , 并不是从零开始计数 。
报文序号字段:从零开始独立计数 , 在Live模式中用处不大 。 前面的四个标志位分别有其含义 , 具体如图所示 。
时间戳字段:以连接建立时间(StartTime)为基准的相对时间戳(精确到微秒) 。
2.7.2 握手包

|SRT协议在电视直播中的应用
本文插图

上图简略展示了SRT握手包的结构 , 它省略了加密扩展模块和配置扩展模块 。
第一行标志位为1表示控制数据包 , 控制类型为0表示握手包 。
版本字段:SRT的握手分为两个版本:HSv4和HSv5 。 SRT1.3版本之后都是HSv5 , 之前都是HSv4 , 并且HSv5向前兼容HSv4 。
加密标志位EncrFld:表示了加密的类型 。
扩展标志位ExtFld:表示了有哪些扩展模块 。
数据包序列号初始值字段:该初始值是随机生成的 , 这样握手的时候 , 双方就知道从哪里开始计数 。


推荐阅读