黃宏平,朱小勇,王志遠(yuǎn)
(1.中國科學(xué)院聲學(xué)研究所國家網(wǎng)絡(luò)新媒體工程技術(shù)研究中心,北京 100190; 2.中國科學(xué)院大學(xué),北京 100049)
1986年10月,因特網(wǎng)第一次經(jīng)歷的“擁塞崩潰”促使擁塞控制算法誕生[1]。隨著互聯(lián)網(wǎng)的迅速發(fā)展,各類服務(wù)、應(yīng)用對網(wǎng)絡(luò)性能的要求越來越高。擁塞控制算法被不斷改進(jìn),新型擁塞控制算法不斷地涌現(xiàn),如Remy[2]、PCC[3]、Copa[4]等,這些擁塞控制算法為解決網(wǎng)絡(luò)擁塞提供了全新的視角。一般來說,擁塞控制算法有2個(gè)關(guān)鍵的衡量指標(biāo),即帶寬利用率與公平性。高帶寬利用率意味著所有的流能夠充分利用鏈路帶寬,但是要避免鏈路過載而導(dǎo)致網(wǎng)絡(luò)癱瘓。同時(shí),盡可能地保證各個(gè)流之間帶寬分配公平,擁塞控制算法應(yīng)該具有良好的收斂性。谷歌在2016年提出了基于鏈路容量的BBR擁塞控制算法[5],與傳統(tǒng)的基于丟包的擁塞控制算法不同,該算法在保證高帶寬利用率的同時(shí),能夠保持較低的RTT(Round Trip Time),且算法具備很強(qiáng)的抗丟包能力。BBR通過主動探測鏈路可用帶寬和最小鏈路傳輸時(shí)延(RTTmin),來充分利用鏈路可用帶寬的同時(shí),減少在瓶頸鏈路排隊(duì)的數(shù)據(jù)包,并保證良好的公平性。根據(jù)網(wǎng)絡(luò)反饋的數(shù)據(jù)包到達(dá)速率和測得的RTTmin,計(jì)算得到鏈路的帶寬時(shí)延積(Bandwidth Delay Product, BDP),BBR輸出2個(gè)擁塞控制關(guān)鍵參數(shù):數(shù)據(jù)包發(fā)送速率(pacing_rate)和擁塞窗口(congestion window, cwnd),pacing_rate決定BBR發(fā)送數(shù)據(jù)的速率,cwnd決定BBR能夠發(fā)送多少數(shù)據(jù)。此外,BBR對丟包不敏感,其最大抗丟包率達(dá)到20%,即丟包“崖點(diǎn)”[6]。
圖1揭示了BBR與基于丟包的擁塞控制算法工作方式的根本區(qū)別[5]。該圖顯示了TCP流經(jīng)過瓶頸鏈路時(shí)RTT、吞吐量與inflight的關(guān)系。inflight為正在鏈路中傳輸?shù)臄?shù)據(jù)量大小,即所有己發(fā)送的但未被確認(rèn)的數(shù)據(jù)量。
當(dāng)inflight剛好大于鏈路BDP時(shí)(圖1中A點(diǎn)),瓶頸鏈路帶寬得到充分利用,且此時(shí)幾乎不產(chǎn)生數(shù)據(jù)包排隊(duì),排隊(duì)延遲為0或者接近于0,該點(diǎn)被文獻(xiàn)[7]證明為最優(yōu)操作點(diǎn),此時(shí)吞吐量達(dá)到瓶頸鏈路帶寬,RTT接近鏈路固有時(shí)延。而在A點(diǎn)的左邊,inflight數(shù)據(jù)低于BDP,瓶頸鏈路帶寬沒有被完全利用,可用帶寬被浪費(fèi)。隨著inflight數(shù)據(jù)的增加,到達(dá)數(shù)據(jù)的速率超過瓶頸鏈路的轉(zhuǎn)發(fā)速率,傳輸速率保持不變,超發(fā)的數(shù)據(jù)會被緩存在中間轉(zhuǎn)發(fā)設(shè)備的緩沖區(qū)或被中間轉(zhuǎn)發(fā)設(shè)備丟棄。瓶頸鏈路處的數(shù)據(jù)包隊(duì)列越長,數(shù)據(jù)包排隊(duì)延遲將越大,該過程在圖1中表現(xiàn)為帶寬限制。
基于丟包的擁塞控制算法以丟包作為鏈路擁塞的信號,在丟包之前不斷增加擁塞窗口大小,直至出現(xiàn)丟包才減小擁塞窗口?;趤G包的擁塞控制算法操作點(diǎn)為圖1中的B點(diǎn),該點(diǎn)不但容易產(chǎn)生丟包,且會產(chǎn)生不必要的數(shù)據(jù)包排隊(duì)延遲,緩沖區(qū)膨脹(Buffer Bloat)問題最嚴(yán)重[8]。
BBR試圖將傳輸過程控制在最優(yōu)操作點(diǎn)A,即獲得最大帶寬利用率的同時(shí)盡可能減少數(shù)據(jù)包排隊(duì)延遲。Jaffe[9]證明不存在一個(gè)分布式的算法使得傳輸過程收斂到最優(yōu)操作點(diǎn)A。BBR采取了一個(gè)折中的辦法來近似收斂到點(diǎn)A。BBR采用一個(gè)狀態(tài)機(jī),如圖2所示,在探測帶寬和探測RTT這2個(gè)狀態(tài)之間來回切換從而測得最大可用帶寬BWmax和最小鏈路傳播時(shí)延RTTmin,兩者的乘積即為BDP,從而控制傳輸過程近似收斂到最優(yōu)點(diǎn)。
BBR的基本流程如圖2所示,算法首先進(jìn)入START_UP階段,該階段以一個(gè)初始速率迅速增長到較為公平的可用帶寬,然后算法進(jìn)入DRAIN階段,在該階段BBR以START_UP階段速率的倒數(shù)發(fā)送數(shù)據(jù)包,其目的在于排空START_UP階段超發(fā)的數(shù)據(jù)包。當(dāng)網(wǎng)絡(luò)中的數(shù)據(jù)包數(shù)量小于等于BDP時(shí),BBR退出DRAIN階段,進(jìn)入PROBE_BW階段。BBR大部分時(shí)間都處在PROBE_BW階段,在該階段,BBR以速率增益數(shù)組[1.25,0.75,1,1,1,1,1,1]完成帶寬的探測和算法的公平收斂,pacing_gain取值為1.25或0.75使得速率增加1/4,隨后將超發(fā)的數(shù)據(jù)包排空。pacing_gain取值為1使得帶寬保持不變,以保證算法的收斂。此外,BBR如果10 s內(nèi)沒有探測到更小的RTT將進(jìn)入PROBE_RTT狀態(tài),該階段將擁塞窗口設(shè)置為4個(gè)發(fā)送方最大段大小以排空網(wǎng)絡(luò)鏈路重新測得RTTmin。
網(wǎng)絡(luò)一旦產(chǎn)生擁塞,將可能造成丟包和高延遲。丟包會觸發(fā)TCP重傳,進(jìn)而降低網(wǎng)絡(luò)的有效吞吐量。高延遲同樣會帶來嚴(yán)重問題,首先,許多應(yīng)用程序如AR/VR、在線游戲、遠(yuǎn)程系統(tǒng)管理、視頻會議等對延遲及其波動性均有較高要求[10]。延遲如果過大,甚至網(wǎng)頁瀏覽QoE也將急劇下降。受應(yīng)用限制的流的帶寬通常較小,如果擁塞控制不能保持較低的延遲,這些數(shù)據(jù)流在傳輸過程中也將持續(xù)存在高延遲,帶寬較小的流吞吐量被擠占[11]。
實(shí)驗(yàn)發(fā)現(xiàn),無論是單條還是多條BBR流,均存在較大的延遲,且延遲、帶寬波動均較大。其次,BBR在帶寬探測上還存在著一些問題,如在較小RTT環(huán)境下性能不佳,應(yīng)對帶寬改變不夠及時(shí)等問題。本文對以上問題進(jìn)行詳細(xì)分析,并給出相應(yīng)的解決方案。
BBR擁塞控制算法已被廣泛地研究與評估,文獻(xiàn)[12]搭建了物理測試環(huán)境,對高帶寬環(huán)境下的BBR進(jìn)行理論分析和實(shí)驗(yàn)測試。該文獻(xiàn)證明了多個(gè)BBR流對可用帶寬的估計(jì)總和總是趨向于超過瓶頸帶寬,使得多個(gè)BBR流共享同一個(gè)瓶頸帶寬環(huán)境時(shí)將收斂到Kleinrock最優(yōu)操作點(diǎn)的右側(cè),多個(gè)BBR流通常產(chǎn)生1~1.5倍RTT的排隊(duì)延遲。該現(xiàn)象的產(chǎn)生源于BBR帶寬探測時(shí),為保證流的收斂性,不同BBR流盡可能選擇在不同的時(shí)間探測鏈路帶寬;探測帶寬時(shí)使用最大過濾帶寬窗口(BWmax-filter)得到的傳輸速率作為發(fā)送速率,最大瓶頸帶寬(Max-BtlBW)即時(shí)采集,而Max-BtlBW的衰減是隨著時(shí)間緩慢進(jìn)行的,該機(jī)制是保證多個(gè)BBR流能夠公平收斂的關(guān)鍵[13]。
此外,BBR存在嚴(yán)重的RTT不公平性問題,文獻(xiàn)[14]建立了帶寬動力學(xué)模型,證明了當(dāng)RTT比率超過2時(shí),BBR流之間將發(fā)生嚴(yán)重的帶寬不公平。文獻(xiàn)[15]通過調(diào)整發(fā)送速率增益系數(shù)的方式來改進(jìn)RTT公平性,并且在一定程度上降低了排隊(duì)延遲。文獻(xiàn)[16]通過調(diào)整不同網(wǎng)絡(luò)狀態(tài)下的擁塞窗口大小以提高RTT公平性。文獻(xiàn)[17]證明了BBR流實(shí)際獲得帶寬增長的增益系數(shù)與RTT相關(guān),進(jìn)而提出了更加公平的增益系數(shù)以改進(jìn)RTT公平性。
在與傳統(tǒng)基于丟包的擁塞控制算法混合部署中,BBR存在著較為嚴(yán)重的協(xié)議間公平性問題。文獻(xiàn)[18]提出了一種BBR擁塞窗口縮放方案,來提高BBR與其他基于丟包的擁塞控制算法間的公平性。谷歌在2019年提出的BBRv2[19]一定程度地緩解了該問題,文獻(xiàn)[20]對BBRv1和BBRv2進(jìn)行了充分的比較與實(shí)驗(yàn)評估。
文獻(xiàn)[21]評估了主流擁塞控制算法在慢啟動階段的行為,實(shí)驗(yàn)評估結(jié)果表明BBR在慢啟動階段的表現(xiàn)遜于其他擁塞控制算法。該文獻(xiàn)的主要評估指標(biāo)包括慢啟動階段Inflight數(shù)據(jù)量、成功發(fā)送的數(shù)據(jù)量、RTT等。
文獻(xiàn)[13]對多個(gè)BBR流的收斂性進(jìn)行了理論證明,指出多個(gè)BBR流能夠最終收斂到同一個(gè)公平的帶寬得益于BBR的帶寬探測機(jī)制。進(jìn)行帶寬探測的BBR流,在探測RTT內(nèi),傳輸速率乘以一個(gè)大于1的增益系數(shù)以探測帶寬,在排空RTT內(nèi),將傳輸速率乘以增益系數(shù)的倒數(shù)以排空探測RTT期間產(chǎn)生排隊(duì)的數(shù)據(jù)包。而收斂的關(guān)鍵在于相比瓶頸帶寬占比較大的流,瓶頸帶寬占比較小的流能夠得到更大的傳輸速率增長。
針對BBR多流共享瓶頸鏈路出現(xiàn)嚴(yán)重的排隊(duì)延遲問題,谷歌在2018年發(fā)布了一個(gè)補(bǔ)丁[22]試圖解決該問題,其改進(jìn)方案是在帶寬探測狀態(tài)下,要求pacing_gain數(shù)組的第2個(gè)drain RTT內(nèi),inflight數(shù)據(jù)包小于等于BDP之后才進(jìn)入下一個(gè)探測階段,來解決之前的固定耗盡時(shí)長不足以排空隊(duì)列的問題,但是NS3最新版本NS-3.35以及最新版本的Linux內(nèi)核源碼均未實(shí)現(xiàn)該改進(jìn)。本文在NS3中應(yīng)用該改進(jìn)后,發(fā)現(xiàn)排隊(duì)時(shí)長縮短了40%以上。
文獻(xiàn)[17]進(jìn)一步改進(jìn)了BBR帶寬探測階段發(fā)送數(shù)據(jù)包行為,在第1個(gè)pacing階段(pacing_gain=1.25),當(dāng)向網(wǎng)絡(luò)中注入的數(shù)據(jù)包達(dá)到1.25倍BDP后立即退出此階段,而不必等待一個(gè)RTTmin的最小時(shí)長,該改進(jìn)在瓶頸帶寬被高估時(shí)減少了注入網(wǎng)絡(luò)的數(shù)據(jù)包,進(jìn)而減少排隊(duì)延遲。通過應(yīng)用該改進(jìn),排隊(duì)延遲進(jìn)一步降低了10%左右。該文獻(xiàn)還通過更快地退出PROBE_RTT狀態(tài)顯著減少了RTT探測引起的RTT抖動。
文獻(xiàn)[23]旨在解決鏈路容量快速變化的網(wǎng)絡(luò)場景下,BBR的最大過濾帶寬(BWmax-filter)機(jī)制帶來的高延遲問題。該文獻(xiàn)提出了一種自適應(yīng)的Tobit Kalman帶寬過濾器以應(yīng)對帶寬改變,但是該帶寬過濾器一定程度降低了BBR的帶寬利用率和協(xié)議公平性。
文獻(xiàn)[11]借鑒了BBR的設(shè)計(jì)思想,設(shè)計(jì)了一種以擁塞窗口為主要控制參數(shù)的狀態(tài)機(jī)。該算法嚴(yán)格根據(jù)BDP調(diào)整cwnd大小,相比BBR能夠提供更低的延遲,但是代價(jià)是一定的帶寬利用率損失。
在NS-3.35中仿真實(shí)驗(yàn)發(fā)現(xiàn),在應(yīng)用了上述所提到的延遲優(yōu)化[17,22]后,即使單個(gè)BBR流獨(dú)占瓶頸鏈路,仍舊存在一定的排隊(duì)延遲,實(shí)驗(yàn)中設(shè)置鏈路傳播時(shí)延(RTTprop)為60 ms,瓶頸帶寬為10 Mbit/s,RTT變化見圖3。
從圖3可以看出,絕大部分時(shí)間RTT在60 ms到80 ms之間劇烈波動,遠(yuǎn)高于RTTprop(60 ms)。在第10 s之后,RTTmin逐漸增大,超過鏈路設(shè)置的傳播時(shí)延,在此之后RTTmin進(jìn)一步增大。本文發(fā)現(xiàn)其原因在于BBR的RTTmin有效時(shí)間為10 s,當(dāng)RTTmin過期時(shí),瓶頸鏈路此時(shí)存在較大的排隊(duì)時(shí)延,使得更新的RTTmin偏大進(jìn)而使得瓶頸鏈路排隊(duì)現(xiàn)象進(jìn)一步加劇,整個(gè)過程如圖4所示。
對于多路流共享瓶頸帶寬的場景,BBR存在更為嚴(yán)重的排隊(duì)延遲,對比結(jié)果見本文實(shí)驗(yàn)評估部分。文獻(xiàn)[12]從定性的角度分析了BBR在多流共享瓶頸鏈路時(shí)將過載瓶頸鏈路,進(jìn)而產(chǎn)生較大的排隊(duì)延遲。本文從定量的角度對該問題進(jìn)行分析。
設(shè)瓶頸鏈路帶寬為BtlBw,流的總數(shù)為N。假設(shè)瓶頸鏈路處的緩沖區(qū)大小足夠大。第i個(gè)流探測的傳播時(shí)延記為RTTmin_i,由于各個(gè)流共享瓶頸緩沖區(qū),所以其排隊(duì)時(shí)延相同,記為D(t)。則往返時(shí)延為:
RTTi=RTTmin_i+D(t)
(1)
BtlBw=∑ibwi
(2)
設(shè)該平衡狀態(tài)下2路流的BWmax-filter分別為m1、m2,當(dāng)2路流的發(fā)送速率完全相等時(shí),2路流將達(dá)到平衡狀態(tài),則m1=m2=m。由于BBR是以BWmax-filter乘以增益系數(shù)g的速率發(fā)送數(shù)據(jù)包的,BBR能夠保證充分利用鏈路帶寬,則有:
(3)
編寫程序?qū)ι鲜鰩捥綔y過程進(jìn)行模擬,繪制出每次A、B這2個(gè)流帶寬探測后兩者帶寬變化散點(diǎn)圖、2路流各自的BWmax-filter變化散點(diǎn)圖如圖6所示??梢杂^察到,帶寬分配起始點(diǎn)P1從直線Y=1-X的任意處開始,經(jīng)過若干次輪流探測后都將收斂到同一狀態(tài)。當(dāng)前實(shí)際帶寬坐標(biāo)輪流取值(0.4444,0.5556),2路流BWmax-filter均收斂到0.5556。
在圖6中,當(dāng)流A探測帶寬時(shí),A、B這2路流的實(shí)際帶寬取值分別如L1和L3所示,當(dāng)流B探測時(shí),A、B這2路流的實(shí)際帶寬取值分別為L2和L4所示。無論是流A還是流B向上探測,流A的帶寬都隨著探測次數(shù)的增大逐漸減少,流B的帶寬會隨著探測次數(shù)的增大逐漸增大。L1和L4同樣是A與B這2路流各自的BWmax-filter變化,可以看出流A的實(shí)際發(fā)送速率逐漸減小,流B的實(shí)際發(fā)送速率逐漸增大,在大約第34輪探測后兩者收斂到同一值,其值高于理想情況下的公平帶寬。
理想情況下有:
(4)
實(shí)際發(fā)送速率超過瓶頸帶寬,在瓶頸鏈路處產(chǎn)生數(shù)據(jù)包堆積,進(jìn)而導(dǎo)致RTTmin估計(jì)持續(xù)偏大。BBR實(shí)際操作點(diǎn)處的帶寬和時(shí)延兩者都大于理想值,導(dǎo)致BBR無法收斂到最優(yōu)操作點(diǎn),整個(gè)傳輸過程中持續(xù)存在較大排隊(duì)延遲。
2.2.1 BBR在RTT較小時(shí)性能表現(xiàn)不佳
可以觀察到,當(dāng)RTT較小時(shí),BBR吞吐率曲線在PROBE_RTT階段后出現(xiàn)帶寬崩塌現(xiàn)象。實(shí)驗(yàn)鏈路帶寬設(shè)置為10 Mbit/s, RTT為8 ms,吞吐率曲線如圖7所示。
可以看出,大約在第10 s左右,吞吐率迅速下降。通過進(jìn)一步對該現(xiàn)象進(jìn)行分析,發(fā)現(xiàn)原因在于PROBE_RTT階段后,BBR對鏈路的帶寬估計(jì)極度偏低,因?yàn)樵谔綔yRTT階段,BBR設(shè)置擁塞窗口值為4個(gè)發(fā)送方最大段大小來排空網(wǎng)絡(luò)鏈路上的數(shù)據(jù)包,從而測得RTTprop。畫出BBR在整個(gè)傳輸過程中BWmax-filter的變化曲線可進(jìn)一步驗(yàn)證該分析,如圖7中虛線所示。
該曲線在第10 s之后有多次下降過程。其原因在于BBR的BWmax-filter窗口僅在10個(gè)RTT內(nèi)有效,而BBR在PROBE_RTT階段采集到的帶寬樣本通常遠(yuǎn)低于實(shí)際鏈路可用帶寬,當(dāng)RTT較小時(shí),整個(gè)PROBE_RTT階段經(jīng)歷的RTT輪數(shù)將大于10,這將導(dǎo)致BBR無法正確估計(jì)鏈路帶寬。
2.2.2 對帶寬變化敏感性不足
如前所述,BBR通過將pacing_gain設(shè)置為一個(gè)大于1的增益增大發(fā)送速率來探測鏈路帶寬,隨后一輪RTT內(nèi)將pacing_gain設(shè)置為增益的倒數(shù)排空上一輪產(chǎn)生的數(shù)據(jù)包隊(duì)列,接下來6輪RTT內(nèi)按照網(wǎng)絡(luò)鏈路可用帶寬發(fā)送數(shù)據(jù)包,這6個(gè)平穩(wěn)狀態(tài)是BBR帶寬能夠收斂的關(guān)鍵,保證了BBR的公平性[13]。平穩(wěn)狀態(tài)維持時(shí)間如果過短,留給其他流探測帶寬的時(shí)間將會不足。平穩(wěn)狀態(tài)維持時(shí)間如果過長,BBR將不能及時(shí)探測網(wǎng)絡(luò)鏈路帶寬;平穩(wěn)階段過長還會使得BBR收斂時(shí)間更長[25]。對于較長RTT的流而言,保持平穩(wěn)狀態(tài)的時(shí)間將過長,其帶寬探測的靈活性與收斂速度均較差。
針對BBR傳輸過程中排隊(duì)延遲較高的問題,結(jié)合BBR公平收斂的原理,本文提出一種改進(jìn)算法,該算法的核心思想是限制在外數(shù)據(jù)包數(shù),并對BBR流進(jìn)行適當(dāng)?shù)臏p窗,在不影響B(tài)BR帶寬利用率、公平性的條件下,進(jìn)一步減小BBR的延遲,降低延遲抖動,提升BBR收斂速度。網(wǎng)絡(luò)鏈路中的某路流對整體網(wǎng)絡(luò)參數(shù)通常是不可知的,如理想公平分配的帶寬大小、流的數(shù)目等。該算法動態(tài)計(jì)算鏈路BDP來減小擁塞窗口,在保證鏈路被充分利用的同時(shí),使延遲盡可能減小。算法1詳細(xì)描述了算法的主要邏輯。
算法1 BBR延遲優(yōu)化算法。
Set cwnd_gain=1.0;
pacing_gain=[6.0/5, 4.0/5, 1, 1, 1, 1, 1, 1]
For every ack do
queue_delay=RTT_Sample-RTTmin;
If BBR bottleneck bandwidth is stable:
If queue_delay>delaylower_bound:
cumu_shrink_cwnd+=gain_cwnd;
send_cwnd=BDP-Cumulative_shrink_cwnd;
BBR以pacing_rate作為主要控制參數(shù),cwnd_gain被設(shè)置為2,在PROBE_BW階段最高允許2BDP的inflight數(shù)據(jù)包,其目的是應(yīng)對ACK延遲和聚合嚴(yán)重的網(wǎng)絡(luò)傳輸場景[5]。本文將其減少到1,保證在外數(shù)據(jù)包數(shù)能夠充分利用帶寬,且能夠應(yīng)對較為嚴(yán)重的ACK延遲場景(如延遲ACK直到每4個(gè)數(shù)據(jù)包回復(fù)一個(gè)ACK);對于在接收者驅(qū)動的傳輸協(xié)議中使用BBR[26],由于并不通過ACK進(jìn)行帶寬估算,也將不受ACK延遲和壓縮的影響。將PROBR_BW階段探測帶寬的pacing_gain由5/4減小到6/5以進(jìn)一步減少BBR探測帶寬時(shí)超發(fā)的數(shù)據(jù)量,進(jìn)而降低RTT及其波動性。算法維護(hù)一個(gè)累積減少擁塞窗口值cumu_shrink_cwnd,該值根據(jù)網(wǎng)絡(luò)鏈路排隊(duì)狀況進(jìn)行設(shè)置,以達(dá)到減少排隊(duì)時(shí)延并加速流的收斂的目的。對每個(gè)到達(dá)的ACK,算法計(jì)算當(dāng)前排隊(duì)時(shí)延,并根據(jù)排隊(duì)時(shí)延計(jì)算超發(fā)的數(shù)據(jù)包,在cwnd_pace個(gè)RTT期間逐步減少超發(fā)數(shù)據(jù)包。由于各個(gè)流共享瓶頸緩沖區(qū),所以其排隊(duì)時(shí)延相同。根據(jù)BDP=maxBW·RTTprop,帶寬更大的流相比帶寬小的流將會減少更多的超發(fā)數(shù)據(jù)包,從而進(jìn)一步加快流的收斂。減少擁塞窗口需要在網(wǎng)絡(luò)較為穩(wěn)定的條件下進(jìn)行,否則過度地減少擁塞窗口將帶來不必要的帶寬損失。判斷網(wǎng)絡(luò)是否穩(wěn)定可計(jì)算RTT的方差與平均值的比值,文獻(xiàn)[27]測得有線網(wǎng)絡(luò)中該比值不超過0.3;當(dāng)BBR退出DRAIN或者處于PROBE_RTT階段附近測得的延遲通常是較低的,在這些情況下不調(diào)整擁塞窗口。設(shè)置delaylower_bound的目的在于提高算法的穩(wěn)定性,保證各個(gè)流之間的公平收斂。
3.2.1 BBR在RTT較小時(shí)性能表現(xiàn)不佳
針對根據(jù)RTT大小與PROBE_RTT階段經(jīng)歷的輪數(shù)的關(guān)系,可以列出關(guān)系式:
(5)
其中1輪是用來排空管道使得鏈路中該流的inflight數(shù)據(jù)包不超過4個(gè),令round≤10,解得RTT≥22.23 ms時(shí),PROBE_RTT階段不會使鏈路估算帶寬失效。
針對上述問題,解決該問題的方向大致分為2種。首先,可以更改PROBE_RTT階段的持續(xù)時(shí)長,使其在BWmax-filter過期之前結(jié)束PROBE_RTT,比如將PROBE_RTT階段持續(xù)的時(shí)長改為RTT相關(guān),如3個(gè)RTT,但是該方法可能使得BBR流不再同時(shí)進(jìn)入PROBE_RTT狀態(tài),進(jìn)而破壞BBR的收斂性。其次,可以為探測RTT之后的BBR提供一個(gè)有效帶寬。本文采取的解決思路是將進(jìn)入PROBE_RTT階段之前的Max-FilterBW延續(xù)到退出PROBE_RTT階段,繼續(xù)作為鏈路帶寬估計(jì)數(shù)據(jù)來指導(dǎo)BBR的帶寬探測行為。上述思路基于以下假設(shè),即RPOBE_RTT階段時(shí)間較短,僅有200 ms左右,該段時(shí)間內(nèi)鏈路的可用帶寬變化通常較小。
3.2.2 對帶寬變化的敏感性改進(jìn)
針對較長RTT場景BBR對帶寬探測敏感性不足的問題,設(shè)置一個(gè)平穩(wěn)狀態(tài)最長保持時(shí)間MaxStableDuration來及時(shí)退出平穩(wěn)狀態(tài),并轉(zhuǎn)入帶寬探測周期進(jìn)行帶寬探測。具體來說,當(dāng)BBR進(jìn)入平穩(wěn)周期時(shí)記錄平穩(wěn)周期起始時(shí)間,在判斷是否要進(jìn)入下一個(gè)平穩(wěn)周期時(shí),檢查平穩(wěn)周期保持時(shí)間是否已經(jīng)超過MaxStableDuration,如果超過則直接轉(zhuǎn)入帶寬探測周期(pacing_gain=1.25),否則按照順序進(jìn)入下一個(gè)周期。
本文在NS-3.35仿真平臺上對改進(jìn)BBR進(jìn)行驗(yàn)證。實(shí)驗(yàn)拓?fù)錇榻?jīng)典的啞鈴?fù)負(fù)洌浣Y(jié)構(gòu)如圖8所示。節(jié)點(diǎn)之間通信采用TCP協(xié)議,設(shè)置TCP的擁塞控制算法為BBR或改進(jìn)BBR。
為了驗(yàn)證改進(jìn)BBR的性能,本文進(jìn)行以下幾個(gè)實(shí)驗(yàn),分別對帶寬利用率、RTT、算法公平性、帶寬搶占能力進(jìn)行測試與分析。以下實(shí)驗(yàn)設(shè)置RTTprop為60 ms,瓶頸帶寬為10 Mbit/s, delaylower_bound=10 ms, cwnd_pace=30, ACK延遲計(jì)數(shù)為2。
圖9為2路流同時(shí)啟動,改進(jìn)BBR與BBR帶寬利用率、延遲的對比結(jié)果??梢钥闯?,兩者均能夠快速收斂到公平帶寬,并持續(xù)保持在該帶寬附近。改進(jìn)BBR相比BBR具有更為公平的帶寬分配,且其帶寬波動非常小。BBR延遲在[70,90] ms范圍內(nèi)迅速波動,而改進(jìn)BBR延遲僅為BBR的延遲波動范圍的下限值,為72 ms左右,該值還可以通過調(diào)整算法delaylower_bound和cwnd_pace進(jìn)一步減少,其代價(jià)是有一定的帶寬波動;改進(jìn)BBR的延遲波動非常小。
圖10為富余帶寬搶占能力對比結(jié)果。設(shè)置第2路流在27 s附近停止傳輸,觀察第1路流對富余帶寬的搶占能力??梢钥闯觯倪M(jìn)BBR甚至比BBR能夠更快地?fù)屨几挥鄮?,即使其具有更小的搶占增益系?shù),其原因是改進(jìn)BBR在搶占周期的持續(xù)時(shí)間比BBR更長。搶占帶寬前后,改進(jìn)BBR的帶寬與延遲均能夠保持較小波動。
圖11顯示了5路流同時(shí)傳輸時(shí)的帶寬與時(shí)延變化,可以看出,改進(jìn)BBR在大約3 s左右?guī)捯鸦臼諗康焦綆?,而BBR在第42 s左右才收斂,改進(jìn)BBR收斂速度提升約13倍。改進(jìn)BBR在多流環(huán)境下的帶寬與延遲波動仍舊較小,其RTT約為BBR的RTT波動范圍的下限值。
4.2.1 RTT較小時(shí)吞吐量對比
圖12為鏈路帶寬為10 Mbit/s、RTT=4 ms時(shí)的吞吐量變化曲線。BBR在第10 s之后帶寬迅速下降至接近于0,而改進(jìn)BBR仍然能夠保持高帶寬利用率,改進(jìn)BBR能夠適應(yīng)更小的RTT環(huán)境。如果要將BBR應(yīng)用到RTT極低的應(yīng)用場景,還需要修改RTTprop的更新機(jī)制,以使得所有流同步進(jìn)入PROBE_RTT狀態(tài)。
4.2.2 對帶寬變化的敏感性改進(jìn)
圖13顯示了BBR與改進(jìn)BBR在相同鏈路下吞吐量的變化曲線。實(shí)驗(yàn)設(shè)置瓶頸鏈路帶寬為10 Mbit/s, RTT=240 ms, MaxStableDuration=400 ms。相同時(shí)間內(nèi),改進(jìn)BBR相比BBR帶寬向上探測的次數(shù)大幅增加,分別為43次和24次。改進(jìn)BBR能夠更加及時(shí)地探測到鏈路帶寬增加,進(jìn)而提高發(fā)送速率,及時(shí)利用鏈路富余帶寬。
本文對BBR延遲較高的問題進(jìn)行了詳細(xì)的分析,進(jìn)一步給出了解決方案,即通過限制在外數(shù)據(jù)包數(shù),適時(shí)減少擁塞窗口來減少延遲及其波動性。對BBR在較小RTT環(huán)境下性能不理想以及帶寬探測敏感性不夠高的問題給出了解決方案。對于改進(jìn)BBR應(yīng)對RTT公平性問題以及與基于丟包的擁塞控制算法混合部署的場景本文并未討論,這是將來需要進(jìn)一步研究的內(nèi)容。