WebRTC基于GCC的擁塞控制(上) - 算法分析

實(shí)時(shí)流媒體應(yīng)用的最大特點(diǎn)是實(shí)時(shí)性坦敌,而延遲是實(shí)時(shí)性的最大敵人酵镜。從媒體收發(fā)端來講隘擎,媒體數(shù)據(jù)的處理速度是造成延遲的重要原因殴穴;而從傳輸角度來講,網(wǎng)絡(luò)擁塞則是造成延遲的最主要原因货葬。網(wǎng)絡(luò)擁塞可能造成數(shù)據(jù)包丟失采幌,也可能造成數(shù)據(jù)傳輸時(shí)間變長,延遲增大宝惰。</br>

擁塞控制是實(shí)時(shí)流媒體應(yīng)用質(zhì)量保證(QoS)的重要手段之一植榕,它在緩解網(wǎng)絡(luò)擁堵、減小網(wǎng)絡(luò)延遲尼夺、平滑數(shù)據(jù)傳輸?shù)荣|(zhì)量保證方面發(fā)揮重要作用尊残。WebRTC通控制發(fā)送端數(shù)據(jù)發(fā)送碼率來達(dá)到控制網(wǎng)絡(luò)擁塞的目的,其采用谷歌提出的擁塞控制算法(Google Congestion Control淤堵,簡稱GCC[1])來控制發(fā)送端碼率寝衫。</br>

本文是關(guān)于WebRTC擁塞控制算法GCC的上半部分,主要集中于對算法的理論分析拐邪,力圖對WebRTC的QoS有一個(gè)全面直觀的認(rèn)識慰毅。在下半部分,將深入WebRTC源代碼內(nèi)部扎阶,仔細(xì)分析GCC的實(shí)現(xiàn)細(xì)節(jié)汹胃。</br>

1 GCC算法綜述

</br>
</br>Google關(guān)于GCC的RFC文檔在文獻(xiàn)[1],該RFC目前處于草案狀態(tài)东臀,還沒有成為IETF的正式RFC着饥。此外,Google陸續(xù)發(fā)布了一系列論文[2][3][4]來論述該算法的實(shí)現(xiàn)細(xì)節(jié)惰赋,以及其在Google Hangouts宰掉、WebRTC等產(chǎn)品中的應(yīng)用。本文主要根據(jù)這些文檔資料,從理論上學(xué)習(xí)GCC算法轨奄。</br>

GCC算法分兩部分:發(fā)送端基于丟包率的碼率控制和接收端基于延遲的碼率控制孟害。如圖1所示。

圖1 GCC算法整體結(jié)構(gòu)

基于丟包率的碼率控制運(yùn)行在發(fā)送端挪拟,依靠RTCP RR報(bào)文進(jìn)行工作挨务。WebRTC在發(fā)送端收到來自接收端的RTCP RR報(bào)文,根據(jù)其Report Block中攜帶的丟包率信息玉组,動(dòng)態(tài)調(diào)整發(fā)送端碼率As耘子。基于延遲的碼率控制運(yùn)行在接收端球切,WebRTC根據(jù)數(shù)據(jù)包到達(dá)的時(shí)間延遲谷誓,通過到達(dá)時(shí)間濾波器,估算出網(wǎng)絡(luò)延遲m(t)吨凑,然后經(jīng)過過載檢測器判斷當(dāng)前網(wǎng)絡(luò)的擁塞狀況捍歪,最后在碼率控制器根據(jù)規(guī)則計(jì)算出遠(yuǎn)端估計(jì)最大碼率Ar。得到Ar之后鸵钝,通過RTCP REMB報(bào)文返回發(fā)送端糙臼。發(fā)送端綜合As、Ar和預(yù)配置的上下限恩商,計(jì)算出最終的目標(biāo)碼率A变逃,該碼率會作用到Encoder、RTP和PacedSender等模塊怠堪,控制發(fā)送端的碼率揽乱。</br>

2 發(fā)送端基于丟包率的碼率控制

</br>
</br>GCC算法在發(fā)送端基于丟包率控制發(fā)送碼率,其基本思想是:丟包率反映網(wǎng)絡(luò)擁塞狀況粟矿。如果丟包率很小或者為0凰棉,說明網(wǎng)絡(luò)狀況良好,在不超過預(yù)設(shè)最大碼率的情況下陌粹,可以增大發(fā)送端碼率撒犀;反之如果丟包率變大,說明網(wǎng)絡(luò)狀況變差掏秩,此時(shí)應(yīng)減少發(fā)送端碼率或舞。在其它情況下,發(fā)送端碼率保持不變蒙幻。</br>

GCC使用的丟包率根據(jù)接收端RTP接收統(tǒng)計(jì)信息計(jì)算得到映凳,通過RTCP RR報(bào)文中返回給發(fā)送端。RTCP RR報(bào)文統(tǒng)計(jì)接收端RTP接收信息杆煞,如Packet Loss魏宽,Jitter,DLSR等等决乎,如圖2所示:</br>

圖2 RTCP RR報(bào)文結(jié)構(gòu)[5]

發(fā)送端收到RTCP RR報(bào)文并解析得到丟包率后队询,根據(jù)圖3公式計(jì)算發(fā)送端碼率:當(dāng)丟包率大于0.1時(shí),說明網(wǎng)絡(luò)發(fā)生擁塞构诚,此時(shí)降低發(fā)送端碼率蚌斩;當(dāng)丟包率小于0.02時(shí),說明網(wǎng)絡(luò)狀況良好范嘱,此時(shí)增大發(fā)送端碼率送膳;其他情況下,發(fā)送端碼率保持不變丑蛤。</br>

圖3 GCC基于丟包率的碼率計(jì)算公式[4]

最終碼率會作用于Encoder叠聋、RTP和PacedSender模塊,用以在編碼器內(nèi)部調(diào)整碼率和平滑發(fā)送端發(fā)送速率受裹。</br>

3 接收端基于延遲的碼率控制

</br>
</br>GCC算法在接收端基于數(shù)據(jù)包到達(dá)延遲估計(jì)發(fā)送碼率Ar碌补,然后通過RTCP REMB報(bào)文反饋到發(fā)送端,發(fā)送端把Ar作為最終目標(biāo)碼率的上限值棉饶。其基本思想是: RTP數(shù)據(jù)包的到達(dá)時(shí)間延遲m(i)反映網(wǎng)絡(luò)擁塞狀況厦章。當(dāng)延遲很小時(shí),說明網(wǎng)絡(luò)擁塞不嚴(yán)重照藻,可以適當(dāng)增大目標(biāo)碼率袜啃;當(dāng)延遲變大時(shí),說明網(wǎng)絡(luò)擁塞變嚴(yán)重幸缕,需要減小目標(biāo)碼率群发;當(dāng)延遲維持在一個(gè)低水平時(shí),目標(biāo)碼率維持不變发乔。</br>

基于延時(shí)的擁塞控制由三個(gè)主要模塊組成:到達(dá)時(shí)間濾波器也物,過載檢查器和速率控制器;除此之外還有過載閾值自適應(yīng)模塊和REMB報(bào)文生成模塊列疗,如圖1所示滑蚯。下面分別論述其工作過程。</br>

3.1 到達(dá)時(shí)間濾波器(Arrival-time Filter)

</br>
</br>該模塊用以計(jì)算相鄰相鄰兩個(gè)數(shù)據(jù)包組的網(wǎng)絡(luò)排隊(duì)延遲m(i)抵栈。數(shù)據(jù)包組定義為一段時(shí)間內(nèi)連續(xù)發(fā)送的數(shù)據(jù)包的集合告材。一系列數(shù)據(jù)包短時(shí)間里連續(xù)發(fā)送,這段時(shí)間稱為突發(fā)時(shí)間古劲,建議突發(fā)時(shí)間為5ms斥赋。不建議在突發(fā)時(shí)間內(nèi)的包間隔時(shí)間做度量,而是把它們做為一組來測量产艾。通過相鄰兩個(gè)數(shù)據(jù)包組的發(fā)送時(shí)間和到達(dá)時(shí)間疤剑,計(jì)算得到組間延遲d (i)滑绒。組間延遲示意圖及計(jì)算公式如圖4所示:</br>

圖4 組間延遲示意圖

T(i)是第i個(gè)數(shù)據(jù)包組中第一個(gè)數(shù)據(jù)包的發(fā)送時(shí)間,t(i)是第i個(gè)數(shù)據(jù)包組中最后一個(gè)數(shù)據(jù)包的到達(dá)時(shí)間隘膘。幀間延遲通過如下公式計(jì)算得到:</br>

d(i) = t(i) – t(i-1) – (T(i) – T(i-1))    (3.1.1)

公式1.3.1是d(i)的觀測方程疑故。另一方面,d(i)也可由如下狀態(tài)方程得到:</br>

d(i) = dL(i)/C(i) + w(i)                  (3.1.2)
d(i) = dL(i)/C(i) + m(i) + v(i)           (3.1.3)

其中dL(i)表示相鄰兩幀的長度差弯菊,C(i)表示網(wǎng)絡(luò)信道容量纵势,m(i)表示網(wǎng)絡(luò)排隊(duì)延遲,v(i)表示零均值噪聲管钳。m(i)即是我們要求得的網(wǎng)絡(luò)排隊(duì)延遲钦铁。通過Kalman Filter可以求得該值。具體計(jì)算過程請參考文獻(xiàn)[1][4][6]才漆。</br>

3.2 過載檢測器(Over-use Detector)

</br>
</br>該模塊以到達(dá)時(shí)間濾波器計(jì)算得到的網(wǎng)絡(luò)排隊(duì)延遲m(i)為輸入牛曹,結(jié)合當(dāng)前閾值gamma_1,判斷當(dāng)前網(wǎng)絡(luò)是否過載醇滥。判斷算法如圖5所示[2]躏仇。</br>

圖5 過載檢測器偽代碼

算法基于當(dāng)前網(wǎng)絡(luò)排隊(duì)延遲m(i)和當(dāng)前閾值gamma_1判斷當(dāng)前網(wǎng)絡(luò)擁塞狀況[2]:當(dāng)m(i) > gamma_1時(shí),算法計(jì)算處于當(dāng)前狀態(tài)的持續(xù)時(shí)間t(ou) = t(ou) + delta(t)腺办,如果t(ou)大于設(shè)定閾值gamma_2(實(shí)際計(jì)算中設(shè)置為10ms)焰手,并且m(i) > m(i-1),則發(fā)出網(wǎng)絡(luò)過載信號Overuse怀喉,同時(shí)重置t(ou)书妻。如果m(i)小于m(i-1),即使高于閥值gamma_1也不需要發(fā)出過載信號躬拢。當(dāng)m(i) < -gamma_1時(shí)躲履,算法認(rèn)為當(dāng)前網(wǎng)絡(luò)處于空閑狀態(tài),發(fā)出網(wǎng)絡(luò)低載信號Underuse聊闯。當(dāng) – gamma_1 <= m(i) <= gamma_1是工猜,算法認(rèn)為當(dāng)前網(wǎng)絡(luò)使用率適中,發(fā)出保持信號Hold菱蔬。算法隨著時(shí)間軸的計(jì)算過程可從圖6中看到篷帅。</br>

圖6 時(shí)間軸上的過載檢測過程

需要注意的是,閥值gamma_1對算法的影響很大拴泌,并且閾值gamma_1是自適應(yīng)性的魏身。如果其是靜態(tài)值,會帶來一系列問題蚪腐,詳見文獻(xiàn)[4]箭昵。所以gamma_1需要?jiǎng)討B(tài)調(diào)整來達(dá)到良好的表現(xiàn)。這就是圖1中的Adaptive threshould模塊回季。閾值gamma_1動(dòng)態(tài)更新的公式如下:</br>

gamma_1(i) = gamma_1(i-1) + (t(i)-t(i-1)) * K(i) * (|m(i)|-gamma_1(i-1))    (3.2.4)

當(dāng)|m(i)|>gamma_1(i-1)時(shí)增加gamma_1(i)家制,反之減小gamma_1(i)正林,而當(dāng)|m(i)|– gamma_1(i) >15,建議gamma_1(i)不更新颤殴。K(i)為更新系數(shù)觅廓,當(dāng)|m(i)|<gamma_1(i-1)時(shí)K(i) = K_d,否則K(i) = K_u诅病。同時(shí)建議gamma_1(i)控制在[6,600]區(qū)間。太小的值會導(dǎo)致探測器過于敏感粥烁。建議增加系數(shù)要大于減少系數(shù)K_u > K_d贤笆。文獻(xiàn)[1]給出的建議值如下:</br>

gamma_1(0) = 12.5 ms
gamma_2  = 10 ms
K_u = 0.01
K_d = 0.00018

3.3 速率控制器(Remote Rate Controller)

</br>
</br>該模塊以過載檢測器給出的當(dāng)前網(wǎng)絡(luò)狀態(tài)s為輸入,首先根據(jù)圖7所示的有限狀態(tài)機(jī)判斷當(dāng)前碼率的變化趨勢讨阻,然后根據(jù)圖8所示的公式計(jì)算目標(biāo)碼率Ar芥永。</br>

圖7 目標(biāo)碼率Ar變化趨勢有限狀態(tài)機(jī)

當(dāng)前網(wǎng)絡(luò)過載時(shí),目標(biāo)碼率處于Decrease狀態(tài)钝吮;當(dāng)前網(wǎng)絡(luò)低載時(shí)埋涧,目標(biāo)碼率處于Hold狀態(tài);當(dāng)網(wǎng)絡(luò)正常時(shí)奇瘦,處于Decrease狀態(tài)時(shí)遷移到Hold狀態(tài)棘催,處于Hold/Increase狀態(tài)時(shí)都遷移到Increase狀態(tài)。當(dāng)判斷出碼率變化趨勢后耳标,根據(jù)圖8所示公式進(jìn)行計(jì)算目標(biāo)碼率醇坝。</br>

圖8 目標(biāo)碼率Ar計(jì)算公式

當(dāng)碼率變化趨勢為Increase時(shí),當(dāng)前碼率為上次碼率乘上系數(shù)1.05次坡;當(dāng)碼率變化趨勢為Decrease呼猪,當(dāng)前碼率為過去500ms內(nèi)的最大接收碼率乘上系數(shù)0.85。當(dāng)碼率變化趨勢為Hold時(shí)砸琅,當(dāng)前碼率保持不變宋距。目標(biāo)碼率Ar計(jì)算得到之后,下一步把Ar封裝到REMB報(bào)文中發(fā)送回發(fā)送端症脂。在REMB報(bào)文中谚赎,Ar被表示為Ar = M * 2^Exp,其中M封裝在BR Mantissa域诱篷,占18位沸版;Exp封裝在BR Exp域,占6位兴蒸。REMB報(bào)文是Payload為206的RTCP報(bào)文[7]视粮,格式如圖9所示。</br>

圖9 REMB報(bào)文格式

REMB報(bào)文每秒發(fā)送一次橙凳,當(dāng)Ar(i) < 0.97 * Ar(i-1)時(shí)則立即發(fā)送蕾殴。</br>

3.4 發(fā)送端目標(biāo)碼率的確定

</br>
</br>發(fā)送端最終目標(biāo)碼率的確定結(jié)合了基于丟包率計(jì)算得到的碼率As和基于延遲計(jì)算得到的碼率Ar笑撞。此外,在實(shí)際實(shí)現(xiàn)中還會配置目標(biāo)碼率的上限值和下限值钓觉。綜合以上因素茴肥,最終目標(biāo)碼率確定如下:</br>

    target_bitrate = max( min( min(As, Ar), Amax), Amin)        (3.4.1)

目標(biāo)碼率確定之后,分別設(shè)置到Encoder模塊和PacedSender模塊荡灾。</br>

4 總結(jié)

</br>
</br>本文在廣泛調(diào)研WebRTC GCC算法的相關(guān)RFC和論文的基礎(chǔ)上瓤狐,全面深入學(xué)習(xí)GCC算法的理論分析,以此為契機(jī)力圖對WebRTC的QoS有一個(gè)全面直觀的認(rèn)識批幌。為將來深入WebRTC源代碼內(nèi)部分析GCC的實(shí)現(xiàn)細(xì)節(jié)奠定基礎(chǔ)础锐。</br>
</br>
</br>

參考文獻(xiàn)

</br>
[1] A Google Congestion Control Algorithm for Real-Time Communication.
draft-alvestrand-rmcat-congestion-03
[2] Understanding the Dynamic Behaviour of the Google Congestion Control for RTCWeb.
[3] Experimental Investigation of the Google Congestion Control for Real-Time Flows.
[4] Analysis and Design of the Google Congestion Control for Web Real-time Communication (WebRTC). MMSys’16, May 10-13, 2016, Klagenfurt, Austria
[5] RFC3550: RTP - A Transport Protocol for Real-Time Applications
[6] WebRTC視頻接收緩沖區(qū)基于KalmanFilter的延遲模型.
http://www.reibang.com/p/bb34995c549a
[7] RTCP message for Receiver Estimated Maximum Bitrate. draft-alvestrand-rmcat-remb-03

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者荧缘。
  • 序言:七十年代末皆警,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子截粗,更是在濱河造成了極大的恐慌信姓,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绸罗,死亡現(xiàn)場離奇詭異意推,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)珊蟀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門左痢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人系洛,你說我怎么就攤上這事俊性。” “怎么了描扯?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵定页,是天一觀的道長。 經(jīng)常有香客問我绽诚,道長典徊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任恩够,我火速辦了婚禮卒落,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蜂桶。我一直安慰自己儡毕,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著腰湾,像睡著了一般雷恃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上费坊,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天倒槐,我揣著相機(jī)與錄音,去河邊找鬼附井。 笑死讨越,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的永毅。 我是一名探鬼主播把跨,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼卷雕!你這毒婦竟也來了节猿?” 一聲冷哼從身側(cè)響起票从,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤漫雕,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后峰鄙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體浸间,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年吟榴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了魁蒜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡吩翻,死狀恐怖兜看,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情狭瞎,我是刑警寧澤细移,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站熊锭,受9級特大地震影響弧轧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜碗殷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一精绎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧锌妻,春花似錦代乃、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽引谜。三九已至,卻和暖如春擎浴,著一層夾襖步出監(jiān)牢的瞬間员咽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工贮预, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留贝室,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓仿吞,卻偏偏與公主長得像滑频,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子唤冈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容