Google Congestion Control 实现分析之二

Table of Contents

总体流程

当收到 Transport Wide CC RTCP report 时候 ,会回调 OnTransportPacketsFeedback 方法

s=>start
e=>end
s1=>operation: send rtp with TWCC header
s2=>operation: receive rtp packet
s3=>operation: compose TWCC feedback
s4=>operation: send rtcp packet
s5=>operation: receive rtcp packet
s6=>operation: parse rtcp packet
s7=>operation: bandwidth estimate
s8=>operation: adjust send bitrate

s->s1->s2->s3->s4->s5->s6->s7->s8->e

主要的逻辑在发送方

file

title WebRTC congestion control v1

participant RtpSender as sender
participant CongestionController as controller
participant TransportFeedbackAdpater as adapter
participant AcknowledgedBitrateEstimator as ack_estimator
participant ProbeController as probe_controller
participant DelayBasedBwe as delay_based_bwe
participant BitrateController as bitrate_controller

autonumber

->sender: ReceiveRtcp

alt RTCP of transport feedback
    sender->controller: OnTransportFeedback(feedback)
    controller->adapter: onTransportFeedback(feedback)
end

alt currently_in_alr
    controller->ack_estimator: SetAlrEndedTimeMs(now_ms)
    controller->probe_controller: SetAlrEndedTimeMs(now_ms)
end

controller->ack_estimator: IncomingPacketFeedbackVector(feedback_vector)
controller->ack_estimator: bitrate_bps()
controller->delay_based_bwe:IncomingPacketFeedbackVector(...)
delay_based_bwe-->controller: result

alt result.updated
    controller->bitrate_controller: OnDelayBasedBweResult(result)
    controller->controller: MaybeTriggerOnNetworkChanged()
end

alt result.recovered_from_overuse
    controller->probe_controller: RequestProbe()
end

alt in_cwnd_experiment
    controller->controller: LimitOutstandingBytes(adapter.GetOutstandingBytes())
end

1) 先算反馈确认的带宽 ack_bitrate

acknowledged_bitrate_estimator_->IncomingPacketFeedbackVector(packets);

2) 再算探测的带宽 probe_bitrate

probe_bitrate_estimator_->HandleProbeAndEstimateBitrate(packet);

3) 再算基于延迟的带宽 delay_based target_bitrate

NetworkControlUpdate GoogCcNetworkController::OnTransportPacketsFeedback(
    //...
    result = delay_based_bwe_->IncomingPacketFeedbackVector(
        report, acknowledged_bitrate, probe_bitrate, estimate_,
        alr_start_time.has_value());

}

4) 再计算基于丢包的带宽 loss_based target_bitrate

    if (result.updated) {
        if (result.probe) {
          bandwidth_estimation_->SetSendBitrate(result.target_bitrate,
                                                report.feedback_time);
        }
        // Since SetSendBitrate now resets the delay-based estimate, we have to
        // call UpdateDelayBasedEstimate after SetSendBitrate.
        bandwidth_estimation_->UpdateDelayBasedEstimate(report.feedback_time,
                                                        result.target_bitrate);
        // Update the estimate in the ProbeController, in case we want to probe.
        MaybeTriggerOnNetworkChanged(&update, report.feedback_time);
    }

注:

std::unique_ptr<SendSideBandwidthEstimation> bandwidth_estimation_;

1), 2) 主要是通过实际发送和接收的字节来计算流量,估算带宽
3) 通过看单向延迟梯度的变化来估算带宽, 综合考虑 1) 和 2)
4) 通过看丢包率来估算带宽, 也要综合考虑 3)

Delay

Comments |0|

Legend *) Required fields are marked
**) You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>
Category: WebRTC