WebRTC拥塞控制原理解析

news2025/1/12 6:13:19

WebRTC包含三种拥塞控制算法,GCC、BBR和PCC。其中,BBR一开始是针对TCP的拥塞控制提出来的。它的输入为ACK/SACK,输出为拥塞窗口(congestion_window)发送速度(pacing_rate)。BBR是怎样运用到UDP,甚至运用到实时流媒体传输之上的?拜读一下在WebRTC中关于拥塞控制的模块吧!

一、平缓发送

拥塞控制模块位于平缓发送这个区域。平缓发送指的是,不会将所有能发的包一股脑都发出去,而是根据拥塞控制模块计算出来的发送速率和拥塞窗口大小,将其平缓的发送出去,从而避免阻塞传输网络,导致RTT剧烈抖动。

这里对比TCP的Reno拥塞控制算法,Reno会维护一个cwnd,然后不停的发送包,直至inflight填满cwnd才停止发送,在收到ack时,释放in_flight,使其可以继续发送后续的包。

对于WebRTC的拥塞控制,它是一个定时循环,在正常情况下,每固定时刻(min_packet_limit_ms_默认值5ms,这个值可能会变化)循环一次。拥塞控制算法会计算出当前可用带宽。接下来,计算 循环周期时间 ✖️当前可用带宽,这个值便是当前周期可发送的数据量的预算值。

整体发送的数据量(throughput)理想情况下应该如图所示。每间隔5ms,会发送一些数据来填满带宽。5ms时间很短,整体来看,是平滑发送的。

从代码实现角度:每次循环,都从数据包的队列中取出一些包,直到消耗完数据量的预算(budget)或者消耗完cwnd(导致处于拥塞状态)。拥塞状态的判定是未收到确认(outstanding_bytes)的数据量大于拥塞窗口(cwnd)的值

另外,如果数据包队列中的数据量不够了,也就是预算太多,实际并没有这么多数据要发送。这时候会发送一些PaddingData用于填补带宽。这个填补对于拥塞控制算法是十分关键的,要不然它无法正确测得到当前可用的带宽。

二、BBR拥塞控制算法在WebRTC中的实现

1、引子

上文明确了如何使用拥塞控制算法的产出结果(bandwidth和cwnd)。下文将介绍BBR算法如何准确获得这两个值。

BBR的简介可以参考这篇文章

BBR 拥塞控制算法解析(来自 Google 的 TCP 拥塞控制算法)ccie.lol/knowledge-base/analysis-bbr/

原理介绍参考这个

https://blog.csdn.net/dog250/article/details/52830576blog.csdn.net/dog250/article/details/52830576

本篇文章重点关注BBR的具体实现方式,尤其是在实时音视频领域、基于的RTP/RTCP的实现。

如果要使用拥塞控制,RTP会使用transport-wide-cc拓展。这里需要参考标准:

RTP Extensions for Transport-wide Congestion Controltools.ietf.org/html/draft-holmer-rmcat-transport-wide-cc-extensions-01

这个transport-wide-cc拓展,其实提供了一种UDP的ACK机制,为拥塞控制的实现提供了可能。另外值得注意的是,transport-wide-cc机制在RTCP中的反馈信息,是聚合的,也就是说,每次可能反馈(ack或lost)的是多个Packet。

2、最大带宽的计算

对于每个ack的数据包,都会计算带宽。并不是只有PROBE_BW模式时才计算。

当前的发送带宽是根据send_rate和ack_rate之中最小值而来的。send_rate和ack_rate都需要使用两个点,计算斜率(数据量之差➗时间差)而来。具体选点可以参考源码,这个不太重要。

如果这个带宽计算值比较好,则将其放入最大带宽的采样记录中。这个记录是最好的三个值(排序的前三名),他们都有一个有效窗口时间,在窗口时间到期或者新的采样值更为优秀,则会替代他们。

这个窗口时间是回合数(round_trip_count)的窗口。那什么算一回合呢?需要一个当前回合结束、下一个回合开始的标志。这个标志是在回合开始时,当前发送的最后一个包的序号。如果在之后收到了这个标志包(或者大于这个标志包序号的包)的ack。则代表该回合结束,下回合开始。

若干的回合之后,前面测量的采样值就会过期。

3、RTT的计算

同理,在收到每个ack时,都会计算这个采样点的RTT值。当这个采样的RTT小于当前测量的最小RTT时,可以延长最小RTT的过期时间(这个延长RTT过期时间的功能暂时没有启用)。否则,在一定物理时间过后,该最小RTT过期,必须进入PROBE_RTT模式。

4、拥塞窗口和BDP的计算

BDP指的是一个PIPE中所能承载的数据量的值。BBR中的BDP为最大带宽✖️最小RTT。拥塞窗口大小乘以一个增益系数,在STARTUP阶段和DRAIN阶段(这个可能是个bug,应该为1/2.885)为2.885,在PROBE_BW阶段为2.0,在PROBE_RTT阶段,拥塞窗口直接设置为4。

这个cwnd不是一下子直接设定一个新值的,而是每次增加当次ack的数据量(类似于TCP的慢启动过程)。

5、PacingRate的增益变化

在STARTUP阶段为2.885,DRAIN阶段为1/2.885。PREOBE_BW的阶段1为1.25,阶段2为0.75。其他时刻为1.0。

6、模式变化

每当收到ack,都有可能引起模式的变化。

  • 当连续3个回合都没有带宽增加时,则认为已经处于满带宽状态了,将会从STARTUP模式转换为DRAIN模式。

  • 当IN_FLIGHT的数据量小于BDP,则退出DRAIN模式,并进入PROBE_BW模式。

  • 在PROBE_BW模式,如果当前处于阶段1(pacing_rate > 1.0)也就是探测额外带宽阶段且INFLIGHT的数据量达到了探测额外带宽的要求,则会前进到阶段2(pacing_rate < 1.0),也就是排空之前探测额外带宽所堆积在链路上的数据。接下来6个阶段是平缓发送阶段(pacing_rate = 1.0)。

  • 当最小RTT过期时,会进入PROBE_RTT模式。将会限制拥塞窗口的大小为4个包。在后续时刻,我们会等到INFLIGHT的数据量小于5个包时,这个时候真正开始了最小RTT的探测,我们设定退出PROBE_RTT的时间为200ms之后。当等到这个时间后,会重新进入PROBE_BW模式。

7、Recovery模式

BBR有一个Recovery模式。每当收到反馈信息,发现存在丢包的时候,将recovery_state设置为CONSERVATION。如果下一次收到反馈信息时,还有丢包,则更新状态为GROWTH。当处于GROWTH状态时,如果下次收到反馈信息时,没有丢包。则更新状态为NOT_IN_RECOVERY。

这个Recovery模式考虑了丢包的因素,会得出recovery_window。根据BBR的配置,可能会与cwnd相比较,取二者之中的较小值作为最后的拥塞窗口值。

三、优化

对于实时流媒体来说,将窗口降为4个包来探测RTT,是一个很糟糕的事情。这里可以通过选项配置的方式改为0.75倍的BDP来探测RTT。

其次,启用延长RTT过期时间的选项,减少进入PROBE_RTT模式的次数。

剩下可以调整的一些参数为:各个模式的congestion_window_gain和pacing_gain。在PROBE_BW模式的8个阶段,可以有更多样化的变化组合。

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

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

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

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

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

相关文章

Java-封装、继承、多态

封装 访问控制权限又成为“封装”&#xff0c;是面向对象三大特征中的一种。核心是&#xff0c;只对需要的类可见。 继承 继承是所有OOP&#xff08;Object Oriented Programming&#xff09;语言和Java语言都不可或缺的一部分。 只要创建一个类&#xff0c;就隐式继承自Obje…

【计算机组成原理】计算机硬件的基础组成、认识各个硬件部件

计算机组成原理&#xff08;一&#xff09; 计算机内部是通过电信号传递数据 电信号&#xff1a;分为高电平和低电平&#xff0c;分别代表1/0 数字、文字、图像如何用二进制表示? CPU如何对二进制数进行加减乘除? 如何存储这些二进制数的? 如何从内存中取出想要的数…

RuoYi-Flowable-Plus搭建(若依)

项目简介 1.本项目基于 RuoYi-Vue-Plus 进行二次开发&#xff0c;采用 Flowable 扩展工作流应用场景&#xff0c;支持在线表单设计和丰富的工作流程设计能力。2.本项目主要针对Flowable工作流场景开发&#xff0c;采用MIT开源协议&#xff0c;完全免费给个人及企业使用。3.环境…

(小甲鱼python)函数笔记合集七 函数(IX)总结 函数的递归、递归和迭代的区别详解

一、基础复习 函数的基本用法 创建和调用函数 函数的形参与实参等等函数的几种参数 位置参数、关键字参数、默认参数等函数的收集参数*args **args 解包参数详解函数中参数的作用域 局部作用域 全局作用域 global语句 嵌套函数 nonlocal语句等详解函数的闭包&#xff08;工厂函…

华为OD机试题【有效子字符串】用 C++ 进行编码 (2023.Q1)

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

如何使用New Bing的ChatGPT聊天机器人

New Bing是微软推出的一款基于GPT4模型的智能搜索引擎&#xff0c;可以提供更加人性化、交互式和多样化的搜索体验。在中国使用New Bing的ChatGPT聊天机器人需要以下几个步骤&#xff1a; 一、准备工作 1.1 申请微软邮箱 用来登录Edge浏览器和接收来自微软New Bing使用邀请的…

代码随想录算法训练营 || 贪心算法 435 763 56

Day31435. 无重叠区间力扣题目链接给定一个区间的集合&#xff0c;找到需要移除区间的最小数量&#xff0c;使剩余区间互不重叠。注意: 可以认为区间的终点总是大于它的起点。 区间 [1,2] 和 [2,3] 的边界相互“接触”&#xff0c;但没有相互重叠。示例 1:输入: [ [1,2], [2,3]…

TryHackMe-hackerNote

hackerNote 自定义 Web 应用程序&#xff0c;引入用户名枚举、自定义单词列表和基本权限提升漏洞。 端口扫描 循例 nmap Web 80和8080都是一样的页面&#xff0c;并且存在一个登录页面 除此之外还有另一个信息就是它只有一个用户 存在注册功能&#xff0c;我们注册一个用户…

AntDB数据库首个社区版正式发布,携手生态更多可能

3月1日&#xff0c;亚信科技AntDB数据库社区版正式开放免费下载。作为AntDB数据库的首个社区版产品&#xff0c;AntDB-CE&#xff08;Community Edition &#xff09; V7.2.0具有完整、易用、兼容度高的企业级分布式数据库产品特性&#xff0c;提供了详细的在线文档支持&#x…

Kafka基本原理

总述 简介 Kafka是最初由Linkedin公司开发&#xff0c;是一个分布式、支持分区的&#xff08;partition&#xff09;、多副本的&#xff08;replica&#xff09;&#xff0c;基于zookeeper协调的分布式消息系统&#xff0c;它的最大的特性就是可以实时的处理大量数据以满足各…

高清无线手机投屏电脑软件Airserver7全平台兼容

Airserver是一款优质的手机投屏软件&#xff0c;搭配了可调节的分辨率模式&#xff0c;针对不同的网络配置&#xff0c;还专门研发了低数据模式以及硬件加速功能&#xff0c;全方位保证投屏画面的清晰度。除此之外&#xff0c;通过调整画面的色彩变化&#xff0c;还可以增强用户…

OpenWrt介绍及编译基础教程

关于OpenWrt OpenWRT是一个高度模块化、高度自动化的嵌入式Linux系统&#xff0c;拥有强大的网络组件和扩展性&#xff0c;常常被用于工控设备、电话、小型机器人、智能家居、路由器以及VOIP设备中。 同时&#xff0c;它还提供了100多个已编译好的软件&#xff0c;而且数量还在…

SC12B触摸感应芯片评测方案(1)

MM32F0160SC12B Touch Application Evaluation 文章目录MM32F0160SC12B Touch Application EvaluationIntroduction & RequirementHardwareSC12B & SC12B Sample Demo boardMini-F0160 boardSoftwareMCU Software - MM32F0160PC Tool - FreeMASTERSummaryIntroduction …

Jupyter Lab | “丢下R,一起来快乐地糟蹋服务器!”

写作前面 工具永远只是为了帮助自己提升工作效率 —— 沃兹基硕得 所以说&#xff0c;为什么要使用jupyterlab呢&#xff1f;当然是因为基于服务器来处理数据就可以使劲造了&#xff0c;而且深切地感觉到&#xff0c;“R这玩意儿是人用的吗”。 jupyter-lab | mamba安装以及…

【微信小程序】-- 全局配置 -- window - 导航栏(十五)

&#x1f48c; 所属专栏&#xff1a;【微信小程序开发教程】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &…

Thymeleaf -- 视图模块

添加thymeleaf的jar包2. 新建一个Servlet类ViewBaseServletpublicclassViewBaseServletextendsHttpServlet { ​privateTemplateEnginetemplateEngine; ​Overridepublicvoidinit() throwsServletException { ​// 1.获取ServletContext对象ServletContextservletContextthis.g…

人大金仓和达梦的空间数据能力对比

一、总得来说&#xff1a; 人大金仓底层更解决于pg数据库&#xff0c; 人大金仓的空间能力基于postgis能力来实现&#xff0c;能力挺强大的. 细节上人大金仓的架构上也对空间的支持框架做的比达梦更加完善。例如数据库的集群能力&#xff0c;并行计算能力&#xff0c;空间数据…

使用热成像仪完成地暖检测应用

家庭地暖已逐步全面走进北方家庭中&#xff0c;常见的地暖系统分为两类&#xff0c;一类为电地暖&#xff0c;一类为水地暖&#xff0c;其常见问题为地暖发热不均&#xff0c;地暖不热或水暖管渗漏等问题。地暖系统在保障温暖及美观的同时&#xff0c;一直存在维修困难的问题&a…

最流行的自动化测试工具,总有一款适合你(附部分教程)

前言 在自动化测试领域&#xff0c;自动化工具的核心地位毋庸置疑。本文总结了最顶尖的自动化测试工具和框架&#xff0c;这些工具和框架可以帮助组织更好地定位自己&#xff0c;跟上软件测试的趋势。这份清单包含了开源和商业的自动化测试解决方案。 1&#xff09;Selenium …

第六章 图

文章目录前言知识框架数据结构的区分1. 图的基本概念1.1 图的定义1.2 图的基本概念和术语总结前言 参考文献&#xff1a;数据结构&#xff1a;图(Graph)【详解】 知识框架 数据结构的区分 线性表&#xff1a;数据元素之间是被串起来的&#xff0c;仅有线性关系&#xff0c;每…