面試考點 | 深入理解 TCP 擁塞控制
隨著網(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擁塞控制的是讓每個源確定網(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
理論上,擁塞控制有兩種實現(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
Reno算法所包含的慢啟動、擁塞避免和快速重傳、快速恢復(fù)機制,是現(xiàn)有的眾多基于丟包的擁塞控制算法的基礎(chǔ)。發(fā)送方維持一個叫做擁塞窗口cwnd(congestion 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在收到3個duplicate 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_win和min_win的中點。
BIC-TCP在高速網(wǎng)絡(luò)中具有良好的可擴展性、自身競爭流之間的公平性和低窗口振蕩的穩(wěn)定性。然而,BIC-TCP的擁塞控制窗口增長仍然可能會過大,特別是在短RTT或低速網(wǎng)絡(luò)下。此外,在擁塞窗口控制的幾個不同階段(二進制搜索增加、最大探測、Smax和Smin)增加了協(xié)議實現(xiàn)和性能分析的復(fù)雜性。
CUBIC是BIC-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)
不同于基于丟包的擁塞控制,TCPW發(fā)送端監(jiān)控ACK報文的接收速率,進而估算當前連接可達到的數(shù)據(jù)發(fā)送速率(可用帶寬)。
當發(fā)送端檢測到丟包時(超時或者3個重復(fù)ACK),發(fā)送端根據(jù)估算的發(fā)送速率設(shè)置擁塞窗口大?。?/span>cwnd)和慢啟動閾值(ssthresh)。


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


因為最優(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
雖然現(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ò)帶寬的充分利用,可以帶來更好的音視頻體驗;
通過simulcast和SVC, 在帶寬不足的情況下,盡量保證音視頻的實時性和流暢度;
盡量避免發(fā)送無效數(shù)據(jù)沖擊網(wǎng)絡(luò),例如FEC、NACK。
PART?05
總結(jié)
擁塞控制應(yīng)該是TCP中相對比較復(fù)雜的一個部分了,通過介紹TCP擁塞控制設(shè)計思想以及一些常用擁塞控制算法的設(shè)計思路,希望大家能對TCP擁塞控制有更好的了解。

技術(shù)交流,歡迎加我微信:ezglumes ,拉你入技術(shù)交流群。
私信領(lǐng)取相關(guān)資料
推薦閱讀:
開通專輯 | 細數(shù)那些年寫過的技術(shù)文章專輯
覺得不錯,點個在看唄~

