WebRTC拥塞控制原理之一基本介绍
1 基本原理
WebRTC的拥塞控制模块使用的是基于TCP的拥塞控制算法。它是根据网络带宽和延迟等信息来自适应地调整传输速率的。
具体来说,该模块采用的是基于RFC 3550中的延迟抖动调整算法的改进版本。该算法实施的基本原理是在传输的过程中定期探测网络的质量和延迟,并根据这些信息来自适应地调整传输速率。
具体步骤如下:
- 定期测量网络的延迟和带宽,以便了解当前的网络情况。
- 根据当前网络的情况来计算最大可用传输速率。
- 根据当前的带宽和延迟情况来动态调整传输速率。
- 如果网络质量出现问题,将立即降低传输速率。
- 检测网络质量的变化并及时调整传输速率。
- 保持一个平衡的传输速率,以最大限度地利用可用带宽。
总之,WebRTC的拥塞控制模块采用了先进的自适应算法,可以在不影响通信质量的情况下尽可能地提高传输速率。这使得WebRTC成为一种非常强大和实用的实时通信技术。以下分析基于【WebRTC source stamp 2022-03-04T04:05:35】版本。新版本相较之前的版本最大的改进是基于接收端的带宽估计,不需要发送端参与带宽的估计计算,从而不需要依赖于发送的的带宽估计。
2 整体架构
拥塞控制模块位于modules中的congestion_controller模块。
include目录:实现了拥塞控制模块对外API。
goog_cc目录: 实现了 Google Congestion Control 的主要功能,提供了丰富的接口和数据类型,帮助开发者轻松实现高效的拥塞控制算法,以提供高质量的实时视频和音频通信服务。Google Congestion Control 是一种开放源代码的拥塞控制算法实现,目的是在不稳定或高延迟的网络环境中,提高视频和音频的传输质量。
pcc目录:实现了 PCC(Probe Congestion Control)拥塞控制算法,是一个基于探针的拥塞控制算法。PCC 算法不需要精准地估算网络带宽,而是通过发送一组探针包来探测网络的状况,进而调整传输速率,从而实现拥塞控制。
rtp目录:实现了 RTP(Real-time Transport Protocol)拥塞控制算法。RTP 是一种用于实时传输音频和视频的协议,可以对数据进行分组和时间戳等处理。RTP 拥塞控制算法实现了在不同网络拥塞情况下的数据传输控制。

3 对外API解读
对外API封装在ReceiveSideCongestionController类中,顾名思义这一个基于接收端的拥塞控制算法。ReceiveSideCongestionController 类的构造函数,用于创建一个接收端拥塞控制器对象,以保证数据传输的稳定性和可靠性。该类对象需要提供时钟、传输反馈信息发送函数、REMB 消息发送函数和网络状态估计器等信息,用于进行拥塞控制和比特率调整等操作。
class ReceiveSideCongestionController : public CallStatsObserver {public:// 构造函数/*构造函数的参数如下:clock:一个指向 Clock 类对象的指针,用于获取当前时间戳。feedback_sender:一个函数对象,用于发送传输反馈信息。remb_sender:一个函数对象,用于发送 REMB (Receiver Estimated Maximum Bitrate) 消息。network_state_estimator:一个指向 NetworkStateEstimator 对象的指针,用于估计网络的状态(如带宽,丢包率等)。*/ReceiveSideCongestionController(Clock* clock,RemoteEstimatorProxy::TransportFeedbackSender feedback_sender,RembThrottler::RembSender remb_sender,NetworkStateEstimator* network_state_estimator);Clock* clock, // 时钟RemoteEstimatorProxy::TransportFeedbackSender feedback_sender, // 远程估计代理RembThrottler::RembSender remb_sender, // REMB发送器NetworkStateEstimator* network_state_estimator); // 网络状态估计器~ReceiveSideCongestionController() override {}// 接收到数据包时的回调函数void OnReceivedPacket(const RtpPacketReceived& packet, MediaType media_type);// TODO(perkj, bugs.webrtc.org/14859): Remove all usage. This method is// currently not used by PeerConnections.virtual void OnReceivedPacket(int64_t arrival_time_ms,size_t payload_size,const RTPHeader& header);// Implements CallStatsObserver.// 实现CallStatsObserver接口,当RTT更新时调用void OnRttUpdate(int64_t avg_rtt_ms, int64_t max_rtt_ms) override;// This is send bitrate, used to control the rate of feedback messages.// 这是发送比特率,用于控制反馈消息的速率。void OnBitrateChanged(int bitrate_bps);// Ensures the remote party is notified of the receive bitrate no larger than// `bitrate` using RTCP REMB.// 确保使用RTCP REMB通知远程方接收比特率不大于`bitrate`。void SetMaxDesiredReceiveBitrate(DataRate bitrate);// 设置传输开销void SetTransportOverhead(DataSize overhead_per_packet);// Returns latest receive side bandwidth estimation.// Returns zero if receive side bandwidth estimation is unavailable.// 返回最新的接收端带宽估计。// 如果接收端带宽估计不可用,则返回零。DataRate LatestReceiveSideEstimate() const;// Removes stream from receive side bandwidth estimation.// Noop if receive side bwe is not used or stream doesn't participate in it.// 从接收端带宽估计中删除流。// 如果不使用接收端bwe或流不参与其中,则不执行任何操作。void RemoveStream(uint32_t ssrc);// Runs periodic tasks if it is time to run them, returns time until next// call to `MaybeProcess` should be non idle.// 如果到了运行它们的时间,则运行定期任务,返回到下一个// 调用`MaybeProcess`应该是非空闲的时间。TimeDelta MaybeProcess();private:// 从头部选择估计器void PickEstimatorFromHeader(const RTPHeader& header)RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_);// 选择估计器void PickEstimator() RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_);Clock& clock_; // 时钟RembThrottler remb_throttler_; // REMB发送器RemoteEstimatorProxy remote_estimator_proxy_; // 远程估计代理mutable Mutex mutex_; // 互斥锁std::unique_ptr<RemoteBitrateEstimator> rbe_ RTC_GUARDED_BY(mutex_); // 远程比特率估计器bool using_absolute_send_time_ RTC_GUARDED_BY(mutex_); // 是否使用绝对发送时间uint32_t packets_since_absolute_send_time_ RTC_GUARDED_BY(mutex_); // 自绝对发送时间以来的数据包数
};
相关文章:
WebRTC拥塞控制原理之一基本介绍
1 基本原理 WebRTC的拥塞控制模块使用的是基于TCP的拥塞控制算法。它是根据网络带宽和延迟等信息来自适应地调整传输速率的。 具体来说,该模块采用的是基于RFC 3550中的延迟抖动调整算法的改进版本。该算法实施的基本原理是在传输的过程中定期探测网络的质量和延迟…...
选择 .NET 的 n 个理由
自从我们启动快速发展的 .NET 开源和跨平台项目以来,.NET 发生了很大变化。我们重新思考并完善了该平台,添加了专为性能和安全性而设计的新低级功能,以及以生产力为中心的高级功能。Span<T>、硬件内在函数和可为空的引用类型都是示例。…...
spark第三章:工程化代码
系列文章目录 spark第一章:环境安装 spark第二章:sparkcore实例 spark第三章:工程化代码 文章目录系列文章目录前言一、三层架构二、拆分WordCount1.三层拆分2.代码抽取总结前言 我们上一次博客,完成了一些案例的练习࿰…...
Vue实战【封装一个简单的列表组件,实现增删改查】
文章目录🌟前言🌟table组件封装🌟父组件(展示表格的页面)🌟控制台查看父子组件通信是否成功🌟Vue2父子组件传递参数🌟写在最后🌟JSON包里写函数,关注博主不迷…...
微前端(无界)
前言:微前端已经是一个非常成熟的领域了,但开发者不管采用哪个现有方案,在适配成本、样式隔离、运行性能、页面白屏、子应用通信、子应用保活、多应用激活、vite 框架支持、应用共享等用户核心诉求都或存在问题,或无法提供支持。本…...
强烈推荐:0基础入门网安必备《网络安全知识图谱》
蚁景网安学院一直专注于网安实战技能培养,提供全方位的网安安全学习解决方案。我们集聚专业网安技术大佬资源,倾力打造了这本更全面更系统的“网络安全知识图谱”,让大家在网络安全学习路上不迷茫。 在这份网安技能地图册里,我们对…...
网络技术与应用概论(上)——“计算机网络”
各位CSDN的uu们你们好呀,今天,小雅兰的内容依旧是计算机网络的一些知识点噢,下面,让我们进入计算机网络的世界吧 网络内涵 网络特征 网络定义 互联网发展过程 从ARPA网络到Internet 从低速互联网到高速互联网 从数据结构到统一网…...
JAVASE/封装、继承、多态
博客制作不易,欢迎各位点赞👍收藏⭐关注前言在学习面向对象编程语言时,封装、继承、多态则是我们必须学习和使用的三大特征。本文通过举例,说明了该三大特征的基本权限特点。一、访问限定符范围private默认权限protectedpublic同一…...
SpringBoot ElasticSearch 【SpringBoot系列16】
SpringCloud 大型系列课程正在制作中,欢迎大家关注与提意见。 程序员每天的CV 与 板砖,也要知其所以然,本系列课程可以帮助初学者学习 SpringBooot 项目开发 与 SpringCloud 微服务系列项目开发 elasticsearch是一款非常强大的开源搜索引擎&a…...
Virtual box磁盘大小调整操作
Virtual box磁盘大小调整操作环境说明思路操作1、挂载要压缩的硬盘到 ~/data2、填充 0 文件3、删除 全是0空文件4、虚拟机关机5、在windows环境下用VBoxManage.exe 进行压缩硬盘加大环境说明 主机 windows 虚拟机 ubuntu 分配了 80G 的硬盘,现在已经占用 80 G 了。…...
MySQL注入秘籍【上篇】
MySQL注入秘籍【上篇】1.数据库敏感信息常用语句2.联合(UNION)查询注入3.报错注入原理常见报错注入函数1.数据库敏感信息常用语句 获取数据库版本信息 select version(); select innodb_version;获取当前用户 select user();获取当前数据库 select database();数…...
简单三步解决动态规划难题,记好这三步,动态规划就不难
目录一、简单的一维DP剑指 Offer 10- I. 斐波那契数列1、三板斧解决问题2、优雅的解决问题剑指 Offer 63 股票的最大利润1、三板斧解决问题2、优雅的解决问题二、进阶的二维DP剑指offer47 礼物的最大价值1、三板斧解决问题2、优雅的解决问题编辑距离1、三板斧解决问题2、优雅的…...
算法进阶指南打卡
文章目录 基本算法 位运算递推与递归前缀和与差分二分排序倍增贪心总结与练习基本数据结构 栈队列链表与邻接表Hash字符串Tire二叉堆总结与练习搜索 树与图的遍历深度优先搜索剪枝迭代加深广度优先搜索广度变形A*IDA*总结与练习数学知识 质数约数同余矩阵乘法高斯消元与线性空…...
Chapter6.2:其他根轨迹及综合实例分析
该系列博客主要讲述Matlab软件在自动控制方面的应用,如无自动控制理论基础,请先学习自动控制系列博文,该系列博客不再详细讲解自动控制理论知识。 自动控制理论基础相关链接:https://blog.csdn.net/qq_39032096/category_10287468…...
3. 无重复字符的最长子串——滑动窗口
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 示例 2: 输入: s "bbbbb" 输出: 1 解释: 因为无…...
ChatGPT研究分享:机器第一次开始理解人类世界
0、为什么会对ChatGPT感兴趣一开始,我对ChatGPT是没什么关注的,无非就是有更大的数据集,完成了更大规模的计算,所以能够回答更多的问题。但后来了解到几个案例,开始觉得这个事情并不简单。我先分别列举出来,…...
可换皮肤的Qt登录界面
⭐️我叫忆_恒心,一名喜欢书写博客的在读研究生👨🎓。 如果觉得本文能帮到您,麻烦点个赞👍呗! 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧,喜欢的小伙伴给个三连支持一下呗。👍⭐️❤️ 可换皮肤的Qt登录界面 QSS的学习笔记 快…...
Spring的常见问题汇总
一、bean实例化1、构造方法底层是无参构造方法来new的对象。2、静态工厂实例化Bean实质上就是:创建一个静态工厂类,然后调用静态工厂类的静态方法,来创建对象。3、实例工厂与FactoryBean实质上就是:创建一个工厂类,工厂…...
yolov8训练筷子点数数据集
序言 yolov8发布这么久了,一直没有机会尝试一下,今天用之前自己制作的筷子点数数据集进行训练,并且记录一下使用过程以及一些常见的操作方式,供以后翻阅。 一、环境准备 yolov8的训练相对于之前的yolov5简单了很多,…...
使用 Python 从点云生成 3D 网格
从点云生成 3D 网格的最快方法 已经用 Python 编写了几个实现来从点云中获取网格。它们中的大多数的问题在于它们意味着设置许多难以调整的参数,尤其是在不是 3D 数据处理专家的情况下。在这个简短的指南中,我想展示从点云生成网格的最快和最简单的过程。…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
逻辑回归暴力训练预测金融欺诈
简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...
基于Java+VUE+MariaDB实现(Web)仿小米商城
仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意:运行前…...
数据结构:递归的种类(Types of Recursion)
目录 尾递归(Tail Recursion) 什么是 Loop(循环)? 复杂度分析 头递归(Head Recursion) 树形递归(Tree Recursion) 线性递归(Linear Recursion)…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现指南针功能
指南针功能是许多位置服务应用的基础功能之一。下面我将详细介绍如何在HarmonyOS 5中使用DevEco Studio实现指南针功能。 1. 开发环境准备 确保已安装DevEco Studio 3.1或更高版本确保项目使用的是HarmonyOS 5.0 SDK在项目的module.json5中配置必要的权限 2. 权限配置 在mo…...
TCP/IP 网络编程 | 服务端 客户端的封装
设计模式 文章目录 设计模式一、socket.h 接口(interface)二、socket.cpp 实现(implementation)三、server.cpp 使用封装(main 函数)四、client.cpp 使用封装(main 函数)五、退出方法…...
