WebRTC Probe 探测码率、transport-cc作用

文章详细介绍了网络带宽探测的过程,包括ProbeBitrateEstimator如何利用RTCPFeedback的ACK应答来计算码率,ProbeController如何控制探测数据的发送,以及AcknowledgedBitrateEstimator如何基于ACK应答估计实际带宽。通过这些机制,系统能快速适应网络条件变化,实现高效的拥塞控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为什么需要探测带宽?
答:拥塞控制的AIMD算法,加法增加太慢了,网络很好的时候,需要很快探测到最大带宽。

一  ProbeBitrateEstimator

我看其它文章说,是根据RTCP Feedback transport-cc的ACK应答,来计算码率

具体说明下是怎么计算的,因为应答是不带长度的。

1 发送时,记录RTP包信息,比如发送时间,长度等,插入历史队列中。

2 收到应答,在历史队列中查找序列号,统计出相关的长度。

//根据RTCP Feedback transport中的ACK应答的序列号来计算的
absl::optional<DataRate> ProbeBitrateEstimator::HandleProbeAndEstimateBitrate(
    const PacketResult& packet_feedback) {

  ...
//packet_feedback.sent_packet.size怎么计算的
 cluster->size_total += packet_feedback.sent_packet.size; 
 ...
 DataSize send_size = cluster->size_total - cluster->size_last_send;
 DataRate send_rate = send_size / send_interval;
 ...
}
TransportFeedbackAdapter::AddPacket(...){
...
packet.sent.size = DataSize::Bytes(packet_info.length + overhead_bytes);
...
history_.insert(std::make_pair(packet.sent.sequence_number, packet));
}


std::vector<PacketResult>
TransportFeedbackAdapter::ProcessTransportFeedbackInner(
    const rtcp::TransportFeedback& feedback,
    Timestamp feedback_receive_time) {

for (const auto& packet : feedback.GetAllPackets()) {
    int64_t seq_num = seq_num_unwrapper_.Unwrap(packet.sequence_number());

    auto it = history_.find(seq_num);
    PacketFeedback packet_feedback = it->second;

      PacketResult result;
      result.sent_packet = packet_feedback.sent;
      result.receive_time = packet_feedback.receive_time;
      packet_result_vector.push_back(result);
}
return packet_result_vector;

}

absl::optional<DataRate> probe_bitrate =
      probe_bitrate_estimator_->FetchAndResetLastEstimatedBitrate();

二 ProbeController:探测控制

probe探测发送的数据:音视频rtp包数据,如果数据量不够,padding的数据。

GoogCcNetworkController::OnProcessInterval(
--| probe_controller_->Process(msg.at_time.ms());


probe_controller_->SetBitrates(
      min_data_rate_.bps(), GetBpsOrDefault(starting_rate_, -1),
      max_data_rate_.bps_or(-1), new_constraints.at_time.ms());


GoogCcNetworkController::MaybeTriggerOnNetworkChanged(
--| probe_controller_->SetEstimatedBitrate(
        loss_based_target_rate.bps(), at_time.ms());


ProbeController::InitiateExponentialProbing(...): 第一次是3倍, 第二次6倍。

 三  AcknowledgedBitrateEstimator:根据根据RTCP Feedback transport-cc的ACK应答,算吞吐量,即实际带宽。

class AcknowledgedBitrateEstimator
{
  std::unique_ptr<BitrateEstimator>   bitrate_estimator_;
}

// Computes a bayesian estimate of the throughput given acks containing
// the arrival time and payload size.
//基于贝叶斯估计,通过ack的到达时间和包体大小
class BitrateEstimator {
}


acknowledged_bitrate_estimator_->IncomingPacketFeedbackVector(
      report.SortedByReceiveTime());
  auto acknowledged_bitrate = acknowledged_bitrate_estimator_->bitrate();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值