带宽估计算法(gcc++)架构设计及优化

gcc++带宽估计算法设计的主要灵感来自webrtc gcc算法。完全c++实现,脱离webrtc框架可以独立运行。webrtc gcc算法脱离webrtc框架没办法独立运行,强依赖webrtc,这对于不使用webrtc框架的rtc场景,是非常大的痛点。

1.架构

对比webrtc gcc算法的架构,gcc++整个架构简洁清晰。

2.数据流转

3.状态机转换

4. 架构总结表

模块 类名 职责 相比 GCC 的改进
公共API GccppController 薄门面层,委托所有逻辑给 Orchestrator 更清晰的接口隔离
管线协调 Orchestrator 轻量事件管线,替代"上帝控制器"模式 明确的 5 步处理管线
状态机 StateMachine 形式化 FSM(5 状态),替代分散的布尔标志 新增 Startup/Probing/Recovery 状态
到达间隔 InterArrival 按发送时间分组,计算发送/接收时间差 可配置分组长度
延迟检测 DelayDetector 趋势线估计 + 自适应阈值 + 过载检测 窗口更小(15 vs 20)、阈值更低(10 vs 12.5)、响应更快
速率控制 RateController 增强 AIMD:区分 Startup 和 Steady 行为 更快乘性增(1.12 vs 1.08)、更少回退(0.88 vs 0.85)
链路容量 LinkCapacity 跟踪链路容量估计(均值+偏差) 集成到 RateController 中
丢包分析 LossAnalyzer EWMA 丢包率跟踪 + 突发检测 区分随机丢包与拥塞丢包,随机丢包不触发降速
吞吐估计 ThroughputEstimator 贝叶斯方法估计 ACK 吞吐量 更快的初始收敛
探测管理 ProbeManager 3 阶段初始探测 + 周期性重探 探测更激进(3x,6x,10x vs 3x,6x),低利用率时自动重探
配置中心 Config 所有可调参数集中管理 + 校验 集中式配置,替代分散的硬编码常量

5.新老算法架构与职责

维度 webrtc_gcc(GCC) webrtc_gcc++(GCC++)
顶层结构 GccController 直接组合 DelayBasedBweLossBasedBweProbeBitrateEstimatorBitrateEstimator GccppController 为薄门面,全部逻辑委托给 Orchestrator
控制流 逻辑分散在控制器与各子模块回调中 Orchestrator 显式管线:RTT → ACK 吞吐 → 延迟估计 → 丢包 → 最终码率
控制器状态 无统一的顶层 FSM(主要靠 AIMD 与检测器状态) StateMachine + ControllerState:Startup / Probing / Steady / Draining / Recovery
配置 GccConfig 仅 start/min/max Config 集中:延迟检测、AIMD、丢包、探测、状态机时长等均可调,且带 Validate()

6.算法与参数层面的改进(GCC++ 相对 GCC)

改进项 GCC(本仓库实现) GCC++
趋势线窗口 TrendlineEstimator 默认 20 个包 DelayDetector 默认 trendline_window_size = 15(注释写明更敏感)
初始延迟阈值 threshold_ = 12.5 initial_threshold = 10.0(更早感知过载趋势)
过载持续时间门限 kOverUsingTimeThreshold = 10 ms overuse_time_threshold_ms = 8.0
最小 delta 样本数 kMinNumDeltas = 60 min_num_deltas = 40(更快进入稳定检测)
阈值自适应 k_up / k_down 0.0087 / 0.039 0.01 / 0.04(略快调整自适应阈值)
乘性回退系数 beta 0.85(AimdRateControl 0.88(backoff_factor,回退略温和)
稳态乘性增 alpha = 1.08 multiplicative_factor = 1.12
启动阶段增窗 与稳态共用 1.08 startup_multiplicative_factor = 1.25(启动爬升更快)
AIMD 与启动 Update 无独立的 in_startup 分支(与本仓库 GCC 一致为经典 AIMD) RateController::Update(..., in_startup),与 StateMachine 联动区分启动/稳态

7.丢包、探测与吞吐估计

改进项 GCC GCC++
丢包表征 LossBasedBwe:经典 2%/10% 阈值 + fraction_loss 为 uint8(0--255) 风格 LossAnalyzer:EWMA 平滑丢包率(loss_ewma_alpha),突发检测(LossEvent 历史),意图区分随机丢包与拥塞
初始探测 GetProbes 仅两档:3×、6× 起始码率 ProbeManager:三档 3×、6×、10×,并带 MaybeCreateReprobe
周期性再探测 本仓库 GccController::GetProbes 初始探测后返回空 低利用率时按间隔重探(reprobe_interval_msreprobe_utilization_threshold
ACK 吞吐估计 BitrateEstimator(贝叶斯类实现) ThroughputEstimator,优化了贝叶斯方法 更快初始收敛

8.类型与对外接口

项目 GCC GCC++
反馈类型 TransportPacketsFeedback + packet_feedbacks TransportFeedback + packets(命名与结构更统一)
探测配置字段 target_data_rate_bpstarget_duration_mstarget_probe_count target_rate_bpsduration_msmin_probesmin_bytes
输出结果 GccBweResult(含 stable_target_bitrate_bps 等) BweResultcontroller_stateack_bitrate_bps 等,便于观测管线状态
带宽使用枚举名 kBwNormal / kBwUnderusing / kBwOverusing kNormal / kUnderusing / kOverusing(语义等价,命名更短)

9.结果对比

从测试结果看gcc++算法估计的带宽更高,充分提高带宽利用率。收敛速度更快。

测试demo gcc++:

链接: https://pan.baidu.com/s/12-xdU1m33wUisHX44eotsg?pwd=pgq4 提取码: pgq4

相关推荐
Kk.08021 天前
项目《基于Linux下的mybash命令解释器》(一)
前端·javascript·算法
zhgjx-dengkewen1 天前
eNSP实验:配置NAT Server
服务器·网络·华为·智能路由器
SteveSenna1 天前
Trossen Arm MuJoCo自定义1:改变目标物体
人工智能·学习·算法·机器人
添砖java‘’1 天前
NAT代理、内网打洞和内网穿透
linux·服务器·网络
yong99901 天前
IHAOAVOA:天鹰优化算法与非洲秃鹫优化算法的混合算法(Matlab实现)
开发语言·算法·matlab
Once_day1 天前
网络以太网之(3)LLDP协议
网络·以太网·lldp
m0_738120721 天前
渗透测试基础ctfshow——Web应用安全与防护(五)
前端·网络·数据库·windows·python·sql·安全
米粒11 天前
力扣算法刷题 Day 42(股票问题总结)
算法·leetcode·职场和发展
其实防守也摸鱼1 天前
XSS漏洞全景解析:从原理、实战利用到纵深防御
前端·网络·安全·xss·xss漏洞
路由侠内网穿透.1 天前
本地部署开源客服系统 FreeScout 并实现外部访问( Windows 版本)
运维·服务器·网络·windows·网络协议