采用兩種在因特網(wǎng)上做實時通信的擁塞控制方法,基于延遲的控制和基于丟包的控制。
基于丟包的控制器:需要測量丟包率,測量往返時間rtt和REMB(Receiver Estimated Max Bitrate,最大接收帶寬估計),計算目標(biāo)發(fā)送比特率。
基于延遲的控制器:或者在RTP接收端解析包到達(dá)信息,或在RTP發(fā)送端處從接收到的反饋信息中,計算最大比特率,并傳給丟包控制器。
基于丟包的控制器和基于延遲的控制器二者共同完成了擁塞控制算法。
兩個控制器都運行在發(fā)送端可以通過包反饋協(xié)議來實現(xiàn)。RTP接收器會記錄每一個收到包的到達(dá)時間和傳輸層的序列號,這些信息會使用傳輸層反饋消息周期性的發(fā)回發(fā)送端。建議反饋間隔是每收到一個視頻幀一次,或?qū)τ谝纛l流或多媒體流,至少每隔30ms一次。如果反饋開銷需要限制,間隔可以增加到100ms。
當(dāng)媒體編碼器生成完數(shù)據(jù),會傳給節(jié)奏隊列,節(jié)奏器每隔突發(fā)時間間隔發(fā)送一組包到網(wǎng)絡(luò)。建議突發(fā)時間為5ms,一組包的尺寸是目標(biāo)比特率和突發(fā)時間的乘積。
1. 基于延遲的控制器
算法可以進(jìn)一步分為4個部分:預(yù)濾波,到達(dá)時間濾波器,過度使用檢測器和碼率控制器。
1.1 預(yù)濾波
預(yù)濾波將合并突發(fā)到達(dá)的包組,如果下面兩個條件滿足包組會合并為同一個包組。
在突發(fā)時間間隔內(nèi)發(fā)送的一個序列包組成一個包組。
一個包的inter-arrival時間低于burst_time,inter-group延遲變量d(i)低于0被認(rèn)為是當(dāng)前包組的一部分。
1.2 到達(dá)時間模型
定義inter-arrival時間,t(i) - t(i-1),為兩個包組到達(dá)時間差。相應(yīng)的,inter-departure時間,T(i) - T(i-1),定義為兩個包組起程的時間差。最后,inter-group間延遲變量,d(i),定義為二者之差?;蚪忉尀榘Mi和包組i-1傳輸時間差。
d(i) = t(i) - t(i-1) - (T(i) - T(i-1))
d(i) = m(i) + v(i)
m(i)是均值,噪聲項v(i)代表未被模型抓到的網(wǎng)絡(luò)抖動和其他延遲效應(yīng)。
1.3 到達(dá)時間濾波
我們想估計包組間延遲變量的平均值m(i),用以檢測鏈路是否過載,之前使用kalman濾波器來估計。
基本原理是:
接收器會得到一個包組間延遲的測量值e,該值是隨機變量,標(biāo)準(zhǔn)差是v
同時根據(jù)以往的延遲變量的歷史值也可以得到一個當(dāng)前延遲變量的預(yù)測值z,它也是隨機變量,標(biāo)準(zhǔn)差是q
因為兩個值都是不確定的,kalman濾波器使用了一個協(xié)方差來取兩個值的平均:

然后最佳估計就是:

最新版本采用趨勢線擬合法:
現(xiàn)在的碼控使用指數(shù)滑動平均來統(tǒng)計包組延遲變量的平均值。
假設(shè)我們與一串時間序列
{a1,a2,a3,...,at?1,at,...}
那么,這串時間序列的指數(shù)滑動平均值就是:
mvt=decay?mvt?1+(1?decay)?at
這是一個滑動窗口,mvt的值只和這個窗口內(nèi)的 ai 有關(guān)
1.4 over-use detector
到達(dá)時間濾波器的輸出,包組間延遲變量估計值m(i),會與一個閾值del_var_th(i)進(jìn)行比較。高于閾值會被認(rèn)為是過度使用。
over-use: m(i) > del_var_th(i)
under_use: m(i) < -del_var_th(i)
normal:?-del_var_th(i) < m(i) <?del_var_th(i)
閾值del_var_th對于算法的活力和性能有顯著影響。
如果使用固定閾值,算法的流控制將使鏈路很快陷于饑餓狀態(tài)。
有必要動態(tài)調(diào)整閾值以在大部分場景中獲得一個好的性能。
算法根據(jù)下述函數(shù)動態(tài)改變閾值:
del_var_th(i) =del_var_th(i-1) + (t(i)-t(i-1)) *Kg(i) * (|m(i)|-del_var_th(i-1))
當(dāng)m(i)離開范圍[-del_var_th(i-1),del_var_th(i-1)]時,閾值會增加,當(dāng)回到范圍時,閾值會減少。以此來避免上述問題的產(chǎn)生。
1.5 碼率控制器
碼率控制子系統(tǒng)有三個狀態(tài):增加,降低,保持。增加是在沒有檢測到擁塞時的狀態(tài);降低是檢測到擁塞的狀態(tài);保持是在進(jìn)入增加狀態(tài)前等待隊列排空的狀態(tài)。
輸出一個更新的可用帶寬估計A_hat
狀態(tài)機(空白表示保持在當(dāng)前狀態(tài))

R_hat(i)是基于延遲的控制器在T秒窗口測得的輸入比特率。
R_hat(i) = 1/T * sum(L(j)) for j from 1 to N(i)
N(i)是過去T秒收到的包數(shù),L(j)是數(shù)據(jù)包j的負(fù)載尺寸。窗口推薦為0.5到1秒。
A_hat(i) = beta * R_hat(i)
beta典型的選擇值處于[0.8, 0.95]的范圍,推薦是0.85.
在乘性增過程,估計帶寬最多按每秒8%遞增
eta = 1.08^min(time_since_last_update_ms / 1000, 1.0)
A_hat(i) = eta * A_hat(i-1)
在加性遞增過程,估計按每反饋時間間隔增加最多半個包尺寸。
過載后,系統(tǒng)轉(zhuǎn)入降低狀態(tài),帶寬乘性遞減的比率beta:
A_hat(i) = beta * R_hat(i)
2. 基于丟包的控制器
基于丟包的控制器的輸入是往返時間,丟失的包,和從基于延遲的控制器發(fā)來的可用帶寬估計A_hat?;趤G包的控制器計算得到的可用帶寬估計表示為As_hat。
丟包率在2-10%,發(fā)端可用帶寬估計As_hat(i)保持不變。
丟包率超過10%,新的帶寬估計會被計算出來As_hat(i) = As_hat(i-1)(1-0.5p)。p是丟包率。
低于2%的包丟失,As_hat(i)會增加:As_hat(i) = 1.05(As_hat(i-1))
基于丟包的帶寬估計As_hat與基于延遲的帶寬估計A_hat做對比。實際發(fā)送碼率設(shè)置為他們的最小值。