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 直接组合 DelayBasedBwe、LossBasedBwe、ProbeBitrateEstimator、BitrateEstimator |
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_ms、reprobe_utilization_threshold) |
| ACK 吞吐估计 | BitrateEstimator(贝叶斯类实现) |
ThroughputEstimator,优化了贝叶斯方法 更快初始收敛 |
8.类型与对外接口
| 项目 | GCC | GCC++ |
|---|---|---|
| 反馈类型 | TransportPacketsFeedback + packet_feedbacks |
TransportFeedback + packets(命名与结构更统一) |
| 探测配置字段 | target_data_rate_bps、target_duration_ms、target_probe_count |
target_rate_bps、duration_ms、min_probes、min_bytes |
| 输出结果 | GccBweResult(含 stable_target_bitrate_bps 等) |
BweResult 含 controller_state、ack_bitrate_bps 等,便于观测管线状态 |
| 带宽使用枚举名 | kBwNormal / kBwUnderusing / kBwOverusing |
kNormal / kUnderusing / kOverusing(语义等价,命名更短) |
9.结果对比

从测试结果看gcc++算法估计的带宽更高,充分提高带宽利用率。收敛速度更快。
测试demo gcc++:
链接: https://pan.baidu.com/s/12-xdU1m33wUisHX44eotsg?pwd=pgq4 提取码: pgq4