何永德老师的 丢包实践 听讲笔记

何老师讲的很棒

都是基础的,很受用。

好视通”如何通过FEC、NACK 、带宽自适应等技术,对抗网络丢包,保证复杂的网络环境下的音视频流畅性

  • 在这里插入图片描述
  • 在这里插入图片描述
  • 在这里插入图片描述
  • 在这里插入图片描述
  • 百万分之一
  • 无线网络
  • 有线网络拥塞
  • 移动流量占比 80% 弱网非常普遍
  • 抗丢包
  • 牺牲带宽
  • 进攻 牺牲带宽,降低码率,减少丢包在这里插入图片描述
  • 4个数据 xor得到5个数据,任意丢了可以回复在这里插入图片描述
  • K值越大,延迟越大
  • 带宽利用率低,冗余无差别,接收端实际上用不上这么多数据
  • 不能100%恢复,连续丢包很难恢复
  • 丢包随机,不要求100%恢复
  • K 和R 重要参数的选择
  • 相同K ,R越大,抗丢包恢复能力越强。消耗带宽越多。
  • 根据丢包率计算R,丢包率大,R就选大。
  • 公式:
  • R/ (K + 2 ) 要大于网络丢包率。
  • 真实的网络丢包率
  • arq 之后的丢包率
  • arq + fec 后,也就是qos之后 的丢包率

K 影响连续丢包能力,

- 必须连续收满K个包

  • 冗余度最多100%,R是K最大是K,R要大于连续丢包数。
  • K >= 2R ??
  • K 不能与2R 相等:?
  • 加一段自己的代码:
uint32_t  sendTs;//FEC包发送时间,带宽估计可到
	uint32_t firstSeq;//该分组N个源包中第一个源包序号,与N结合,就可以判断出哪些源包属于此分组
	uint8_t K;//分组源包数量 K,服务端可配
	uint8_t R;//分组补偿包数量 R,由丢包率计算
	uint8_t seqR;//当前补偿包序号,取值范围N,N+1......N+K-1

##特别关注小马率的QOS

  • 人为加丢包率,制造弱网在这里插入图片描述
  • 一定丢包率下,小马率不如大码率.
  • 大妈率,收到一个包,却动重传或者FEC解码。
  • 小马率,ARQ 时间也会变大。
  • 所以要尽量使用小包,小包会缩短丢包判断时间。
  • 包小,那么包间隔也会越小,也会缩短FEC时延。
  • FEC必须收到K个包才能恢复,包小了,恢复也会快。
  • 小马率,要控制分组的长度,也就是K的大小。
  • 大妈率,分组K长一点好,对狂连续丢包能力强。

在这里插入图片描述

  • 为了减少时延,把FEC的分组长度变小一点。
  • 减少包的大小,相当于减少了包的时间间隔。这样,小马率下回又比较好的效果。

ARQ

  • 在这里插入图片描述
  • N ACK 主要是指这个 做ARQ
  • arq的特点:
    • 收到rtt影响较大,时延是rtt的倍数。
  • rtt越长,时延越大。
  • rtt 越大,恢复能力越差。
  • arq 在接收端有个时间长度限制的,不能无线等。
  • arq的带宽利用率高,可以做到100%恢复。
  • 如果丢包率不是100% ,又足够的时间,是可以恢复的。
  • 但是高rtt的话,恢复的时间越长。
  • 适用于 rtt小的场景。
  • arq 丢包重传。
  • 在这里插入图片描述
  • arq是先知道丢包了,重传。
  • 但是网络包是乱序的,药有判断策略。
  • 松一点还是紧一点。
  • 1和4丢了,fec自己无法恢复,必须通过借助arq。
  • 策略:
  • n和n+m的包不连续,人为之间的包都丢失了。
  • 或者人为这种情况是乱序,等到一定的序号跨度,才认为是丢包。
  • 更粗暴,等到下一个分组的包时,人为上一个fec分组丢失了。
  • 判断早,浪费带宽。
  • 判断晚了,影响时延和恢复能力。
  • 所以实际使用:
  • 对乱序进行统计,网络统计。。。。
  • arq的包,就是重传包,也可能丢失,需要再次发起重传请求。
  • 这个时间是rtt的一次函数,系数是可以调整的,如果数据比较重要,这个值可以取小一点。
  • fec和arq都有缺点,要结合使用。
  • 在这里插入图片描述
  • 大部分人想到是分层,但是比较别扭。
  • fec在下层,如果fec无法恢复,包送给arq,那么fec的冗余就浪费了,因为可能需要1个包fec就可以,但是给了arq,那么arq就要重传两个包。
  • 所以实现的时候 arq和fec做成一个协议。
  • 公用协议头和结构。
  • 在这里插入图片描述
  • 1 只丢失一部分包,fec解码恢复就可以。
  • 2 无法fec恢复,hi使用arq 重传
  • 3 数据没收到,无法确认是否收到。要等,或者arq重传。

fec和arq的选择

  • 并不是每时每刻都启用fec和arq
  • 根据rtt 来选择。
  • 在这里插入图片描述
  • rtt 小于20毫秒,只使用arq
  • 因为arq 的带宽利用比fec高。
  • rtt很大,arq的恢复能力显著下降,引入时延是rtt的倍数,如重传一次,250毫秒延迟。
  • arq就不能容忍,这个时候就用fec了。
  • 20毫秒和250毫秒之间,就用混合模式,同时使用。
  • rtt 越长,分组设置越长,冗余度越大。
  • 码率越大,分组越长,康连续丢包越强。
  • 音频还能用plc技术来。

防守 ,拥塞控制

带宽估计

  • 在这里插入图片描述
  • 带宽估计的理解,不是估计带宽,是网络拥塞时,发现并降低拥塞,拥塞接触就提升码率/提示音视频质量。
  • 拥塞控制 是 gcc 。谷歌拥塞控制。
  • gcc原理,拥塞发生又俩现象:
  • 1 包排队,造成包的传输时间变大,
  • 2 中间排队缓存溢出,出现丢包了,第二个就是出现了丢包。
  • gcc 总体方案:
    1. 基于包时延
  • 2 基于丢包
  • -在这里插入图片描述
  • 丢包率2%- 10% 保持带宽不变。
  • 20% 以上降低带宽?
  • 这个清晰点:
    在这里插入图片描述
2 基于包延迟的拥塞控制
  • 延迟梯度
  • 收到两个包的时间间隔,以及包发出的时间间隔,差值。
  • 在这里插入图片描述
  • 足够灵敏,网络丢包初期就能探测到。
  • 对于音视频流畅很有价值。
  • 左边,正常情况下,一个包的端到端的传输时间是固定的,正常情况下,计算的延迟梯度是0.
  • 右边, 发生拥塞时,包在网络上排队,导致到达时间晚,这样到达就晚了,人为网络拥塞了。
  • 在这里插入图片描述
  • 但是网络存在抖动,要去抖动,用卡尔曼滤波或者gcc最新的滤波去抖动,得到延迟梯度。
    在这里插入图片描述
  • 梯度与r 值比较,延迟梯度在区间之外之内。
  • 门限值是根据网络情况动态改变的。
  • 避免卡顿。
  • gama值动态计算。

根据负载/延迟梯度 与gama值对比,得到网络负载情况

  • 根据网络负载情况调整带宽
  • 在这里插入图片描述
    • 上面是一个状态机。
  • 做拥塞控制的体会:
  • gcc有个webrtc的开源实现。
  • 做好gcc并不是很容易,效果是多个环节缓缓相扣的,要调的比较好,要深刻理解理论基础。
  • 有些业务在于流畅度/清晰度/
  • 强大的评估系统,收集指标数据,根据数据来判断。
  • 调参数就没办法继续调。

动态r值如何计算

  • r值最主要参考网络丢包率
  • 网络丢包率又多种,
  • 在这里插入图片描述

我也觉得,他说的gcc的gama值是怎么计算的。

  • gcc的gama值,也就是门限值怎么得到;。
  • 滤波器,拿到当前的延迟梯度,拿到门限值,门限值与之前的比较,看差值。
  • 根据差值,当前计算的延迟梯度值,比上一次的门限大还是小?
  • 如果大,门限值加大,小,门限值减少。

康丢包测试公网

  • 公网rtt大约是70 到80毫秒?
    -音频 上下行 同时70%丢包。
  • 视频是50%。
  • 视频720 FHD 上下行50% 时延是300-400多毫秒。
  • 接收端的重传控制是等待时间,上线是500毫秒,超过就人为是丢失了。
发布了664 篇原创文章 · 获赞 55 · 访问量 217万+

猜你喜欢

转载自blog.csdn.net/commshare/article/details/103721775