GCC 拥塞控制算法
- 设计原理
- 整体目标
- 高效带宽利用
- 动态适配不同网络带宽,提高利用率
- 避免带宽浪费或不足
- 避免网络拥塞
- 防止数据包堆积导致网络性能下降
- 维持网络的稳定传输
- 保障低延迟和高质量通信
- 减少音视频卡顿和延迟
- 提升实时通信的用户体验
- 高效带宽利用
- 核心机制
- 基于延迟的拥塞控制
- 往返时延(RTT)概念
- 定义:数据包从发送端到接收端再返回发送端的时间
- 作用:反映网络的即时拥塞状况
- 延迟梯度计算
- 原理:相邻数据包的 RTT 差值
- 意义:判断网络延迟变化趋势
- 状态机与延迟关系
- Probing 状态
- 高延迟触发状态转换
- 若延迟大则进入 Decrease 状态
- Increase 状态
- 低延迟且稳定允许速率增加
- 延迟增大则考虑降速
- Decrease 状态
- 高延迟持续则持续降速
- 延迟降低可考虑状态转换
- Hold 状态
- 延迟波动小则维持速率
- 延迟突变触发状态转换
- Probing 状态
- 自适应阈值
- 根据网络环境动态调整
- 避免频繁误判和不必要的速率调整
- 往返时延(RTT)概念
- 基于丢包的拥塞控制
- 丢包率监测
- 统计一定时间内丢失的数据包比例
- 反映网络的可靠性
- 丢包率与速率调整
- 高丢包率触发速率降低
- 低丢包率允许速率增加或维持
- 丢包原因分析
- 网络拥塞导致的丢包
- 链路故障等其他原因
- 丢包率监测
- 接收端带宽估计
- 接收端估算方法
- 基于缓冲区占用情况
- 考虑解码能力和显示要求
- RTCP 反馈机制
- 反馈消息格式和内容
- 反馈周期和频率
- 发送端响应
- 根据反馈调整发送速率
- 与其他拥塞控制机制协同
- 接收端估算方法
- 基于延迟的拥塞控制
- 状态机模型
- Probing(探测)
- 触发条件
- 通信开始阶段
- 网络状况发生较大变化
- 操作
- 以较高速率发送数据包
- 收集网络带宽信息
- 触发条件
- Increase(增加)
- 触发条件
- 网络状况良好
- 无明显拥塞迹象
- 操作
- 逐步增加发送速率
- 逼近网络可用带宽
- 触发条件
- Decrease(降低)
- 触发条件
- 检测到网络拥塞
- RTT 增大、丢包率上升
- 操作
- 迅速降低发送速率
- 缓解网络拥塞
- 触发条件
- Hold(保持)
- 触发条件
- 发送速率调整后观察期
- 网络状况暂时稳定
- 操作
- 维持当前发送速率
- 等待网络进一步反馈
- 触发条件
- Probing(探测)
- 整体目标
- 代码逻辑(Native 层面)
- 初始化
- 创建 RTCPeerConnection
- 配置 ICE 服务器
- 设置连接选项
- 初始化 GCC 控制器参数
- 初始发送速率
- 状态机初始状态
- 创建 RTCPeerConnection
- 发送端逻辑
- 数据包发送
- 记录发送时间戳
- 使用高精度时钟
- 考虑系统时钟偏差
- 添加到 RTP 扩展头部
- 遵循 RTP 扩展规范
- 确保兼容性
- 记录发送时间戳
- 速率调整
- 定期根据反馈和网络状况调整
- 定时器设置和管理
- 避免频繁调整
- 调用 GCC 控制器调整方法
- 输入参数处理
- 输出结果应用
- 定期根据反馈和网络状况调整
- 数据包发送
- 接收端逻辑
- 数据包接收
- 记录接收时间戳
- 精确测量接收时刻
- 处理时钟同步问题
- 记录接收时间戳
- 反馈信息发送
- 计算 RTT、丢包率等
- 数据统计和分析方法
- 处理异常数据
- 估算接收端带宽
- 基于多种因素的算法
- 动态更新估算值
- 封装成 RTCP 消息反馈
- 消息格式和编码
- 错误处理和重传机制
- 计算 RTT、丢包率等
- 数据包接收
- 初始化