当前位置: 首页 > news >正文

webrtc弱网-AlrDetector类源码分析与算法原理

       AlrDetector(应用受限区域检测器)是WebRTC中用于检测发送端是否处于应用层限速状态的核心组件。它通过维护一个基于时间间隔的预算系统,监控实际发送数据量与网络容量之间的关系。当发送速率持续低于网络容量的设定比例(如65%)时,判定进入ALR状态;当发送速率恢复时退出该状态。该检测为拥塞控制算法提供关键状态信号,帮助区分网络拥塞和应用层限速,从而优化带宽估计和速率调整策略。

一、核心功能

AlrDetector(Application Limited Region Detector)用于检测是否处于应用受限区域(Application Limited Region, ALR)。当应用程序发送数据的速度低于网络容量时,就处于 ALR 状态。该检测器通过监控发送字节数和时间间隔,结合当前估计的带宽,判断是否进入或退出 ALR 状态。


二、核心算法原理

  1. 基于预算的比例判断
    • 使用 IntervalBudget 来模拟一个“发送预算”。

    • 预算随时间的推移而增加(按目标带宽比例),随数据发送而减少。

    • 当预算比例超过 start_budget_level_ratio 时,判定进入 ALR;

    • 当预算比例低于 stop_budget_level_ratio 时,判定退出 ALR。

  2. 带宽使用率控制
    • 使用 bandwidth_usage_ratio(默认 0.65)来设定目标发送速率(即估计带宽的 65%),避免过于激进地判断 ALR。


三、关键数据结构

1. AlrDetectorConfig
struct AlrDetectorConfig {double bandwidth_usage_ratio = 0.65;  // 带宽使用比例double start_budget_level_ratio = 0.80; // 开始ALR的预算比例阈值double stop_budget_level_ratio = 0.50;  // 结束ALR的预算比例阈值std::unique_ptr<StructParametersParser> Parser();
};
2. AlrDetector 类成员
class AlrDetector {private:const AlrDetectorConfig conf_;          // 配置参数absl::optional<int64_t> last_send_time_ms_; // 上次发送时间IntervalBudget alr_budget_;             // 间隔预算器absl::optional<int64_t> alr_started_time_ms_; // ALR开始时间(若存在则表示处于ALR)RtcEventLog* event_log_;                // 事件日志(可选)
};

四、核心方法详解

1. 构造函数
AlrDetector::AlrDetector(AlrDetectorConfig config, RtcEventLog* event_log): conf_(config), alr_budget_(0, true), event_log_(event_log) {}
  • 初始化配置和 IntervalBudget,初始预算为0,启用“可变目标模式”。

2. OnBytesSent
void AlrDetector::OnBytesSent(size_t bytes_sent, int64_t send_time_ms) {if (!last_send_time_ms_.has_value()) {last_send_time_ms_ = send_time_ms;return;}int64_t delta_time_ms = send_time_ms - *last_send_time_ms_;last_send_time_ms_ = send_time_ms;alr_budget_.UseBudget(bytes_sent);          // 使用预算(发送数据)alr_budget_.IncreaseBudget(delta_time_ms);  // 增加预算(随时间)bool state_changed = false;if (alr_budget_.budget_ratio() > conf_.start_budget_level_ratio &&!alr_started_time_ms_) {alr_started_time_ms_.emplace(rtc::TimeMillis()); // 进入ALRstate_changed = true;} else if (alr_budget_.budget_ratio() < conf_.stop_budget_level_ratio &&alr_started_time_ms_) {state_changed = true;alr_started_time_ms_.reset(); // 退出ALR}if (event_log_ && state_changed) {event_log_->Log(std::make_unique<RtcEventAlrState>(alr_started_time_ms_.has_value()));}
}
  • 每次发送数据时调用,更新预算并判断ALR状态变化。

  • 记录状态变化事件(如启用了事件日志)。

3. SetEstimatedBitrate
void AlrDetector::SetEstimatedBitrate(int bitrate_bps) {RTC_DCHECK(bitrate_bps);int target_rate_kbps = static_cast<double>(bitrate_bps) * conf_.bandwidth_usage_ratio / 1000;alr_budget_.set_target_rate_kbps(target_rate_kbps);
}
  • 根据当前估计带宽设置 IntervalBudget 的目标速率(按比例缩放)。

4. GetApplicationLimitedRegionStartTime
absl::optional<int64_t> AlrDetector::GetApplicationLimitedRegionStartTime() const {return alr_started_time_ms_;
}
  • 返回当前ALR状态的开始时间(若存在则表示正处于ALR)。


五、设计亮点

  1. 灵活配置:支持通过字段试验(Field Trials)动态调整参数,适应不同网络环境和应用场景。

  2. 事件日志:可记录ALR状态变化事件,便于后续分析和调试。

  3. 预算比例判断:使用相对比例而非绝对值,更具适应性和鲁棒性。

  4. 轻量级设计:仅依赖时间戳和字节数,无需复杂计算,适合实时系统。


六、典型工作流程

  1. 初始化:构造 AlrDetector,设置初始带宽(通常为0,后续通过 SetEstimatedBitrate 设置)。

  2. 发送数据:每次发送数据包后调用 OnBytesSent,更新预算并判断ALR状态。

  3. 带宽更新:当网络带宽估计更新时,调用 SetEstimatedBitrate 调整目标速率。

  4. 状态查询:通过 GetApplicationLimitedRegionStartTime 获取当前是否处于ALR及其开始时间。

  5. 事件记录:若状态变化且启用了事件日志,则记录 RtcEventAlrState 事件。

七、整体流程图

处理发送数据 (OnBytesSent) 流程

检查预算比例并更新ALR状态流程


文章转载自:

http://O1Wb3e7t.hnrpk.cn
http://LXFO5AMH.hnrpk.cn
http://NPM8KpKE.hnrpk.cn
http://gIrCGRHN.hnrpk.cn
http://fY1A3VLg.hnrpk.cn
http://PUBrtvz6.hnrpk.cn
http://QQ6sFrFL.hnrpk.cn
http://Oqp0XLKu.hnrpk.cn
http://HKfkyRyi.hnrpk.cn
http://mZrZkC6E.hnrpk.cn
http://u38mzwF6.hnrpk.cn
http://vFRliBWF.hnrpk.cn
http://rFxCvh70.hnrpk.cn
http://XVXt4hHt.hnrpk.cn
http://XizUzwDO.hnrpk.cn
http://wDOwR9IK.hnrpk.cn
http://5UF2kTml.hnrpk.cn
http://MlmNPD5Y.hnrpk.cn
http://1a3JyxMc.hnrpk.cn
http://z2rh7Vk1.hnrpk.cn
http://EDlzZGyZ.hnrpk.cn
http://vs6Xchkg.hnrpk.cn
http://SVCVDEOs.hnrpk.cn
http://rsJO46pg.hnrpk.cn
http://oMUMvorq.hnrpk.cn
http://sJZmHRpV.hnrpk.cn
http://NBJWnGzD.hnrpk.cn
http://IHqNRb9W.hnrpk.cn
http://076XnlOm.hnrpk.cn
http://XOz7KJEw.hnrpk.cn
http://www.dtcms.com/a/379919.html

相关文章:

  • 鸿蒙Next Web渲染与布局详解:深入理解自适应布局与渲染模式
  • 猿辅导前端面试题及参考答案
  • 鸿蒙NEXT Web组件与JavaScript交互:打通原生与前端的桥梁
  • C#高并发与并行理解处理
  • 终端之外:解锁Linux命令行的魔法与力量
  • wav2vec微调进行疾病语音分类任务
  • 【.Net技术栈梳理】10-.NET Core 程序的执行
  • 【完整源码+数据集+部署教程】仓库物品分类检测图像分割系统源码和数据集:改进yolo11-convnextv2
  • 软件定义汽车(SDV)与区域电子电气架构(Zonal EEA)的技术革新
  • R语言:数据读取与重构、试验设计(RCB/BIB/正交/析因)、ggplot2高级绘图与统计检验(t检验/方差分析/PCA/聚类)
  • ffmpeg切割音频
  • 【论文笔记】RadarOcc: Robust 3D Occupancy Prediction with 4D Imaging Radar
  • 【Axios 教程】从入门到高级
  • 数据库重演Real Application Testing: Database Capture FAQ (Doc ID 1920275.1)
  • 一个海康相机OCR的程序
  • 蚂蚁 S19 Pro+ Hyd 191T:高效能矿机解析与性能评测
  • C++并发编程:std::thread右值形式传参解析
  • 判断子序列
  • 鸿蒙数据安全实战:从 AES 到 RSA 的加密解密全流程解析
  • Python与MiniKanren:逻辑编程的艺术与科学
  • DeviceNet 转 EtherCAT:发那科焊接机器人与倍福 CX5140 在汽车焊装线的高速数据同步通讯配置案例
  • J002 Vue+SpringBoot电影推荐可视化系统|双协同过滤推荐算法评论情感分析spark数据分析|配套文档1.34万字
  • 连续hash函数
  • 七彩喜智慧养老:用科技温暖晚年,让关爱永不掉线
  • C++微基础蓝桥杯之旅9.9-9.12
  • 一款好看的jQuery前端框架-HisUI
  • Go语言io.Copy深度解析:高效数据复制的终极指南
  • k8s-init容器学习
  • 【算法磨剑:用 C++ 思考的艺术・Dijkstra 实战】弱化版 vs 标准版模板,洛谷 P3371/P4779 双题精讲
  • Java大厂面试实录:产业互联网大数据与AI服务场景下的微服务与智能搜索(含详细解读)