服务质量的五个标准 服务质量分析模型有什么( 四 )


6.3 减少丢包的方法
WebRTC主要通过两种方式解决丢包:NACK和FEC 。
6.4 NACK
NACK的作用是丢包重传 。从图中你可以看到,WebRTC的发送端不停地向接收端发送RTP包,接收端每隔一小段时间,就对这段时间内的丢包情况进行统计 。如果发现丢包,它会给发送端回一个NACK消息,NACK消息中记录了这一段时间内哪些包丢失了 。发送端收到NACK后,会在之前的发送历史记录中找到丢失的包并重新发送 。
6.5 NACK适合使用的场景
当然,通过NACK重传,会产生一定的延时,该延时包括:等待发送NACK的时间(10或20ms),NACK经过网络的时延以及RTP的网络时延和重传RTP包的网络时延,即1.5RTT 10或20ms 。通过这个公式我们可以知道,如果RTT时延比较大,比如200ms,那么1.5RTT就是300ms 。通过前面讲述的实时传输延时指标我们可以知道,端到端实时传输的时延需要控制在500ms之内,如果仅数据的网络传输就占了300ms,那数据再经过采集、编码、解码、渲染等流程,这些处理时间加在一起很有可能就超过500ms 。
所以可以得出结论,丢包重传仅适用于网络传输时延比较小的情况,如果RTT比较大时,就不适合使用丢包重传来保障网络质量了 。
6.6 FEC
FEC的作用是通过冗余数据解决丢包 。实际上,它就是一个异或操作 。如图所示,假设传输的数据是Data1和Data2,这两个数据如果在传输的过程中没有FEC进行保护,其中一个数据丢失了,那只能通过NACK重新找回 。那么,能否在传输过程中加一些冗余数据,以保证接收时,当某一个数据丢失后,不经过重传就可以将丢失的包找回来呢?这就是FEC 。
在图中我们可以看到,Data1和Data2同时发送到对端,在发送时对它们做一下异或操作,即Data1的最后一位0与Data2的最后一位0异或为0,Data1的倒数第二位1与 Data2的倒数第二位1异或为0,依次类推,最后就产生了冗余数据R,同时将三个包从一端传输到另一端 。传输过程中,如果Data1丢失,通过Data2和冗余包R就可以将Data1找回来 。找回包的算法也是异或操作,即在接收端将Data2的每一位与冗余包中的相同位进行异或操作就算出了Data1 。这就保证了不用重新请求,就将丢失包找回的作用 。
而且异或具有传递性,A、B、C三个包可以同时异或得到D,如果其中任意一个包丢失,可以通过D和其它包找回丢失的包 。
6.7 ULPFEC
对于WebRTC来说,它默认使用的是ULPFEC 。其原理是,将要传输的数据包先进行分组,如将三个包分为一组,然后为这一组包产生一个冗余包,如果这一组中某个包丢失了,就可以通过冗余包和其它包的异或操作将其找回 。从图中第一行可以看到1和2到了,3丢了,通过R1可以找回3,第三行同样可以找回9 。其缺点是,如果连续的两个包都丢失了,这种算法就失效了,比如第二行4和5丢失后,通过6和R2无法找回它们 。

推荐阅读