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

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

        RobustThroughputEstimator在WebRTC中负责精确估计网络吞吐量,为拥塞控制提供关键数据支撑。它采用滑动窗口机制,基于ACKed数据包的发送/接收时间动态计算速率,通过双重验证(取发送/接收速率最小值)和抗干扰设计(去除最大时间间隙、乱序恢复)确保估计结果稳定可靠。该估计器能有效抵抗网络抖动和包乱序,在复杂网络环境下为码率自适应、带宽预测等核心功能提供准确的吞吐量参考,从而保障音视频传输的流畅性和质量。

一. 核心功能

RobustThroughputEstimator 是一个鲁棒吞吐量估计器,主要功能:

  • 基于ACKed数据包的发送/接收时间窗口计算网络吞吐量

  • 提供抗抖动和抗乱序的吞吐量估计

  • 同时考虑发送速率和接收速率,取最小值作为最终估计

  • 支持滑动窗口机制,自动淘汰过期数据

二. 核心算法原理

2.1 吞吐量计算原理

// 接收速率 = (总接收数据量 - 首个包数据量) / (调整后的接收时间窗口)
DataRate recv_rate = recv_size / recv_duration;// 发送速率 = (总发送数据量 - 末个包数据量) / 发送时间窗口  
DataRate send_rate = send_size / send_duration;// 最终吞吐量取两者最小值
return std::min(send_rate, recv_rate);

2.2 鲁棒性处理

  • 去除最大间隙:用第二大接收时间间隙替换最大间隙,避免突发延迟影响

  • 乱序检测:检测严重乱序情况并清空窗口重新开始

  • 权重调整:对未确认数据应用权重衰减

三. 关键数据结构

3.1 数据窗口 (std::deque<PacketResult> window_)

// 存储数据包反馈信息的双端队列
// 按接收时间排序,支持从两端快速插入删除
std::deque<PacketResult> window_;

3.2 配置参数 (RobustThroughputEstimatorSettings)

const RobustThroughputEstimatorSettings settings_;
// 包含:最大窗口包数、时间窗口范围、最小包数要求等

3.3 时间标记

Timestamp latest_discarded_send_time_;  // 最近丢弃包的发送时间

四. 核心方法详解

4.1 数据包处理入口

void IncomingPacketFeedbackVector(const std::vector<PacketResult>& packet_feedback_vector)

功能:处理传入的数据包反馈向量

  • 验证数据有效性(发送/接收时间)

  • 插入新包到窗口并维护接收时间顺序

  • 检测严重乱序情况(>1秒)并重置窗口

  • 淘汰过期数据包

4.2 窗口淘汰判断

bool FirstPacketOutsideWindow()

淘汰条件

  1. 窗口包数 > 最大包数限制

  2. 窗口时间跨度 > 最大时间窗口

  3. 包数 > 基础包数要求 且 时间 > 最小时间窗口

4.3 吞吐量计算

absl::optional<DataRate> bitrate() const

计算流程

  1. 基础验证:检查窗口数据是否足够

  2. 时间间隙分析:找出最大和次大接收时间间隙

  3. 数据统计:计算发送/接收时间范围和数据量

  4. 数据调整

    • 接收数据量减去首个包数据量

    • 发送数据量减去末个包数据量

    • 接收时间去除最大间隙

  5. 速率计算:分别计算发送速率和接收速率,取最小值

五. 设计亮点

5.1 双重速率限制

同时考虑发送端和接收端速率,避免单端测量误差:

// 防止接收端突发导致高估,也防止发送端突发导致低估
return std::min(send_size / send_duration, recv_size / recv_duration);

5.2 抗突发延迟机制

// 用第二大间隙替换最大间隙,抵抗瞬时网络抖动
TimeDelta recv_duration = (last_recv_time - first_recv_time) - largest_recv_gap + second_largest_recv_gap;

5.3 乱序恢复能力

检测到严重乱序时清空窗口,防止错误状态传播:

if (receive_delta > kMaxReorderingTime) {window_.clear();  // 重新开始估计
}

六. 典型工作流程

6.1 初始化阶段

// 创建估计器,加载配置参数
RobustThroughputEstimator estimator(settings);

6.2 数据更新阶段

// 定期接收数据包反馈
estimator.IncomingPacketFeedbackVector(packet_feedbacks);
// 内部自动维护滑动窗口,淘汰旧数据

6.3 吞吐量查询阶段

// 获取当前吞吐量估计
absl::optional<DataRate> throughput = estimator.bitrate();
if (throughput) {// 使用有效的吞吐量估计进行拥塞控制congestion_controller->OnThroughputEstimate(*throughput);
}

注释精要

// 鲁棒吞吐量估计器 - 核心设计思想:
// 1. 基于滑动窗口的实时吞吐量监测
// 2. 发送/接收双端验证,取保守估计值
// 3. 抗网络抖动和包乱序的鲁棒算法
// 4. 自适应窗口大小,平衡响应速度和稳定性// 适用场景:实时音视频传输、游戏流媒体等需要稳定吞吐量估计的网络应用
// 优势:在复杂网络环境下提供相对稳定的吞吐量估计,避免因瞬时波动导致的误判

这个估计器通过多层次的鲁棒性设计,在保证实时性的同时提供了相对稳定的吞吐量估计,特别适合在波动较大的无线网络环境中使用。

http://www.dtcms.com/a/464840.html

相关文章:

  • WPF依赖属性
  • 数据可视化 ECharts
  • javascript 性能优化实例一则
  • mapbox基础,使用矢量切片服务(pbf)加载line线图层
  • LLVM(Low Level Virtual Machine)介绍
  • Docker 一键部署指南:GitLab、Nacos、Redis、MySQL 与 MinIO 全解析
  • HDLBit 个人记录
  • 基于Jetson+FPGA+GMSL+AI的自动驾驶数据采集解决方案
  • 0006.C#学习笔记3-- HTML和CSS
  • 基于X86+FPGA+GPU的自动驾驶数据回灌测试解决方案
  • 在JavaScript / HTML中,Chrome报错Refused to execute inline script
  • 自动驾驶的“虚拟驾校”如何炼成?
  • 自动驾驶传感器数据录制过程中的五大系统性挑战
  • 学校网站建设开题报告书wordpress 发布说说
  • 企业如何减少由于数据不一致带来的运营成本?
  • 安卓开发APP应用程序和苹果iOS开发APP应用程序有什么区别?
  • Mac 上用 Homebrew 安装 JDK 8(适配 zsh 终端)完整教程
  • 利用小偷程序做网站企业网站开发建设
  • K8S基本命令操作
  • 【kubernetes/k8s源码分析】kube-controller-manager之node controller源码分析
  • SMOTE 算法详解:解决不平衡数据问题的有效工具
  • HGDB集群(安全版)repmgr手动切换主备库
  • 三维GIS数据转换指南:SHAPE文件到3DTiles的高效实现方案
  • K8S(三)—— 基于kubeadm 1.20版本部署Kubernetes集群与Harbor私有仓库实战
  • 宁波外贸网站制作公司手机网站建设哪家公司好
  • 【C语言实战(8)】C语言循环结构(do-while):解锁编程新境界
  • 面向Qt/C++开发工程师的Ai提示词(附Trae示例)
  • sqlite 使用: 01-源码编译与使用
  • Django视图进阶:快捷函数、装饰器与请求响应
  • 企业营销网站的建设网站开发响应式