srt协议

一.SRT协议概述

        SRT网络传输协议,全称是((Secure Reliable Transport)安全可靠传输协议。SRT协议是目前非常受欢迎的低延时音视频传输协议,它解决了复杂的传输时序,引入了丢包重传机制,同时还拥有低延时的特点,所以在网络传输中比较受欢迎。

 二.SRT协议传输原理

2.1SRT协议和UDT协议的关系

        SRT大部分的内容继承自UDT协议(UDT协议是加强版的UDP协议,在UDP协议的基础上引入纠错机制和丢包重传机制)。SRT协议具有:加密控制、流量控制、丢包重传等。这使得SRT在传输音视频时,既有UDP的低延时、效率高,同时还有较好的数据重传机制。更重要的是,SRT协议还可以传输高吞吐量和高流量的数据,所以它非常适合音视频的网络传输。下面用两张图来对比一下SRT传输的优势:
        

        从图一可以看到,使用SRT传输音视频时编码端的音视频数据和解码端的音视频数据几乎是一致的,而图2的情况,就有些不同了,编码端的音视频数据通过UDP传输到解码端的时候,整个数据很可能完全不一样。这是因为SRT协议具有一系列的丢包数据,数据恢复等机制,所以编码端和解码端的数据几乎保持一致。而用UDP由于它不具备任何的数据恢复机制,所以很可能会出现一系列的丢包或者乱序情况。

2.2SRT协议的重传机制

        SRT协议分成两种,一种是FEC向前纠错机制、另外一种是ARQ自动重传请求机制。

        ARQ的工作原理:当Server端接收到数据,Server会给client发送ACK信号,若Server没接收到数据Server会给client发送NACK信号,此时Client会发送重传数据到Server,同时AQR还会进行强排序操作。

        

        FEC是和ARQ完全不同的工作机制,它是一种前向纠错机制。它相当于在音视频数据送到传输通道之前,会按照预先设计的算法进行编码处理,加入一些冗余信息的数据。而Server端会根据相应的冗余算法对其进行解码,并在解码的过程中找到相对应的错误码进行纠错,让其数据量恢复正常,所以FEC不需要任何的重传机制。

ARQ和FEC的使用场景:一个通信链路的单次往返时间(RTT)超过600ms,若此时使用ARQ进行重传则会出现网络超级延时。所以,此场景就需要利用FEC前向纠错技术把每个数据包提前进行冗余信息的添加,而Server就可以根据特定的编码技术把错误的信息给纠正。

而假设在一个网络实时传输音视频流的情况下,突然出现网络的抖动和丢包。此时的话,就应该使用ARQ进行丢包重传。因为在网络实时直播的场景下,RTT都是很小的,但是网络带宽有限,所以如果采用FEC前向纠错的话,它会给音视频网络通信带来额外的数据负载。所以,这种场景就适合用ARQ进行重传。

 三.SRT发送缓冲区和接收缓冲区

       在SRT的传输中,一般的重传机制都是由ARQ实现的。ARQ一般需要由缓冲区去实现,ARQ分成两种,一种是发送端缓冲区域,另外一种是接收端缓冲区。

        发送端缓冲区一般保存的是可能需要重传的数据包(就是没有收到ACK的数据包),如果发送端接收到接收端发送的ACK,那么就会从发送缓冲区把该数据包删除掉,如果一直没有收到ACK那么也会根据最大延迟量来把该数据包删除。一般而言,SRT协议中能够通过修改Lantency(最大延时量)去修改发送缓冲区和接收缓冲区的最大使用量。

         网络好的情况下:

        

        网络不好的情况下:

        

        上面这种场景是网络很差的情况,发送端一直没有收到接收端的应答信号。在一段时间后,发送端才收到接收端的NCK重传信号,此时3号数据就会在发送端剔除。又隔了一段时间,4号数据才发送了NCK信号到发送端,此时4号数据会在发送端剔除,接收端就会收到4号数据。在SRT中默认10ms检查一次缓冲区数据。

        

        接收缓冲区的作用是把收到的数据包进行排序操作,排序的目的是要找出哪个数据包出现丢失,并实时向客户端发送NCK信号,并且等待客户端重传到服务端。接收缓冲区也和发送缓冲区一样,有网络状态良好和差的时候。还是以上图为例,当网络环境较好的情况下,接收缓冲区塞满了数据包。2号到5号数据包都已经在接收缓冲器等待接收。

        若网络环境较差的情况下,接收缓冲区只接收了两个数据包,这说明此时的网络链路可能出现了丢包或者带宽不足的情况。可以看到当网络情况很差的情况下,接收端则会发送NACK否定应答信号到客户端,客户端收到否定应答信号之后则会启动重传机制把对应的数据包重传到接收端。

 四.发送端数据缓冲区冗余量

        发送端缓冲区冗余量 = ((Latency – 发送缓冲区最大占有)/ 延时量Latency(ms)) * 100%

        

        从上图可以看出来,发送端缓冲区最大的Lantency是150,而SendBuffer最大在125ms左右,所以它发送端的冗余量大概在17%左右,而这种冗余量是占有率比较少的。

        发送缓冲区的占有率越高说明链路越不安全,整个网络会出现丢包的情况。反之,如果发送缓冲区占有率越低,链路处于一个比较良好的状态

        

 五.接收缓冲区冗余量

        接收端缓冲区冗余量 = (接收端缓冲区最小占用(ms) / Latency(延时量)) * 100%

        

        从这张图我们可以看出来,延时量为150、Receive Buffer大概在30ms,所以整个接收缓冲区的冗余大概在30%左右。

 六.链路的安全冗余

        在网络传输中,冗余量通常是来评估链路传输的安全可靠性。所以配置一个相对安全的冗余量,对于整个网络传输链路传输来说至关重要。通常来说,我们需要保证发送缓冲区的使用量低于延时量,并同时保证接收缓冲区使用率永不为0,那么这个链路就会相对比较安全。

        这是因为发送端的缓冲区和接收端的缓冲区实际上是相互影响的。更重要的是,网络状态比较糟糕的缓冲区冗余量决定了整个网络链路安全的冗余量,所以在SRT传输的过程中安全冗余量 = 发送缓冲区冗余量和接收缓冲区冗余量的最小值。所以从上面的推论我们可以推算出:

安全冗余量 = min(发送缓冲区冗余量,接收缓冲区冗余量)

重传次数冗余量 = (Latency * 安全冗余量 / RTT)

        在SRT传输的过程中,一般我们都会用百分率和重传次数去衡量这个链路的纠错能力。安全冗余可以让开发者更好地了解缓冲区的整体状态,并且通过分析安全冗余的状态图能够更好去调节SRT链路的安全性。

        假设RTT一直很平稳,但在网络直播的时候往往会出现网络丢包的情况。此时RTT会出现突然增加的情况,链路的整体安全冗余量在下降,所以此时百分比就无法反映出真实的链路安全情况。

 七.SRT的配置策略

7.1测量网络链路参数

        

        在SRT网络传输中,一般用以下几个参数作为基础参数分别是带宽、丢包率、RTT值

        带宽:指的是网络传输中的最大数据量

        丢包率:丢包率是判断网络拥塞程度的重要方法之一,丢包率一般用丢失数据包和发送数据包的百分比表示出来。

        RTTRTT指的是单向往返的时间,一般而言用ping指令可以看到RTT的数值。在SRT中,RTT的范围都是在20ms以内。

 7.2设定SRT重传的延时量(Lantency)

        延时量是SRT协议中最重要的参数之一,它的范围一般在80ms-8000ms左右。Latency越大,SRT链路的纠错能力就越大,但是它的实时性就会下降。所以在实际开发中,选择一个合适的Latency能够平衡链路可靠性和延时性取得一个最好的平衡,下面我们用一个表格来描述丢包和RTT的关系。默认的RTT是20ms

        

        Latency延时量 = RTT * RTT倍数

        这个公式中,RTT倍数其实就是我们自定义的重传次数,也相当于链路的纠错机制能力。从上图我们可以看出来,RTT倍数越高,整个链路的丢包率会越高。另外还有几个点要注意的是:

        第一个,Latency可以分别在编码和解码端进行设置,而最终以数值最高的值为标准。

        第二个,在某些场景里面整个传输链路需要的延时是非常低的。比方说,大型足球比赛、篮球比赛等,这种场景需要的端到端延时基本上低于0.7秒。所以,在这种情况下我们需要谨慎衡量Latency和安全冗余量的关系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值