WebRTC GCC演算法介紹
雖然視訊會議已商用了多年,特別是SKYPE這樣的視訊應用在網際網路上已有10年時間,但針對實時音視流高效傳輸的內部控制標準卻是空白。所以標準化組織IETF和W3C準備解決這個問題(2011-2013年)。
IETF的RTCWeb 想法是把用於實時媒體流的網路擁塞控制演算法標準化成協議。 W3C的WebRTC想法是標準化一套HTML5的API用於網路瀏覽器的實時流媒體。
CISCO向IETF提出NADA(NetworkAssisted Dynamic Adaptation)演算法,但目前還沒給出實現。
Ericsson也向IETF提出SCReAM(Self-ClockedRate Adaptation for Multimedia)。
Google向IETF提出的是GCC(Google Congestion Contrl)。
本次要介紹的是Google Congestion Contrl。
01
GCC是什麼?
GCC是Google CongestionContrl的縮寫,用於實時媒體通訊的網路擁塞控制演算法。不是C/C++的編譯工具。
GCC基於UDP,它已實現於開源軟體WebRTC專案,也整合到M23後的chrome版本,同時應用在GoogleHangouts應用中。
實時媒體通訊的網路擁塞控制有三個難點:
1.媒體信源不能立刻按要求調整成指定的頻寬,通常媒體信源的變化是不連續甚至是跳變的,變化的幅度也大;
2.即使網路擁塞已經被發現,參與的兩端也不確定要如何反應,減少頻寬不一定是正確的做法;
3.越是壓縮率高的編碼器越對網路丟包敏感,但網路實時性的要求基本要排除丟包重傳的使用。
業界對媒體流的網路擁塞演算法已有標準並開放,主要方法是基於速率的控制,通過平滑視窗的演算法實現平滑的資料傳送,如TFRC(TCP Friendly Rate Control)和RAP(Rate AdaptiveProtocol)。
TCP偏向使用基於丟包率來感知網路擁塞,當網路裝置因為擁堵引入佇列時,沒有丟包但要求實時性的雙向媒體傳輸是不能接受的。另一種是基於時延的方法感知網路擁塞,業界對哪種方案更優一直在爭議。
GCC使用兩種擁塞控制的演算法來應對共享頻寬網路的擁塞控制。
02
基於時延的網路擁塞控制
GCC裡基於時延的網路擁塞控制由三部分組成:
1. 到達時間濾波器arrival-timefilter ;
2.過載檢查器over-usedetector;
3.速率控制器rate controller。
GCC中使用包間間隔時間為度量,可以是兩個網路包間也可以是兩組包間的間隔。
d(i) = t(i) - t(i-1) - (T(i) - T(i-1))
d(i)表示時延,t(i) - t(i-1)是到達時間,T(i) -T(i-1)是傳送時間。
一列資料包短時間裡連續傳送,這段時間稱為突發時間,建議突發時間為5ms。不建議在突發時間內的包間隔時間做度量,而是把它們做為一組來測量。這種組包傳送的形式在WI-FI和無線網路裡常常這麼用。
T(i)用到達包裡的時間戳,或一組到達網路包最後一包的時間戳。如到達包有亂序則不採用其資料。
當我們把定義傳送時間一組長度為L的資料包通過能力為C的通道。
ts = L/C於是我們建模有
d(i) = dL(i)/C(i) + w(i)
= dL(i)/C(i) + m(i) + v(i)
w(i)是隨機函式W的訊號量,它的輸入因子有吞吐能力C(i),當前網路阻塞情況,當前速率。在這種模型中我們認為輸吞吐能力C比其它引數相對穩定,接近常數或變化緩慢。
我們再把w(i)建模成白色高斯過程,於是當對通道過載使用時,w(i)會增加,當通道通過資料量減少時,w(i)會減少,其他情況w(i)為0。
從這個模型我們可知,傳輸的資料量越大所要的時間越長需要相對時延也更大。而網路抖動和其他影響時延的因素不被採集和考慮。
因為d(i)和dL(i)是簡單可測量的,那麼通過w(i)預測C(i)可用一個自適應濾波器來實現,如使用卡爾曼濾波器Kalman filter。
03
卡爾曼濾波
資料濾波是去除噪聲還原真實資料的一種資料處理技術。
卡爾曼Kalman濾波在測量方差已知的情況下能夠從一系列存在測量噪聲的資料中,估計動態系統的狀態,由於它便於計算機程式設計實現, 並能夠對現場採集的資料進行實時的更新和處理, Kalman濾波是目前應用最為廣泛的濾波方法。
卡爾曼濾波是一種利用線性系統狀態方程,通過系統輸入輸出觀測資料,對系統狀態進行最優估計的演算法。由於觀測資料中包括系統中的噪聲和干擾的影響,所以最優估計也可看作是濾波過程。
卡爾曼濾波不要求訊號和噪聲都是平穩過程的假設條件。對於每個時刻的系統擾動和觀測誤差(即噪聲),只要對它們的統計性質作某些適當的假定,通過對含有噪聲的觀測訊號進行處理,就能在平均的意義上,求得誤差為最小的真實訊號的估計值。
假設狀態空間的n-1時刻估計值和觀測空間的n時刻測量值都滿足獨立高斯分佈,Kalman濾波器就是通過高斯分佈的乘積運算將估計值和測量值結合,獲得最接近真值的n時刻估計。高斯分佈乘積運算的結果仍為高斯分佈,高斯分佈的均值對應n時刻的估計值,高斯分佈的方差對應n時刻的均方誤差。
04
過載探測器
d(i) = dL(i)/C(i) + m(i) + v(i)
m(i)是從濾波器獲取到的預測值,當預測值高於閥值gamma_1(i)則過載探測器發出過載訊號給速率控制器。附加條件有這個過載狀態需要持續gamma_2毫秒時間。如果m(i)小於m(i-1),即使高於閥值也不需要發出過載訊號。相對應的負數區間也是如此,如m(i)小於-gamma_1(i)時,過載被發現。
所以閥值gamma_1對演算法的影響很大。如果是gamma_1是靜態值會導致一系列問題,所以gamma_1需要動態調整來達到良好的表現。公式如下:
gamma_1(i) = gamma_1(i-1) + (t(i)-t(i-1)) * K(i) * (|m(i)|-gamma_1(i-1))
當m(i)超過[-gamma_1(i-1),gamma_1(i-1)]時增加gamma_1(i),而當m(i)落入[-gamma_1(i-1),gamma_1(i-1)]區間時減少gamma_1(i)。當|m(i)| -gamma_1(i) > 15,建議gamma_1(i)不更新。K(i)為更新系數。
同時建議gamma_1(i)控制在[6,600]區間。太小的值會導致探測器過於敏感。建議增加係數要大於減少係數K_u > K_d。
其實建議值如下:
gamma_1(0) = 12.5 ms
gamma_2 = 10 ms
K_u = 0.01
K_d = 0.00018
05
速率控制器
速率控制器由兩個控制器組成,一個是基於時延的預測控制,另一個是基於丟包的的預測控制。控制器內部置狀態機,結合過載探測器進行狀態的切換。
06
基於丟包的控制
前面介紹基於時延的控制是有一個假設前提,即傳輸通道的緩衝足夠大。當傳輸通道的緩衝很小時,通過時延是觀測不到過載狀態的,這時需要丟包率來表示過載。
-
當接收側感知到2-10%丟包率,傳送端的預測值不變。
-
當實際丟包率超過預測值10%時,新的預測值可更新為As_hat(i)= As_hat(i-1)(1-0.5p),其中p為丟包率。
-
當實際丟包率小於2%時預測時可更新為As_hat(i)= 1.05(As_hat(i-1)),其中p為丟包率。
在GCC中基於丟包的預測值不應大於基於時延的預測,也不應小於基於TFRC(rfc3448)的預測。
07
參考
https://tools.ietf.org/html/draft-ietf-rmcat-gcc-00#page-10
https://tools.ietf.org/html/rfc3448