本文主要探讨AimdRateControl.cc文件中的相关机制,这个Aimd就是加增乘减,就是通过之前得到的overuse,underuse,normal来得到接收端评估带宽,用来发送回给发送端,最后用来控制发送端实际发送码率。
更新input,包括
BandwidthUsage _bwState;//网络状态
uint32_t _incomingBitRate;//实际接收码率
double _noiseVar;//测量噪声方差
RateControlRegion AimdRateControl::Update(const RateControlInput* input,
int64_t now_ms)
{
assert(input);
// Set the initial bit rate value to what we're receiving the first half
// second.
if (!bitrate_is_initialized_) {
if (time_first_incoming_estimate_ < 0) {
if (input->_incomingBitRate > 0) {
time_first_incoming_estimate_ = now_ms;
}
} else if (now_ms - time_first_incoming_estimate_ > 500 &&
input->_incomingBitRate > 0) {
current_bitrate_bps_ = input->_incomingBitRate;
bitrate_is_initialized_ = true;
}
}
if (updated_ && current_input_._bwState == kBwOverusing) {
// Only update delay factor and incoming bit rate. We always want to react
// on an over-use.
current_input_._noiseVar = input->_noiseVar;
current_input_._incomingBitRate = input->_incomingBitRate;
} else {
updated_ = true;
current_input_ = *input;
}
return rate_control_region_;
}
状态转移,由卡尔曼滤波结果,得到的网络状态,进一步得到现在的码率控制状态,即保持,减少和增加。
一共维持三个状态,增长、保持、衰减,状态转换根据OveruseDetector的三个状态(Normal, Overuse, Underuse)来进行判断。
当Overuse发生时,无论什么状态都进入衰减。
当Underuse发生时,无论什么状态都进入保持状态。
在保持和增长阶段,Normal状态将保持继续增长。
在衰减阶段,Normal状态会将状态拉回保持状态。
void AimdRateControl::ChangeState(const RateControlInput& input,
int64_t now_ms)
{
switch (current_input_._bwState)
{
case kBwNormal:
if (rate_control_state_ == kRcHold) {
time_last_bitrate_change_ = now_ms;
ChangeState(kRcIncrease);
}
break;
case kBwOverusing:
if (rate_control_state_ != kRcDecrease) {
time_last_bitrate_change_ = now_ms;
ChangeState(kRcDecrease);
}
break;
case kBwUnderusing:
time_last_bitrate_change_ = now_ms;
ChangeState(kRcHold);
break;
default:
assert(false);
}
}
参考文献:
[1] http://blog.csdn.net/MeRcy_PM/article/details/72629384