TCP通過維護(hù)一個(gè)擁塞窗口來進(jìn)行擁塞控制,擁塞控制的原則是,只要網(wǎng)絡(luò)中沒有出現(xiàn)擁塞入问,擁塞窗口的值就可以再增大一些践险,以便把更多的數(shù)據(jù)包發(fā)送出去,但只要網(wǎng)絡(luò)出現(xiàn)擁塞肢藐,擁塞窗口的值就應(yīng)該減小一些故河,以減少注入到網(wǎng)絡(luò)中的數(shù)據(jù)包數(shù)。
TCP擁塞控制算法發(fā)展的過程中出現(xiàn)了如下幾種不同的思路:
- 基于丟包的擁塞控制:將丟包視為出現(xiàn)擁塞窖壕,采取緩慢探測的方式忧勿,逐漸增大擁塞窗口,當(dāng)出現(xiàn)丟包時(shí)瞻讽,將擁塞窗口減小鸳吸,如Reno、Cubic等速勇。
- 基于時(shí)延的擁塞控制:將時(shí)延增加視為出現(xiàn)擁塞晌砾,延時(shí)增加時(shí)增大擁塞窗口,延時(shí)減小時(shí)減小擁塞窗口烦磁,如Vegas养匈、FastTCP等。
- 基于鏈路容量的擁塞控制:實(shí)時(shí)測量網(wǎng)絡(luò)帶寬和時(shí)延都伪,認(rèn)為網(wǎng)絡(luò)上報(bào)文總量大于帶寬時(shí)延乘積時(shí)出現(xiàn)了擁塞呕乎,如BBR。
- 基于學(xué)習(xí)的擁塞控制:沒有特定的擁塞信號陨晶,而是借助評價(jià)函數(shù)猬仁,基于訓(xùn)練數(shù)據(jù)帝璧,使用機(jī)器學(xué)習(xí)的方法形成一個(gè)控制策略,如Remy湿刽。
擁塞控制算法的核心是選擇一個(gè)有效的策略來控制擁塞窗口的變化的烁,下面介紹幾種經(jīng)典的擁塞控制算法。
Vegas
Vegas[1]將時(shí)延RTT的增加作為網(wǎng)絡(luò)出現(xiàn)擁塞的信號诈闺,RTT增加渴庆,擁塞窗口減小,RTT減小雅镊,擁塞窗口增加襟雷。具體來說,Vegas通過比較實(shí)際吞吐量和期望吞吐量來調(diào)節(jié)擁塞窗口的大小漓穿,期望吞吐量:Expected = cwnd / BaseRTT嗤军,實(shí)際吞吐量:Actual = cwnd / RTT,diff = (Expected-Actual) * BaseRTT晃危,BaseRTT是所有觀測來回響應(yīng)時(shí)間的最小值叙赚,一般是建立連接后所發(fā)的第一個(gè)數(shù)據(jù)包的RTT,cwnd是目前的擁塞窗口的大小僚饭。Vegas定義了兩個(gè)閾值a震叮,b,當(dāng)diff > b時(shí)鳍鸵,擁塞窗口減小苇瓣,當(dāng)a <= diff <=b時(shí),擁塞窗口不變偿乖,當(dāng)diff < a時(shí)击罪,擁塞窗口增加。
Vegas算法采用RTT的改變來判斷網(wǎng)絡(luò)的可用帶寬贪薪,能精確地測量網(wǎng)絡(luò)的可用帶寬媳禁,效率比較好。但是画切,網(wǎng)絡(luò)中Vegas與其它算法共存的情況下竣稽,基于丟包的擁塞控制算法會嘗試填滿網(wǎng)絡(luò)中的緩沖區(qū),導(dǎo)致Vegas計(jì)算的RTT增大霍弹,進(jìn)而降低擁塞窗口毫别,使得傳輸速度越來越慢,因此Vegas未能在Internet上普遍采用典格。
適用場景:適用于網(wǎng)絡(luò)中只存在Vegas一種擁塞控制算法岛宦,競爭公平的情況。
Reno
Reno[2]將擁塞控制的過程分為四個(gè)階段:慢啟動耍缴、擁塞避免恋博、快重傳和快恢復(fù)齐佳,是現(xiàn)有的眾多擁塞控制算法的基礎(chǔ),下面詳細(xì)說明這幾個(gè)階段债沮。
慢啟動階段,在沒有出現(xiàn)丟包時(shí)每收到一個(gè)ACK就將擁塞窗口大小加一(單位是MSS本鸣,最大單個(gè)報(bào)文段長度)疫衩,每輪次發(fā)送窗口增加一倍,呈指數(shù)增長荣德,若出現(xiàn)丟包闷煤,則將擁塞窗口減半,進(jìn)入擁塞避免階段涮瞻;當(dāng)窗口達(dá)到慢啟動閾值或出現(xiàn)丟包時(shí)鲤拿,進(jìn)入擁塞避免階段,窗口每輪次加一署咽,呈線性增長近顷;當(dāng)收到對一個(gè)報(bào)文的三個(gè)重復(fù)的ACK時(shí),認(rèn)為這個(gè)報(bào)文的下一個(gè)報(bào)文丟失了宁否,進(jìn)入快重傳階段窒升,立即重傳丟失的報(bào)文,而不是等待超時(shí)重傳慕匠;快重傳完成后進(jìn)入快恢復(fù)階段饱须,將慢啟動閾值修改為當(dāng)前擁塞窗口值的一半,同時(shí)擁塞窗口值等于慢啟動閾值台谊,然后進(jìn)入擁塞避免階段蓉媳,重復(fù)上訴過程。
Reno算法將收到ACK這一信號作為擁塞窗口增長的依據(jù)锅铅,在早期低帶寬酪呻、低時(shí)延的網(wǎng)絡(luò)中能夠很好的發(fā)揮作用,但是隨著網(wǎng)絡(luò)帶寬和延時(shí)的增加狠角,Reno的缺點(diǎn)就漸漸體現(xiàn)出來了号杠,發(fā)送端從發(fā)送報(bào)文到收到ACK經(jīng)歷一個(gè)RTT,在高帶寬延時(shí)(High Bandwidth-Delay Product丰歌,BDP)網(wǎng)絡(luò)中姨蟋,RTT很大,導(dǎo)致?lián)砣翱谠鲩L很慢立帖,傳輸速度需要經(jīng)過很長時(shí)間才能達(dá)到最大帶寬眼溶,導(dǎo)致帶寬利用率將低。
適用場景:適用于低延時(shí)晓勇、低帶寬的網(wǎng)絡(luò)堂飞。
Cubic
Cubic[3]是Linux內(nèi)核2.6之后的默認(rèn)TCP擁塞控制算法灌旧,使用一個(gè)立方函數(shù)(cubic function)
作為擁塞窗口的增長函數(shù),其中绰筛,C是調(diào)節(jié)因子枢泰,t是從上一次縮小擁塞窗口經(jīng)過的時(shí)間,Wmax是上一次發(fā)生擁塞時(shí)的窗口大小
铝噩,β是乘法減小因子衡蚂。從函數(shù)中可以看出擁塞窗口的增長不再與RTT有關(guān),而僅僅取決上次發(fā)生擁塞時(shí)的最大窗口和距離上次發(fā)生擁塞的時(shí)間間隔值骏庸。
Cubic擁塞窗口增長曲線如下毛甲,凸曲線部分為穩(wěn)定增長階段,凹曲線部分為最大帶寬探測階段具被。如圖2所示玻募,在剛開始時(shí),擁塞窗口增長很快一姿,在接近Wmax口時(shí)七咧,增長速度變的平緩,避免流量突增而導(dǎo)致丟包啸蜜;在Wmax附近坑雅,擁塞窗口不再增加;之后開始緩慢地探測網(wǎng)絡(luò)最大吞吐量衬横,保證穩(wěn)定性(在Wmax附近容易出現(xiàn)擁塞)裹粤,在遠(yuǎn)離Wmax后,增大窗口增長的速度蜂林,保證了帶寬的利用率遥诉。
當(dāng)出現(xiàn)丟包時(shí),將擁塞窗口進(jìn)行乘法減小噪叙,再繼續(xù)開始上述增長過程矮锈。此方式可以使得擁塞窗口一直維持在Wmax附近,從而保證了帶寬的利用率睁蕾。
Cubic算法的優(yōu)點(diǎn)在于只要沒有出現(xiàn)丟包苞笨,就不會主動降低自己的發(fā)送速度,可以最大程度的利用網(wǎng)絡(luò)剩余帶寬子眶,提高吞吐量瀑凝,在高帶寬、低丟包率的網(wǎng)絡(luò)中可以發(fā)揮較好的性能臭杰。
但是粤咪,Cubic同之前的擁塞控制算法一樣,無法區(qū)分擁塞丟包和傳輸錯(cuò)誤丟包渴杆,只要發(fā)現(xiàn)丟包寥枝,就會減小擁塞窗口宪塔,降低發(fā)送速率,而事實(shí)上傳輸錯(cuò)誤丟包時(shí)網(wǎng)絡(luò)不一定發(fā)生了擁塞囊拜,但是傳輸錯(cuò)誤丟包的概率很低某筐,所以對Cubic算法的性能影響不是很大。
Cubic算法的另一個(gè)不足之處是過于激進(jìn)冠跷,在沒有出現(xiàn)丟包時(shí)會不停地增加擁塞窗口的大小来吩,向網(wǎng)絡(luò)注入流量,將網(wǎng)絡(luò)設(shè)備的緩沖區(qū)填滿蔽莱,出現(xiàn)Bufferbloat(緩沖區(qū)膨脹)。由于緩沖區(qū)長期趨于飽和狀態(tài)戚长,新進(jìn)入網(wǎng)絡(luò)的的數(shù)據(jù)包會在緩沖區(qū)里排隊(duì)盗冷,增加無謂的排隊(duì)時(shí)延,緩沖區(qū)越大同廉,時(shí)延就越高仪糖。另外Cubic算法在高帶寬利用率的同時(shí)依然在增加擁塞窗口,間接增加了丟包率迫肖,造成網(wǎng)絡(luò)抖動加劇锅劝。
適用場景:適用于高帶寬、低丟包率網(wǎng)絡(luò)蟆湖,能夠有效利用帶寬故爵。
BBR
BBR[4]是谷歌在2016年提出的一種新的擁塞控制算法,已經(jīng)在Youtube服務(wù)器和谷歌跨數(shù)據(jù)中心廣域網(wǎng)上部署隅津,據(jù)Youtube官方數(shù)據(jù)稱诬垂,部署B(yǎng)BR后,在全球范圍內(nèi)訪問Youtube的延遲降低了53%伦仍,在時(shí)延較高的發(fā)展中國家结窘,延遲降低了80%。目前BBR已經(jīng)集成到Linux 4.9以上版本的內(nèi)核中充蓝。
BBR算法不將出現(xiàn)丟包或時(shí)延增加作為擁塞的信號隧枫,而是認(rèn)為當(dāng)網(wǎng)絡(luò)上的數(shù)據(jù)包總量大于瓶頸鏈路帶寬和時(shí)延的乘積時(shí)才出現(xiàn)了擁塞,所以BBR也稱為基于擁塞的擁塞控制算法(Congestion-Based Congestion Control)谓苟。BBR算法周期性地探測網(wǎng)絡(luò)的容量官脓,交替測量一段時(shí)間內(nèi)的帶寬極大值和時(shí)延極小值,將其乘積作為作為擁塞窗口大心纫辍(交替測量的原因是極大帶寬和極小時(shí)延不可能同時(shí)得到确买,帶寬極大時(shí)網(wǎng)絡(luò)被填滿造成排隊(duì),時(shí)延必然極大纱皆,時(shí)延極小時(shí)需要數(shù)據(jù)包不被排隊(duì)直接轉(zhuǎn)發(fā)湾趾,帶寬必然極邪派獭),使得擁塞窗口始的值始終與網(wǎng)絡(luò)的容量保持一致搀缠。
由于BBR的擁塞窗口是精確測量出來的铛楣,不會無限的增加擁塞窗口,也就不會將網(wǎng)絡(luò)設(shè)備的緩沖區(qū)填滿艺普,避免了出現(xiàn)Bufferbloat問題簸州,使得時(shí)延大大降低。如圖4所示歧譬,網(wǎng)絡(luò)緩沖區(qū)被填滿時(shí)時(shí)延為250ms岸浑,Cubic算法會繼續(xù)增加擁塞窗口,使得時(shí)延持續(xù)增加到500ms并出現(xiàn)丟包瑰步,整個(gè)過程Cubic一直處于高時(shí)延狀態(tài)矢洲,而BBR由于不會填滿網(wǎng)絡(luò)緩沖區(qū),時(shí)延一直處于較低狀態(tài)缩焦。
由于BBR算法不將丟包作為擁塞信號读虏,所以在丟包率較高的網(wǎng)絡(luò)中,BBR依然有極高的吞吐量袁滥,如圖5所示盖桥,在1%丟包率的網(wǎng)絡(luò)環(huán)境下,Cubic的吞吐量已經(jīng)降低90%以上题翻,而BBR的吞吐量幾乎沒有受到影響揩徊,當(dāng)丟包率大于15%時(shí),BBR的吞吐量才大幅下降藐握。
BBR算法是反饋驅(qū)動的靴拱,有自主調(diào)節(jié)機(jī)制,不受TCP擁塞控制狀態(tài)機(jī)的控制猾普,通過測量網(wǎng)絡(luò)容量來調(diào)整擁塞窗口袜炕,發(fā)送速率由自己掌控,而傳統(tǒng)的擁塞控制算法只負(fù)責(zé)計(jì)算擁塞窗口初家,而不管發(fā)送速率(pacing rate)偎窘,怎么發(fā)由TCP自己決定,這樣會在瓶頸帶寬附近因發(fā)送速率的激增導(dǎo)致數(shù)據(jù)包排隊(duì)或出現(xiàn)丟包溜在。
經(jīng)過測試陌知,在高延時(shí)、高丟包率的環(huán)境下掖肋,BBR相對于Cubic算法在傳輸速度上有較大的提升仆葡。
BBR算法的不足之處在于設(shè)備隊(duì)列緩存較大時(shí),BBR可能會競爭不過Cubic等比較激進(jìn)算法,原因是BBR不主動去占據(jù)隊(duì)列緩存沿盅,如果Cubic的流量長期占據(jù)隊(duì)列緩存把篓,會使得BBR在多個(gè)周期內(nèi)測量的極小RTT增大,進(jìn)而使BBR的帶寬減小腰涧。
適用場景:適用于高帶寬韧掩、高時(shí)延、有一定丟包率的長肥網(wǎng)絡(luò)窖铡,可以有效降低傳輸時(shí)延疗锐,并保證較高的吞吐量。
Remy
Remy[5]也稱為計(jì)算機(jī)生成的擁塞控制算法(computer-generated congestion-control algorithm)费彼,采用機(jī)器學(xué)習(xí)的方式生成擁塞控制算法模型滑臊。通過輸入各種參數(shù)模型(如瓶頸鏈路速率、時(shí)延箍铲、瓶頸鏈路上的發(fā)送者數(shù)量等)简珠,使用一個(gè)目標(biāo)函數(shù)定量判斷算法的優(yōu)劣程度,在生成算法的過程中虹钮,針對不同的網(wǎng)絡(luò)狀態(tài)采用不同的方式調(diào)整擁塞窗口,反復(fù)修改調(diào)節(jié)方式膘融,直到目標(biāo)函數(shù)最優(yōu)芙粱,最終會生成一個(gè)網(wǎng)絡(luò)狀態(tài)到調(diào)節(jié)方式的映射表,在真實(shí)的網(wǎng)絡(luò)中氧映,根據(jù)特定的網(wǎng)絡(luò)環(huán)境從映射表直接選取擁塞窗口的調(diào)節(jié)方式春畔。
Remy試圖屏蔽底層網(wǎng)絡(luò)環(huán)境的差異,采用一個(gè)通用的擁塞控制算法模型來處理不同的網(wǎng)絡(luò)環(huán)境岛都。這種方式比較依賴輸入的訓(xùn)練集(歷史網(wǎng)絡(luò)模型)律姨,如果訓(xùn)練集能夠全面覆蓋所有可能出現(xiàn)的網(wǎng)絡(luò)環(huán)境及擁塞調(diào)節(jié)算法,Remy算法在應(yīng)用到真實(shí)的網(wǎng)絡(luò)環(huán)境中時(shí)能夠表現(xiàn)的很好臼疫,但是如果真實(shí)網(wǎng)絡(luò)與訓(xùn)練網(wǎng)絡(luò)差異較大择份,Remy算法的性能會比較差。
適用場景:網(wǎng)絡(luò)環(huán)境為復(fù)雜的異構(gòu)網(wǎng)絡(luò)烫堤,希望計(jì)算機(jī)能夠針對不同網(wǎng)絡(luò)場景自動選擇合適的擁塞控制方式荣赶,要求現(xiàn)有的網(wǎng)絡(luò)模型能夠覆蓋所有可能出現(xiàn)情況。
總結(jié)
每一種擁塞控制算法都是在一定的網(wǎng)絡(luò)環(huán)境下誕生的鸽斟,適合特定的場景拔创,沒有一種一勞永逸的算法。網(wǎng)絡(luò)環(huán)境越來越復(fù)雜富蓄,擁塞控制算法也在不斷地演進(jìn)剩燥。本文不是要去選擇一個(gè)最好的算法,只是簡單介紹了幾種典型算法的設(shè)計(jì)思路立倍、優(yōu)缺點(diǎn)以及適用場景灭红,希望能給大家?guī)硪恍﹩l(fā)侣滩。
參考論文
[1] S.O. L. Brakmo and L. Peterson. TCP Vegas: New techniques for congestiondetection and avoidance. In SIGCOMM, 1994. Proceedings. 1994 InternationalConference on. ACM, 1994.
[2] V.Jacobson, “Congestion avoidance and control,” in ACM SIGCOMM ComputerCommunication Review, vol. 18. ACM, 1988, pp. 314–329.
[3] L. X. I. R. Sangtae Ha. Cubic: A new TCP -friendlyhigh-speed TCP variant. In SIGOPS-OSR, July 2008. ACM, 2008.
[4] C.S. G. S. H. Y. Neal Cardwell, Yuchung Cheng and V. Jacobson. BBR:congestion-based congestion control. ACM Queue, 14(5):20{53, 2016.
[5] K.Winstein and H. Balakrishnan. TCP Ex Machina: Computer-generated Congestion Control.In Proceedings of the ACM SIGCOMM 2013 Conference, 2013.