WebRTC拥塞控制算法——GCC介绍

news2024/10/3 6:34:10

网络拥塞是基于IP协议的数据报交换网络中常见的一种网络传输问题,它对网络传输的质量有严重的影响, 网络拥塞是导致网络吞吐降低, 网络丢包等的主要原因之一, 这些问题使得上层应用无法有效的利用网络带宽获得高质量的网络传输效果。特别是在通信领域, 网络拥塞导致的丢包, 延迟, 抖动等问题, 严重的影响了通信质量, 如果不能很好的解决这些问题, 一个通信产品就无法在现实环境中正常使用。 在这方面WebRTC中的网络拥塞控制算法给我们提供了一个可供参考的实现,这篇小文会尽量详细的介绍WebRTC中的拥塞控制算法---GCC的实现方式。

1.WebRTC简介


WebRTC是一个Web端的实时通信解决方案, 它可以做到在不借助外部插件的情况下, 在浏览器中实现点对点的实时通信。 WebRTC已经由W3C和IETF标准化,最早推出和支持这项技术的浏览器是Chrome, 其他主流浏览器也正在陆续支持。Chrome中集成的WebRTC代码已全部开源, 同时Chrome提供了一套LibWebRTC的代码库, 使得这套RTC架构可以移植到其他APP当中,提供实时通信功能。

2.GCC算法概述


本文主要介绍的是WebRTC的拥塞控制算法, WebRTC的传输层是基于UDP协议, 在此之上, 使用的是标准的RTP/RTCP协议封装媒体流。RTP/RTCP本身提供很多机制来保证传输的可靠性,比如RR/SR, NACK, PLI, FIR, FEC, REMB等,同时WebRTC还扩展了RTP/RTCP协议, 来提供一些额外的保障, 比如Transport-CCFeedback, RTP Transport-wide-cc extension, RTP abs-sendtime extension等, 其中一些后文会详细介绍。

GCC算法主要分成两个部分, 一个是基于丢包的拥塞控制,一个是基于延迟的拥塞控制。 在早期的实现当中, 这两个拥塞控制算法分别是在发送端和接收端实现的, 接收端的拥塞控制算法所计算出的估计带宽, 会通过RTCP的remb反馈到发送端, 发送端综合两个控制算法的结果得到一个最终的发送码率,并以此码率发送数据包。下图便是展现的该种实现方式:

从图中可以看到, Loss-Based Controller在发送端负责基于丢包的拥塞控制,它的输入比较简单, 只需要根据从接收端反馈的丢包率, 就可以做带宽估算; 上图右侧比较复杂, 做的是基于延迟的带宽估计, 这也是本文后面主要介绍的部分。在最近的WebRTC实现中, GCC把它的两种拥塞控制算法都移到了发送端来实现, 但是两种算法本身并没有改变,只是在发送端需要计算延迟, 因而需要一些额外的feedback信息, 为此WebRTC扩展了RTCP协议, 其中最主要的是增加了Transport-CC Feedback,该包携带了接收端接收到的每个媒体包的到达时间。

基于延迟的拥塞控制比较复杂, WebRTC使用延迟梯度来判断网络的拥塞程度,延迟梯段的概念后文会详细介绍;其算法分为几个部分:

  • 到达时间滤波器

  • 过载检测器

  • 速率控制器

在获得两个拥塞控制算法分别结算到的发送码率之后, GCC最终的发送码率取的是两种算法的最小值。下面我们详细介绍WebRTC的拥塞控制算法GCC。

3、基于丢包的带宽估计


基于丢包的拥塞控制比较简单, 其基本思想是根据丢包的多少来判断网络的拥塞程度, 丢包越多则认为网络越拥塞, 那么我们就要降低发送速率来缓解网络拥塞;如果没有丢包,这说明网络状况很好, 这时候就可以提高发送码率, 向上探测是否有更多的带宽可用。实现该算法有两点:一是获得接收端的丢包率, 一是确定降低码率和提升码率的阈值。

WebRTC通过RTCP协议的Receive Report反馈包来获取接收端的丢包率。Receive Report包中有一个lost fraction字段, 包含了接收端的丢包率,如下图所示。

另外, WebRTC通过以下公式来估算发送码率,式中 As(tk) 即为 tk 时刻的带宽估计值,fl(tk) 即为 tk 时刻的丢包率:

简单来说, 当丢包率大于10%时则认为网络有拥塞, 此时根据丢包率降低带宽,丢包率越高带宽降的越多; 当丢包率小于2%时,则认为网络状况很好, 此时向上提高5%的带宽以探测是否有更多带宽可用; 2%到10%之间的丢包率, 则会保持当前码率不变, 这样可以避免一些网络固有的丢包被错判为网络拥塞而导致降低码率, 而这部分的丢包则需要通过其他的如NACK或FEC等手段来恢复。

4、基于延迟梯度的带宽估计


WebRTC实现的基于延迟梯度的带宽估计有两种版本:

  • 最早一种是在接受端实现,评估的带宽结果通过RTCP REMB消息反馈到发送端。 在此种实现中, 为了准确计算延迟梯度,WebRTC添加了一种RTP扩展头部abs-send-time, 用来表示每个RTP包的精确发送时间, 从而避免发送端延迟给网络传播延迟的估计带来误差。这种模式也是RFC和google的paper中描述的模式。

  • 在新近的WebRTC的实现中,所有的带宽估计都放在了发送端, 也就说发送端除了做基于丢包的带宽估计, 同时也做基于延迟梯度的带宽估计。 为了能够在接受端做基于延迟梯度的带宽估计, WebRTC扩展了RTP/RTCP协议, 其一是增加了RTP扩展头部, 添加了一个session级别的sequence number, 目的是基于一个session做反馈信息的统计, 而不紧紧是一条音频流或视频流; 其二是增加了一个RTCP反馈信息transport-cc-feedback, 该消息负责反馈接受端收到的所有媒体包的到达时间。接收端根据包间的接受延迟和发送间隔可以计算出延迟梯度,从而估计带宽。

关于如何根据延迟梯度推断当前网络状况, 后面会分几点详细展开讲, 总体来说分为以下几个步骤:

  • 到达时间滤波器

  • 过载检测器

  • 速率控制器

其过程就是, 到达时间滤波器根据包间的到达时延和发送间隔,计算出延迟变化, 这里会用到卡尔曼滤波对延迟变化做平滑以消除网络噪音带来的误差;延迟变化会作为过载检测器的输入,由过载检测器判断当前网络的状态,有三种网络状态返回overuse/underuse/normal,检测的依据是比较延迟变化和一个阈值, 其中该阈值非常关键且是动态调整的。最后根据网络状态的变化, 速率控制器根据一个带宽估计公式计算带宽估计值。

5、到达时间滤波器


前面多次提到WebRTC使用延迟梯度来判断网络拥塞状况, 那什么是延迟梯度,为什么延迟梯度可以作为判断网络拥塞的依据,我们在这里详细介绍, 首先来看以下, 延迟梯度是怎样计算出来的:

\1. 延迟梯度的计算

如上图所示, 用两个数据包的到达时间间隔减去他们的发送时间间隔, 就可以得到一个延迟的变化, 这里我们称这个延迟的变化为单向延迟梯度(one way delay gradient), 其公式可记为:

那么为什么延迟梯度可以用来判断网络拥塞的呢,如下面两图所示:

左边这幅图的场景是理想状况下的网络传输, 没有任何拥塞, 按我们上面提到的公式(2)来计算,这种场景下, 所计算到的延迟梯度应该为0。而右边这幅图的场景则是发送拥塞时的状况,当包在t2时刻到达时, 该报在网络中经历过一次因拥塞导致的排队, 这导致他的到达时间比原本要完, 此时计算出的延迟梯度就为一个较大的值,通过这个值, 我们就能判断当前网络正处在拥塞状态。

在WebRTC的具体实现中, 还有一些细节来保证延迟梯度计算的准确性,总结如下:

  • 由于延迟梯度的测量精度很小, 为了避免网络噪音带来的误差,利用了卡尔曼滤波来平滑延迟梯度的测量结果。

  • WebRTC的实现中, 并不是单纯的测量单个数据包彼此之间的延迟梯度, 而是将数据包按发送时间间隔和到达时间间隔分组,计算组间的整体延迟梯度。分组规则是:

  • 发送时间间隔小于5ms的数据包被归为一组, 这是由于WebRTC的发送端实现了一个平滑发送模块, 该模块的发送间隔是5ms发送一批数据包。

  • 到达时间间隔小于5ms的数据包被归为一组, 这是由于在wifi网络下, 某些wifi设备的转发模式是, 在某个固定时间片内才有机会转发数据包, 这个时间片的间隔可能长达100ms, 造成的结果是100ms的数据包堆积, 并在发送时形成burst, 这个busrt内的所有数据包就会被视为一组。

  • 为了计算延迟梯度, 除了接收端要反馈每个媒体包的接受状态,同时发送端也要记录每个媒体包的发送状态, 记录其发送的时间值。在这个情况下abs-send-time扩展不再需要。

\2. transport-cc-feedback消息

该消息是对RTCP的一个扩展, 专门用于在GCC中反馈数据包的接受情况。这里有两点需要注意:

  • 该消息的发送速率如何确定, 按RFC[2]中的说明,可以是收到每个frame发送一次, 另外也指出可以是一个RTT的时间发送一次, 实际WebRTC的实现中大约估计了一个发送带宽的5%这样一个发送速率。

  • 如果这个数据包丢失怎么办, RFC[2]和WebRTC实现中都是直接忽略, 这里涉及的问题是,忽略该包对计算延迟梯度影响不大, 只是相当于数据包的分组跨度更大了, 丢失的包对计算没有太大影响, 但另一个问题是, 发送端需要计算接受端的接受速率,当feedback丢失时,会认为相应的数据包都丢失了, 这会影响接受速率的计算, 这个值在后续计算估计带宽中会用到, 从而导致一定误差。

具体消息格式如下:

如上图所示, 红框之前的字段是RTCP包的通用字段, 红框中的字段为transport-cc的具体内容,其中前四个字段分别表示:

  • base sequence number:当前包携带的媒体包的接受信息是从哪个包开始的

  • packet status count:当前包携带了几个媒体包的接受信息

  • reference time:一个基准时间,计算该包中每个媒体包的到达时间都要基于这个基准时间计算

  • fb pkt. count:第几个transport-cc包

在此之后, 是两类信息:多个packet chunk字段和多个recv delta字段。其中pcaket chunk具体含义如下:

如下两图所示, 表示媒体包到达状态的结构有两种编码方式, 其中 T 表示chunk type;0表示RunLength Chunk, 1表示Status Vector Chunk.

1)Run LengthChunk

这种表示方式是用于, 当我们连续收到多个数据包, 他们都有相同的到达状态, 就可以用这种编码方式。 其中S表示的是到达状态, Run Length表示有多少个连续的包属于这一到达状态。

到达状态有三种:

00 Packet not received

01 Packet received, small delta (所谓small detal是指能用一个字节表示的数值)

10 Packet received, large ornegative delta (large即是能用两个字节表示的数值)

2) Status Vector Chunk

这种表示方式用于每个数据包都需要自己的状态表示码, 当然还是上面提到的那三种状态。但是这里的S就不是上面的意思, 这里的S指的是symbol list的编码方式, s = 0时, 表示symbollist的每一个bit能表示一个数据包的到达状态, s = 1时表示每两个bit表示一个数据包的状态。

s = 0 时

0 Packet not received

1 Packet received , small detal

s = 1 时

同 Run Length Chunk

最后, 对于每一个状态为Packet received 的数据包的延迟依次填入|recv delta|字段, 到达状态为1的,recv delta占用一个字节, 到达状态为2的,recv delta占用两个字节。可以看出以上编码的目的是为了尽量减少该数据包的大小, 因为每个媒体包都需要反馈他的接受状态。

6、过载检测器


到达时间滤波器计算出每组数据包的延迟梯度之后, 就要据此判断当前的网络拥塞状态, 通过和某个阈值的比较, 高过某个阈值就认为时网络拥塞,低于某个阈值就认为网路状态良好,因此如何确定阈值就至关重要。这就是过载检测器的主要工作,它主要有两部分, 一部分是确定阈值的大小, 另一部分就是依据延迟梯度和阈值的判断,估计出当前的网络状态,一共有三种网络状态: overuse underuse normal,我们先看网络状态的判断。

\1. 网络状态判断

判断依据入下图所示:

其中m(t i)表示的是计算出的延迟梯,r(t i)表示的是一个判断阈值, 这个阈值是自适应的, 后面还会介绍他是怎么动态调整的,这里先只看如何根据这两个值判断当前网络状态。

从上图可以看出, 这里的判断方法是:

这样计算的依据是, 网络发生拥塞时, 数据包会在中间网络设备中排队等待转发, 这会造成延迟梯度的增长, 当网络流量回落时,网络设备快速消耗(转发)其发送队列中的数据包,而后续的包排队时间更短, 这时延迟梯度减小或为负值。

这里了需要说明的是:

  • 在实际WebRTC的实现中,虽然每个数据包组(前面提到了如何分组)的到达都会触发这个探测过程, 但是使用的m(ti)这个值并不是直接使用每组数据到来时的计算值, 而是将这个值放大了60倍。这么做的目的可能是m(ti)这个值通常情况下很小,理想网络下基本为0, 放大该值可以使该算法不会应为太灵敏而波动太大。

  • 在判断是否overuse时,不会一旦超过阈值就改变当前状态, 而是要满足延迟梯度大于阈值至少持续100ms, 才会将当前网络状态判断为overuse。

\2. 自适应阈值

上节提到的阈值r(t i)值, 它是判断当前网络状况的依据,所以如何确定它的值也就非常重要了。虽然理想状况下,网络的延迟梯度是0, 但是实际的网络中, 不同转发路径其延迟梯度还是有波动的, 波动的大小也是不一样的,这就导致如果设置固定的 r(t i)太大可能无法探测到拥塞, 太小又太敏感, 导致速率了变化很大。同时, 另外一个问题是,实验中显示固定的值会导致在和TCP链接的竞争中,自己被饿死的现象(TCP是基于丢包的拥塞控制),因此WebRTC使用了一种自适应的阈值调节算法,具体如下:

(1) 自适应算法

上面的公式就是GCC提出的阈值自适应算法, 其中:

, 每组数据包会触发一次探测, 同时更新一次阈值, 这里

的意义就是距上次更新阈值时的时间间隔。

是一个变化率,或者叫增长率,当然也有可能是负增长,增长的基值是:当前的延迟梯度和上一个阈值的差值---

。其具体的取值如下:

其中:ku = 0.01; kd = 0.00018

从这个式子中可以看出, 当延迟梯度减小时, 阈值会以一个更慢的速率减小; 延迟梯度增加时, 阈值也会以一个更慢的速度增加;不过相对而言, 阈值的减小速度要小于增加速度。

7、速率控制器


速率控制器主要实现了一个状态机的变迁, 并根据当前状态来计算当前的可用码率, 状态机如下图所示:

速率控制器根据过载探测器输出的信号(overuse underusenormal)驱动速率控制状态机, 从而估算出当前的网络速率。从上图可以看出, 当网络拥塞时, 会收到overuse信号,状态机进入“decrease”状态, 发送速率降低;当网络中排队的数据包被快速释放时, 会受到underuse信号,状态机进入“hold”状态。 网络平稳时, 收到normal信号,状态机进入“increase”状态,开始探测是否可以增加发送速率。

在Google的paper[3]中,计算带宽的公式如下:

其中

= 1.05,

=0.85。 从该式中可以看到, 当需要Increase时, 以前一次的估算码率乘以1.05作为当前码率; 当需要Decrease时, 以当前估算的接受端码率(Rr(ti))乘以0.85作为当前码率;Hold状态不改变码率。

最后, 将基于丢包的码率估计值和基于延迟的码率估计值作比较, 其中最小的码率估价值将作为最终的发送码率。

8、结尾


以上便是WebRTC中的拥塞控制算法的主要内容, 其算法也一直还在演进当中,每个版本都有会有一些改进加入。其他还有一些主题这里没有覆盖到,比如平滑发送, 可以避免突发流量; padding包等用来探测带宽的策略。应该说WebRTC的这套机制能覆盖大部分的网络场景, 但是从我们测试来看有一些特殊场景, 比如抖动或者丢包比较高的情况下, 其带宽利用率还是不够理想,但总体来说效果还是很不错的。

原文https://zhuanlan.zhihu.com/p/454893807

★文末名片可以免费领取音视频开发学习资料,内容包括(FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)以及音视频学习路线图等等。

见下方!↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/380091.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++——智能指针1

目录 RAII auto_ptr模拟实现 智能指针拷贝问题 唯一指针 shared_ptr(可以拷贝) shared_ptr模拟实现 完整代码 循环引用 weak_ptr模拟实现 定制删除器 shared_ptr定制删除器模拟实现 内存泄漏 RAII RAII(Resource Acquisit…

SkyWalking使用案例

SkyWalking监控java项目Halo博客 Halo是一个开源的博客项目,使用java编写,官网地址:https://halo.run/ 安装java环境,Halo对java版本有限制,1.4.3版本以上需要使用java11以上 apt -y install openjdk-11-jdk java -…

matplotlib常用操作

文章目录1 matplotlib绘图1.1 绘图步骤2 matplotlib基本元素2.1 matplotlib 画布2.2 设置坐标轴长度和范围2.3 设置图形的线型和颜色2.4 设置图形刻度范围、刻度标签和坐标轴标签等2.4.1 设置刻度范围2.4.2 设置坐标轴刻度2.5 文本标签图例3 matplotlib的ax对象绘图4 绘制子图5…

2.3 黑群晖驱动:开启nvme缓存、将nvme缓存作为存储盘 教程

黑群晖驱动安装工具下载:链接:https://pan.baidu.com/s/1CMLl6waOuW-Ys2gKZx7Jgg?pwdchct提取码:chct一、开启NVME缓存在群辉->控制面板->终端机和SNMP->终端机中 勾选“启动SSH”功能,并点击应用;下载安装P…

HACKTHEBOX——Teacher

nmapnmap -sV -sC -p- -T4 -oA nmap 10.10.10.153nmap只发现了对外开放了80端口,从http-title看出可能是某个中学的官网http打开网站确实是一个官网,查看每个接口看看有没有可以利用的地方发现了一个接口,/images/5.png,但是响应包…

国内有哪些支持定制化的低代码平台?

编者按:贴合企业业务需求的系统才是好系统,高程度的定制能力平台意味着可以提供更高契合度的产品,更好地匹配业务需求。本文介绍了国内支持定制化的老厂商低代码平台,具有源码交付、私有化部署、国产化、数据对接等优势。关键词&a…

服务端开发之Java备战秋招面试篇5

努力了那么多年,回头一望,几乎全是漫长的挫折和煎熬。对于大多数人的一生来说,顺风顺水只是偶尔,挫折、不堪、焦虑和迷茫才是主旋律。我们登上并非我们所选择的舞台,演出并非我们所选择的剧本。继续加油吧! 目录 1.ArrayList与LinkedList区别, 应用场景…

免费数据恢复软件哪个好?排名前十的软件有这些!

我们经常会使用电脑,有时是为了放松娱乐,有时是为了处理工作。里面保存着大大小小的数据,多的数不胜数。如果我们的数据丢失,通过很多方法都没有办法恢复,那么软件可以帮助用户轻松处理各种丢失的文件,并可…

IDEA git cherry pick 简单使用

cherry pick的作用: 参考了一些博客, eg:参考博客1 参考博客2 再做了个小案例后,我目前的理解是,cherry pick的作用是将一个分支的部分提交/历史提交,可以合并到另外一个分支。这也只是解决办法之一,之后遇到详细真实场…

普元EOS中导出excl页面下载

起因 需要做一个筛选功能的导出表格 解决办法 这个垃圾eos我是真受不了,sb玩意的缺点三天三夜也说不完 后边就没法整response的这些个东西,可真是够愁人的 在网上搜了搜 在普元的帮助文档里也看了看 普元提供的像是老太太的裹脚布一般又臭又长 参照这个可以看一下

怕被AI取代快想办法“攒”个“数字第二大脑”

每日经济新闻发文:来自央视财经微博2月27日消息,美国《财富》杂志网站近日报道,美国一家提供就业服务的平台对1000家企业进行了调查。结果显示,美国最新调查显示50%企业已在用ChatGPT,其中48%已让其代替员工,有公司省下10多万美元!还有30%表示,有计划使用。

4年经验来面试20K的测试岗,一问三不知,我还真不如去招应届生。

公司前段缺人,也面了不少测试,结果竟然没有一个合适的。一开始瞄准的就是中级的水准,也没指望来大牛,提供的薪资在10-20k,面试的人很多,但平均水平很让人失望。看简历很多都是4年工作经验,但面试…

华为OD机试题【找出通过车辆最多颜色】用 C++ 进行编码 (2023.Q1)

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧文章目录 最近更新的博客使用说明找出通…

4.7 全文本搜索

文章目录1.概述2.使用全文本搜索2.1 启用全文本搜索支持2.2 进行全文本搜索2.3 使用查询拓展2.4 布尔文本搜索3.全文本搜索使用说明1.概述 首先我们要知道,不是所有搜索引擎都支持全文本搜索,前边我们介绍过MySql支持多种数据类型,而其默认的…

【微服务】-微服务环境搭建

目录 2.1 技术选型 2.2 模块设计 2.3 微服务调用 2.4 创建⽗⼯程 2.5 创建商品微服务 2.6 创建订单微服务 2.1 技术选型 持久层: SpingData Jpa 数据库: MySQL5.7 其他: SpringCloud Alibaba 技术栈 2.2 模块设计 --- shop-parent ⽗⼯程 --- shop-product-api 商品微服…

go提高升阶(四) I/O流学习

I/O 官网课程 购买课程找博主推荐 文章目录I/O文件信息创建文件、目录IO读IO写(权限)文件复制Seeker接口断点续传遍历文件夹bufio电脑中一切,都是以 二进制流的形式存在的。jpg:010100000010010101001010101010010101010 编码格式,还原为一个…

(02)Unity HDRP Volume 详解

1.概述这篇文章主要针对HDRP中的Volume和Volume Post-processing进行解释,针对于各个组件只能进行部分参数的解释,具体的信息可参考官方资料,这里只是对官方文档的图片效果补充以及笔者自己的理解。看到这里进入正文,请确保你的Un…

企业IT信息化,BI 能做什么?

随着数字化相关技术、应用的发展,社会总体的数字化发展进入了加速阶段,各行各业都开始有了数字化的身影,在这种情况下,数据已经成为了越来越多企业的重要资产,所以如何处理数据,让数据从资产转化为实际的价…

【Linux】理解文件系统

文章目录理解文件系统了解磁盘结构inode理解文件系统 了解磁盘结构 磁盘是计算机中的一个 机械设备 这个磁盘的盘片就像光盘一样,数据就在盘片上放着, 但是光盘是只读的,磁盘是可读可写的 机械硬盘的寻址的工作方式: 盘片不断旋转,磁头不断摆动,定位到特定的位置 我们可以把…

代码随想录算法训练营day46 | 动态规划之背包问题 139.单词拆分

day46139.单词拆分1.确定dp数组以及下标的含义2.确定递推公式3.dp数组如何初始化4.确定遍历顺序5.举例推导dp[i]139.单词拆分 题目链接 解题思路:单词就是物品,字符串s就是背包,单词能否组成字符串s,就是问物品能不能把背包装满。…