<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          面試考點 | 深入理解 TCP 擁塞控制

          共 4648字,需瀏覽 10分鐘

           ·

          2021-11-13 16:38

          隨著網(wǎng)絡(luò)技術(shù)的飛速發(fā)展,越來越多的工作依賴網(wǎng)絡(luò)完成,基于互聯(lián)網(wǎng)的實時通信系統(tǒng)的質(zhì)量和實時性也很大程度也依賴于網(wǎng)絡(luò)質(zhì)量。然而,在Internet的TCP/IP體系結(jié)構(gòu)中,擁塞的發(fā)生是其固有的屬性。

          網(wǎng)絡(luò)擁塞是指用戶對網(wǎng)絡(luò)資源(包括鏈路帶寬、存儲空間和處理器處理能力等)的需求超過了固有的處理能力和容量, 相比UDP,TCP自身具有擁塞控制機制,并且需要保障數(shù)據(jù)可靠傳輸,這會對基于TCP的音視頻實時傳輸造成一定的困擾。

          本文將深入講解TCP的擁塞控制機制以及如何基于TCP傳輸來設(shè)計一個實時音視頻系統(tǒng)。


          PART?01

          TCP擁塞控制簡介

          TCP/IP協(xié)議棧開始廣泛運行后,網(wǎng)絡(luò)開始遭受擁塞崩潰;即數(shù)據(jù)發(fā)送主機會以建議允許的速度將其數(shù)據(jù)包發(fā)送到互聯(lián)網(wǎng),當某些路由器發(fā)生擁塞,導(dǎo)致數(shù)據(jù)包被丟棄;對于TCP這種有重傳機制的傳輸協(xié)議,當發(fā)生數(shù)據(jù)丟失時,重傳數(shù)據(jù)將延長數(shù)據(jù)到達的時間;同時,高頻率的重傳,也將導(dǎo)致網(wǎng)絡(luò)的擁塞得不到緩解,從而引發(fā)更多的擁塞。
          為了避免這類問題,1980年代后期,TCP擁塞控制被引入到網(wǎng)絡(luò)協(xié)議中。

          從廣義上講,TCP擁塞控制的是讓每個源確定網(wǎng)絡(luò)中有多少可用容量,以便它知道可以安全傳輸多少數(shù)據(jù)包,防止過多的數(shù)據(jù)注入到網(wǎng)絡(luò)中,使網(wǎng)絡(luò)中的路由或者鏈路不至于過載。

          在網(wǎng)絡(luò)中發(fā)生擁塞時,擁塞控制減少向網(wǎng)絡(luò)中發(fā)送數(shù)據(jù)的速度,防止造成惡性循環(huán);同時在網(wǎng)絡(luò)空閑時,提高發(fā)送數(shù)據(jù)的速度,最大限度地利用網(wǎng)絡(luò)資源。

          當然,確定可用網(wǎng)絡(luò)容量并非易事,不斷有新的TCP連接的加入和減少;更糟糕的是,可用帶寬會隨著時間的推移而變化,這意味著任何給定的源都必須能夠調(diào)整它在傳輸中的數(shù)據(jù)包數(shù)量。

          ?

          PART?02

          TCP擁塞控制算法分類

          理論上,擁塞控制有兩種實現(xiàn)方式:

          • 端到端擁塞控制:在這種擁塞控制方法中,由發(fā)送端自己來判斷是否擁塞,然后調(diào)整傳輸速率;

          • 網(wǎng)絡(luò)輔助的擁塞控制:由網(wǎng)絡(luò)中的路由器來告訴發(fā)送方,網(wǎng)絡(luò)的擁塞情況。

          通過網(wǎng)絡(luò)層反饋擁塞信息實現(xiàn)擁塞控制的方法,需要得到網(wǎng)絡(luò)設(shè)備的支持,改造底層硬件;現(xiàn)在常用的TCP協(xié)議大都采用的是端到端擁塞控制,即由發(fā)送端自己來判斷是否擁塞;若發(fā)送端檢測到這種現(xiàn)象,就應(yīng)該降低發(fā)送數(shù)據(jù)的速率,若沒有,則可以慢慢提高速率。擁塞控制算法需要解決以下三個問題:

          • TCP如何限制數(shù)據(jù)的發(fā)送速率;

          • TCP如何檢測網(wǎng)絡(luò)中是否擁塞;

          • TCP采用什么算法來調(diào)整速率(什么時候調(diào)整,調(diào)整多少)。?

          TCP擁塞控制算法發(fā)展的過程當中出現(xiàn)了以下幾種不一樣的思路:

          • 丟包的擁塞控制將丟包視為出現(xiàn)擁塞,采緩慢探測的方式,逐漸增大擁塞窗口,當出現(xiàn)丟包時,將擁塞窗口減少,如Tahoe、Reno、BIC-TCP、Cubic等;

          • 基于時延的擁塞控制:將時延增長視為出現(xiàn)擁塞,延時增長時增大擁塞窗口,延時減少時減少擁塞窗口,如Vegas、Westwood等;

          • 基于鏈路容量的擁塞控制:實時測量網(wǎng)絡(luò)帶寬和時延,認為網(wǎng)絡(luò)上報文總量大于帶寬時延乘積時出現(xiàn)了擁塞,如BBR;

          • 基于學(xué)習(xí)的擁塞控制:沒有特定的擁塞信號,而是借助評價函數(shù),基于訓(xùn)練數(shù)據(jù),使用機器學(xué)習(xí)的方法造成一個控制策略,如Remy。
          ?

          PART?03

          常見TCP擁塞控制算法
          TCP Reno

          Reno算法所包含的慢啟動、擁塞避免和快速重傳、快速恢復(fù)機制,是現(xiàn)有的眾多基于丟包的擁塞控制算法的基礎(chǔ)。發(fā)送方維持一個叫做擁塞窗口cwndcongestion window)的狀態(tài)變量和慢開始門限ssthresh狀態(tài)變量。ssthresh的用法如下:

          cwnd時,使用慢開始算法。

          cwnd>ssthresh時,改用擁塞避免算法。

          cwnd=ssthresh時,慢開始與擁塞避免算法任意。

          1)慢熱啟動算法 – Slow Start

          連接建好的開始先初始化cwnd = 1,表明可以傳一個MSS大小的數(shù)據(jù)。

          • 每當收到一個ACK,cwnd++; 呈線性上升。

          • 每當過了一個RTT,cwnd = cwnd*2; 呈指數(shù)升。

          2)擁塞避免算法 – Congestion Avoidance

          cwnd >= ssthresh時,就會進入“擁塞避免算法”。算法如下:

          • 收到一個ACK時,cwnd = cwnd + 1/cwnd

          • 當每過一個RTT時,cwnd = cwnd + 1

          3)擁塞狀態(tài)算法 – Fast Retransmit

          Reno在收到3duplicate ACK時就開啟重傳,而不用等到RTO超時。擁塞發(fā)生時:

          • cwnd = cwnd/2

          • sshthresh = cwnd

          4)快速恢復(fù) – Fast Recovery

          cwnd = sshthresh + 3 * MSS 3的意思是確認有3個數(shù)據(jù)包被收到了)

          • 重傳Duplicated ACKs指定的數(shù)據(jù)包;
          • 如果再收到 duplicated Acks,那么cwnd = cwnd +1;
          • 如果收到了新的Ack,那么,cwnd = sshthresh ,然后進入擁塞避免算法。


          BIC-TCP 和 CUBIC

          TCP-Reno在大擁塞窗口環(huán)境下,由于一個數(shù)據(jù)包的丟失所帶來的窗口縮小要花費很長的時間來恢復(fù)(每次僅增加1),這樣,帶寬利用率不可能很高且隨著網(wǎng)絡(luò)的鏈路帶寬不斷提升,這種弊端將越來越明顯。

          為了改善Reno擁塞避免階段的表現(xiàn),BIC-TCP提出這樣一個二分思想的:當出現(xiàn)丟包的時候,說明最佳窗口值應(yīng)該比這個值小,那么BIC就把此時的cwnd設(shè)置為max_win,把乘法減小后的值設(shè)置為min_win,然后BIC就開始在這兩者之間執(zhí)行二分思想--每次跳到max_winmin_win的中點。

          BIC-TCP在高速網(wǎng)絡(luò)中具有良好的可擴展性、自身競爭流之間的公平性和低窗口振蕩的穩(wěn)定性。然而,BIC-TCP的擁塞控制窗口增長仍然可能會過大,特別是在短RTT或低速網(wǎng)絡(luò)下。此外,在擁塞窗口控制的幾個不同階段(二進制搜索增加、最大探測、SmaxSmin)增加了協(xié)議實現(xiàn)和性能分析的復(fù)雜性。

          CUBICBIC-TCP的改進算法,CUBIC算法通過尋找一個新的窗口增長函數(shù),三次方函數(shù),在保持BIC-TCP的優(yōu)勢的同時(特別是它的穩(wěn)定性和可伸縮性),同時簡化了窗口控制的復(fù)雜度。CUBIC窗口控制函數(shù)如下:

          其中,W(t)是在時間t時,窗口的大小,C為CUBIC參數(shù),t為上次減窗經(jīng)過的時間,K為上述函數(shù)在沒有進一步損失事件時將W增加到Wmax所需要的時間周期,當發(fā)生擁塞事件時,CUBIC將當前cwnd設(shè)置為Wmax * β,乘法減小系數(shù);由此可知K是:

          通過下圖可以看出,
          • cwnd < Wmax. CUBIC在凸函數(shù)區(qū)域,即擁塞避免區(qū)間,cwnd的增隨時間的增加而變小;
          • cwnd>=Wmax. CUBIC在凹函數(shù)區(qū)域,即新的Wmax 探測區(qū)域,當距離上次發(fā)生擁塞事件越久,cwnd 增長越快。

          TCPW (TCP Westwood)

          基于丟包的擁塞控制方法把數(shù)據(jù)包的丟失解釋為網(wǎng)絡(luò)發(fā)生了擁塞,而假定鏈路錯誤造成的分組丟失是忽略不計的,然而在高速網(wǎng)絡(luò)中,這種假設(shè)是不成立的,當數(shù)據(jù)傳輸速率比較高時,或者在無線網(wǎng)絡(luò)環(huán)境下,鏈路錯誤是不能忽略的。
          此時的丟包并不一定代表網(wǎng)絡(luò)發(fā)生擁塞。同時,基于丟包的擁塞控制方法傾向于填滿緩沖區(qū),當瓶頸鏈路的緩沖區(qū)很大時,需要很長時間才能將緩沖區(qū)中的數(shù)據(jù)包排空,造成很大的網(wǎng)絡(luò)延時,這種情況稱之為緩沖區(qū)膨脹。

          不同于基于丟包的擁塞控制,TCPW發(fā)送端監(jiān)控ACK報文的接收速率,進而估算當前連接可達到的數(shù)據(jù)發(fā)送速率(可用帶寬)。

          當發(fā)送端檢測到丟包時(超時或者3個重復(fù)ACK),發(fā)送端根據(jù)估算的發(fā)送速率設(shè)置擁塞窗口大?。?/span>cwnd)和慢啟動閾值(ssthresh)。

          TCPW評估當前采樣點的帶寬如下:

          其中,dk 代表發(fā)送數(shù)據(jù)的數(shù)量,tk, tk-1 代表當前收到ACK包的時間和收到上一個ACK的時間;為了去除 ACK帶來的速率采樣噪聲,TCPW對采樣的速率應(yīng)用一個低通濾波器來獲得可用帶寬的低頻部分,得到如下的一個離散時間濾波器:

          為了方便理解,假設(shè) tk – tk-1 是一個常量;當前的帶寬評估可以可以簡化為:

          可以認為,當前評估帶寬是,之前評估帶寬和最近2次評估帶寬的一個平滑值;當發(fā)生ACK丟的情況,認為當前采樣時間的帶寬為0,可以看出,TCPW 會把當前帶寬認為是在上一個評估帶寬上做了一次乘法減小。

          TCP-Westwood避免太過保守的減低窗口操作,與基于丟包的擁塞控制算法相比,TCP-Westwood更適合于無線鏈路類的TCP連接。TCPW早在1990年代末就提出了google BBR類似的想法,通過不斷的測量帶寬和最小RTT來估算網(wǎng)絡(luò)的容量,最終將發(fā)生數(shù)據(jù)收斂。
          BBR
          BBR是由Google設(shè)計,并于2016年發(fā)布的擁塞算法,以往大部分擁塞算法是基于丟包來作為降低傳輸速率的信號,而BBR基于模型主動探測。

          因為最優(yōu)帶寬和延遲無法同時測量(btlBw的測量會造成存在網(wǎng)絡(luò)緩存增加RTT,而RTprop的測量要求網(wǎng)絡(luò)緩存為空),所以分別估計帶寬(btlBw)和延遲(RTprop),最后計算出cwnd。同時增加變量pacing rate(btlBw * 增益系數(shù)),用于控制發(fā)送端的發(fā)送速率,以解決發(fā)送端突發(fā)造成的網(wǎng)絡(luò)排隊問題。

          TCP BBR一方面能夠提升丟包環(huán)境下的發(fā)送速率,充分利用網(wǎng)絡(luò)帶寬,同時,也能夠降低網(wǎng)絡(luò)鏈路buffer的使用率,從而降低傳輸延時。TCP BBR 不僅適合TCP場景,同時QUIC也使用了BBR作為擁塞控制算法。


          PART?04

          實時多媒體QoS與TCP擁塞控制

          雖然現(xiàn)在的實時多媒體通訊大部分都是基于UDP協(xié)議來實現(xiàn),但是也存在一些情況,需要通過TCP來傳輸音視頻;例如UDP端口屏蔽。相對于UDP數(shù)據(jù)傳輸?shù)膩G包,亂序, TCP網(wǎng)絡(luò)下的傳輸數(shù)據(jù)延時大,隊頭阻塞等問題,為實時音視頻傳輸也帶來了更大的挑戰(zhàn)。

          實時多媒體的一些特點:

          • 對于視頻高清的需求,大碼率場景下,單位吞吐大幅增加,單幀大小大幅增加,導(dǎo)致網(wǎng)絡(luò)丟包數(shù)大幅增加,

          • 實時通信對低延遲的要求,導(dǎo)致對數(shù)據(jù)傳輸?shù)膶崟r性的要求高。?

          為了更好的提升實時多媒體QoS,在TCP 環(huán)境下,設(shè)置擁塞控制和流量控制,需要考慮到以下一些的方面:

          • 快速地檢測到網(wǎng)絡(luò)的擁塞事件發(fā)生;

          • 精準的控制編碼碼率,特別是對視頻關(guān)鍵幀的編碼,避免出現(xiàn)大的網(wǎng)絡(luò)沖擊;

          • 更積極的網(wǎng)絡(luò)探測,對網(wǎng)絡(luò)帶寬的充分利用,可以帶來更好的音視頻體驗;

          • 通過simulcastSVC, 在帶寬不足的情況下,盡量保證音視頻的實時性和流暢度;

          • 盡量避免發(fā)送無效數(shù)據(jù)沖擊網(wǎng)絡(luò),例如FECNACK。


          PART?05

          總結(jié)

          擁塞控制應(yīng)該是TCP中相對比較復(fù)雜的一個部分了,通過介紹TCP擁塞控制設(shè)計思想以及一些常用擁塞控制算法的設(shè)計思路,希望大家能對TCP擁塞控制有更好的了解。


          技術(shù)交流,歡迎加我微信:ezglumes ,拉你入技術(shù)交流群。

          私信領(lǐng)取相關(guān)資料

          推薦閱讀:

          音視頻開發(fā)工作經(jīng)驗分享 || 視頻版

          OpenGL ES 學(xué)習(xí)資源分享

          開通專輯 | 細數(shù)那些年寫過的技術(shù)文章專輯

          NDK 學(xué)習(xí)進階免費視頻來了

          你想要的音視頻開發(fā)資料庫來了

          推薦幾個堪稱教科書級別的 Android 音視頻入門項目

          覺得不錯,點個在看唄~

          瀏覽 34
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  少妇做爱网站 | 天堂中文在线免费观看 | 免费性爱网址 | 色婷婷久久综合中文久久蜜桃Av | 影音先锋成人资源站 |