网络传输链路上存在着许多不稳定的情况,造成所发出去的数据包出现丢包、延时或者抖动。除了线路的硬件故障、还包括软件驱动限制、或者链路数据拥塞等情况,都会导致发送出去的数据包在接收端没有办法收到或者延迟收到。
1、首先需要一些工具来检测网络状态,常用的工具 是ping和lperf,来实现对网络状态的探测,统计丢包、延时和单向抖动的情况。
ping(给目标ip发送一个数据包,并要求返回一个大小一样的数据包,以此判断网络的链接情况和延迟情况)。ping发送一个ICMP(Internet-Control-Messages-Protocol,因特网信报控制协议),请求消息给目的地并报告是否收到所希望的ICMP-echo(ICMP回声应答),它是用来检查网络是否通畅或者网络连接速度的命令。TTL是 Time To Live的缩写,TTL是生存时间的意思。表示该字段指定IP包被路由器丢弃之前允许通过的最大网段数量。
lperf
作为一种网络性能测试工具,可以用来测试TCP和UDP的带宽质量,可以用来报告带宽,延迟抖动和数据包的丢失情况。
2、丢包重传的策略
一个数据包在网络传输链路丢失后,一般通过两种方式修复,一种是通知发送端重新发送,一种是基于冗余的包,在接收端将包恢复出来,自动重传请求就是ARQ技术,在RTC场景就是使用NACK否定应答机制,不同于普通的TCP协议中的ACK应答机制,但是重传策略只适用于低延迟场景。
第二中方式是使用前向纠错编码(Forward Error Correction FEC),通过冗余发送对抗网络中的丢包,主要是基于分组编码,实现组内的冗余发送,这种根据先验知识进行冗余决策的,最大的优点是不受延时影响。
3、冗余策略
前面提到的两种重传策略可以分位两种冗余实现:主动的冗余和被动的冗余。
需要寻找主动冗余和被动冗余的平衡点,在保证丢包恢复率的情况下,尽可能的减少冗余的实现占比,尽可能的减少丢包恢复时间。
通过算法计算,得到一个自适应的冗余调整策略。
如果出现网络突然限宽或者大的丢包场景下,就会导致Nack风暴,大量的重传流量挤占了媒体带宽,所以需要通过Nack请求信息来确定当前的包处于什么状态,把预算带宽优先给高优先级的帧,这样可以有效的解决长时间卡死问题。
通过优化的冗余策略,最终要保证在弱网场景下的卡顿率、端到端延迟和冗余率。
除了应对宽带的冗余,还有针对编解码的冗余策略,也是对抗弱网需要的算法