1. 程式人生 > >WebRTC GCC演算法介紹

WebRTC GCC演算法介紹

雖然視訊會議已商用了多年,特別是SKYPE這樣的視訊應用在網際網路上已有10年時間,但針對實時音視流高效傳輸的內部控制標準卻是空白。所以標準化組織IETFW3C準備解決這個問題(2011-2013年)。

IETFRTCWeb 想法是把用於實時媒體流的網路擁塞控制演算法標準化成協議。 W3CWebRTC想法是標準化一套HTML5API用於網路瀏覽器的實時流媒體。

CISCOIETF提出NADA(NetworkAssisted Dynamic Adaptation)演算法,但目前還沒給出實現。

Ericsson也向IETF提出SCReAM(Self-ClockedRate Adaptation for Multimedia)

Scream的目標網路偏向無線網LTE 3G 4G

GoogleIETF提出的是GCC(Google Congestion Contrl)

本次要介紹的是Google Congestion Contrl

01

GCC是什麼?

GCCGoogle 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中基於丟包的預測值不應大於基於時延的預測,也不應小於基於TFRCrfc3448)的預測。

07

參考

https://tools.ietf.org/html/draft-ietf-rmcat-gcc-00#page-10

https://tools.ietf.org/html/rfc3448