1.擁塞控制簡史
來看下維基百科對(duì)TCP/IP協(xié)議棧的一些介紹,筆者做了少量的修改來確保語句通順:
互聯(lián)網(wǎng)協(xié)議套件是一個(gè)網(wǎng)絡(luò)通信模型以及整個(gè)網(wǎng)絡(luò)傳輸協(xié)議家族,由于該協(xié)議簇包含兩個(gè)核心協(xié)議:TCP(傳輸控制協(xié)議)和IP(網(wǎng)際協(xié)議),因此常被通稱為TCP/IP協(xié)議族。
TCP/IP協(xié)議對(duì)于數(shù)據(jù)應(yīng)該如何封裝、定址、傳輸、路由以及在目的地如何接收等基本過程都加以標(biāo)準(zhǔn)化。它將通信過程抽象化為四個(gè)層次,并采取協(xié)議堆棧的方式分別實(shí)現(xiàn)出不同通信協(xié)議,實(shí)際使用的四層結(jié)構(gòu)是七層OSI模型的簡化。我們可以看到TCP/IP協(xié)議棧是一個(gè)簡化的分層模型,是互聯(lián)網(wǎng)世界連接一切的基石,一起來看一張七層模型vs四層模型的簡圖:
范·雅各布森Van Jacobson是目前作為互聯(lián)網(wǎng)技術(shù)基礎(chǔ)的TCP/IP協(xié)議棧的主要起草者,他以其在網(wǎng)絡(luò)性能的提升和優(yōu)化的開創(chuàng)性成就而聞名。2006年8月,他加入了帕洛阿爾托研究中心擔(dān)任研究員,并在位于相鄰的施樂建筑群的Packet Design公司擔(dān)任首席科學(xué)家。在此之前,他曾是思科系統(tǒng)公司首席科學(xué)家,并在位于勞倫斯伯克利國家實(shí)驗(yàn)室的網(wǎng)絡(luò)研究小組任領(lǐng)導(dǎo)者。
范·雅各布森因?yàn)樵谔岣逫P網(wǎng)絡(luò)性能提升和優(yōu)化所作的工作而為人們所知,1988到1989年間,他重新設(shè)計(jì)了TCP/IP的流控制算法(Jacobson算法),他因設(shè)計(jì)了RFC 1144中的TCP/IP頭壓縮協(xié)議即范·雅各布森TCP/IP頭壓縮協(xié)議而廣為人知。此外他也曾與他人合作設(shè)計(jì)了一些被廣泛使用的網(wǎng)絡(luò)診斷工具,如traceroute,pathchar以及tcpdump 。如圖為Van Jacobson計(jì)算機(jī)名人堂的簡介:范·雅各布森于2012年4月入選第一批計(jì)算機(jī)名人堂,計(jì)算機(jī)名人堂簡介:https://www.internethalloffame.org/inductees/van-jacobson
https://ee.lbl.gov/papers/congavoid.pdf我們常用的tracetoute和tcpdump也是van-jacobson大神的杰作,作為互聯(lián)網(wǎng)時(shí)代的受益者不由得對(duì)這些互聯(lián)網(wǎng)發(fā)展早期做出巨大貢獻(xiàn)的開拓者、創(chuàng)新者、變革者心生贊嘆和敬意。
2.流量控制和擁塞控制
TCP是一種面向連接的、可靠的、全雙工傳輸協(xié)議,前輩們寫了很多復(fù)雜的算法為其保駕護(hù)航,其中有一組像海爾兄弟一樣的算法:流量控制和擁塞控制,這也是我們今天的主角。
2.1 流量控制簡介
流量控制和擁塞控制從漢語字面上并不能很好的區(qū)分,本質(zhì)上這一對(duì)算法既有區(qū)別也有聯(lián)系。
In data communications, flow control is the process of managing the rate of data transmission between two nodes to prevent a fast sender from overwhelming a slow receiver.
It provides a mechanism for the receiver to control the transmission speed, so that the receiving node is not overwhelmed with data from transmitting node.翻譯一下:
在數(shù)據(jù)通信中,流量控制是管理兩個(gè)節(jié)點(diǎn)之間數(shù)據(jù)傳輸速率的過程,以防止快速發(fā)送方壓倒慢速接收方。
它為接收機(jī)提供了一種控制傳輸速度的機(jī)制,這樣接收節(jié)點(diǎn)就不會(huì)被來自發(fā)送節(jié)點(diǎn)的數(shù)據(jù)淹沒。可以看到流量控制是通信雙方之間約定數(shù)據(jù)量的一種機(jī)制,具體來說是借助于TCP協(xié)議的確認(rèn)ACK機(jī)制和窗口協(xié)議來完成的。
圖中RcvBuffer是接收區(qū)總大小,buffered data是當(dāng)前已經(jīng)占用的數(shù)據(jù),而free buffer space是當(dāng)前剩余的空間,rwnd的就是free buffer space區(qū)域的字節(jié)數(shù)。
HostB把當(dāng)前的rwnd值放入報(bào)文頭部的接收窗口receive window字段中,以此通知HostA自己還有多少可用空間, 而HostA則將未確認(rèn)的數(shù)據(jù)量控制在rwnd值的范圍內(nèi),從而避免HostB的接收緩存溢出。可見流量控制是端到端微觀層面的數(shù)據(jù)策略,雙方在數(shù)據(jù)通信的過程中并不關(guān)心鏈路帶寬情況,只關(guān)心通信雙方的接收發(fā)送緩沖區(qū)的空間大小,可以說是個(gè)速率流量匹配策略。
2.2 擁塞控制的必要性
前面我們提到了微觀層面點(diǎn)到點(diǎn)的流量控制,但是我們不由地思考一個(gè)問題:只有流量控制夠嗎?答案是否定的。
-
如何感知擁塞
-
如何利用帶寬
-
擁塞時(shí)如何調(diào)整
3.理解擁塞控制
看到一篇文章說到TCP 傳輸層擁塞控制算法并不是簡單的計(jì)算機(jī)網(wǎng)絡(luò)的概念,也屬于控制論范疇,感覺這個(gè)觀點(diǎn)很道理。
http://www.cs.cmu.edu/~srini/15-744/F02/readings/BP95.pdf文檔對(duì)Vegas算法和New Reno做了一些對(duì)比,我們從直觀圖形上可以看到Vegas算法更加平滑,相反New Reno則表現(xiàn)除了較大的波動(dòng)呈鋸齒狀,如圖所示:
3.1 擁塞窗口cwnd
從流量控制可以知道接收方在header中給出了rwnd接收窗口大小,發(fā)送方不能自顧自地按照接收方的rwnd限制來發(fā)送數(shù)據(jù),因?yàn)榫W(wǎng)絡(luò)鏈路是復(fù)用的,需要考慮當(dāng)前鏈路情況來確定數(shù)據(jù)量,這也是我們要提的另外一個(gè)變量cwnd,筆者找了一個(gè)關(guān)于rwnd和cwnd的英文解釋:
Congestion Window (cwnd) is a TCP state variable that limits the amount of data the TCP can send into the network before receiving an ACK.
The Receiver Window (rwnd) is a variable that advertises the amount of data that the destination side can receive.
Together, the two variables are used to regulate data flow in TCP connections, minimize congestion, and improve network performance.筆者在rfc5681文檔中也看到cwnd的定義:
3.2 擁塞控制基本策略
擁塞控制是一個(gè)動(dòng)態(tài)的過程,它既要提高帶寬利用率發(fā)送盡量多的數(shù)據(jù)又要避免網(wǎng)絡(luò)擁堵丟包RTT增大等問題,基于這種高要求并不是單一策略可以搞定的,因此TCP的擁塞控制策略實(shí)際上是分階段分策略的綜合過程:
3.3 TCP擁塞控制算法常見版本
實(shí)際上TCP算法有很多版本,每個(gè)版本存在一些差異,在這里簡單看一下維基百科的介紹:
-
算法命名規(guī)則
TCP 算法名的命名方式最早出現(xiàn)在Kevin Fall和Sally Floyd1996年發(fā)布的論文中。
-
TCP Tahoe 和TCP Reno
這兩個(gè)算法代號(hào)取自太浩湖Lake Tahoe和里諾市,兩者算法大致一致,對(duì)于丟包事件判斷都是以重傳超時(shí)retransmission timeout和重復(fù)確認(rèn)為條件,但是對(duì)于重復(fù)確認(rèn)的處理兩者有所不同,對(duì)于超時(shí)重傳RTO情況兩個(gè)算法都是將擁塞窗口降為1個(gè)MSS,然后進(jìn)入慢啟動(dòng)階段。
TCP Tahoe算法:如果收到三次重復(fù)確認(rèn)即第四次收到相同確認(rèn)號(hào)的分段確認(rèn),并且分段對(duì)應(yīng)包無負(fù)載分段和無改變接收窗口的話,Tahoe算法則進(jìn)入快速重傳,將慢啟動(dòng)閾值改為當(dāng)前擁塞窗口的一半,將擁塞窗口降為1個(gè)MSS,并重新進(jìn)入慢啟動(dòng)階段。
TCP Reno算法:如果收到三次重復(fù)確認(rèn),Reno算法則進(jìn)入快速重傳只將擁塞窗口減半來跳過慢啟動(dòng)階段,將慢啟動(dòng)閾值設(shè)為當(dāng)前新的擁塞窗口值,進(jìn)入一個(gè)稱為快速恢復(fù)的新設(shè)計(jì)階段。
-
TCP New Reno
TCP New Reno是對(duì)TCP Reno中快速恢復(fù)階段的重傳進(jìn)行改善的一種改進(jìn)算法,New Reno在低錯(cuò)誤率時(shí)運(yùn)行效率和選擇確認(rèn)SACK相當(dāng),在高錯(cuò)誤率仍優(yōu)于Reno。
-
TCP BIC 和TCP CUBIC
TCP BIC旨在優(yōu)化高速高延遲網(wǎng)絡(luò)的擁塞控制,其擁塞窗口算法使用二分搜索算法嘗試找到能長時(shí)間保持擁塞窗口最大值,Linux內(nèi)核在2.6.8至2.6.18使用該算法作為默認(rèn)TCP擁塞算法。
CUBIC則是比BIC更溫和和系統(tǒng)化的分支版本,其使用三次函數(shù)代替二分算法作為其擁塞窗口算法,并且使用函數(shù)拐點(diǎn)作為擁塞窗口的設(shè)置值,Linux內(nèi)核在2.6.19后使用該算法作為默認(rèn)TCP擁塞算法。
-
TCP PRR
TCP PRR是旨在恢復(fù)期間提高發(fā)送數(shù)據(jù)的準(zhǔn)確性,該算法確?;謴?fù)后的擁塞窗口大小盡可能接近慢啟動(dòng)閾值。在Google進(jìn)行的測試中,能將平均延遲降低3~10%恢復(fù)超時(shí)減少5%,PRR算法后作為Linux內(nèi)核3.2版本默認(rèn)擁塞算法。
-
TCP BBR
TCP BBR是由Google設(shè)計(jì)于2016年發(fā)布的擁塞算法,該算法認(rèn)為隨著網(wǎng)絡(luò)接口控制器逐漸進(jìn)入千兆速度時(shí),分組丟失不應(yīng)該被認(rèn)為是識(shí)別擁塞的主要決定因素,所以基于模型的擁塞控制算法能有更高的吞吐量和更低的延遲,可以用BBR來替代其他流行的擁塞算法。
Google在YouTube上應(yīng)用該算法,將全球平均的YouTube網(wǎng)絡(luò)吞吐量提高了4%,BBR之后移植入Linux內(nèi)核4.9版本。
3.4 擁塞控制過程詳解
我們以典型慢啟動(dòng)、擁塞避免、快速重傳、快速恢復(fù)四個(gè)過程進(jìn)行闡述。
-
慢啟動(dòng)
-
擁塞避免
-
超時(shí)重傳和快速重傳
-
快速恢復(fù)
4.弱網(wǎng)環(huán)境的AIMD特性
我們知道在網(wǎng)絡(luò)鏈路中連接的數(shù)量是動(dòng)態(tài)變化且數(shù)量巨大的,每一條連接都面臨著一個(gè)黑盒子式的網(wǎng)絡(luò)環(huán)境,這并不像我們平時(shí)出行時(shí)看看地圖就知道哪里堵了,為了維護(hù)一個(gè)好的網(wǎng)絡(luò)環(huán)境,每一條連接都需要遵守一些約定。
The additive-increase/multiplicative-decrease(AIMD) algorithm is a feedback control algorithm best known for its use in TCP congestion control.
AIMD combines linear growth of the congestion window with an exponential reduction when congestion is detected.
Multiple flows using AIMD congestion control will eventually converge to use equal amounts of a shared link.
The related schemes of multiplicative-increase/multiplicative-decrease (MIMD) and additive-increase/additive-decrease (AIAD) do not reach stability.簡單翻譯一下:線性增加乘性減少算法是一個(gè)反饋控制算法,因其在TCP擁塞控制中的使用而廣為人知,AIMD將線性增加擁塞窗口和擁塞時(shí)乘性減少窗口相結(jié)合,基于AIMD的多個(gè)連接理想狀態(tài)下會(huì)達(dá)到最終收斂,共享相同數(shù)量的網(wǎng)絡(luò)帶寬,與其相關(guān)的乘性增乘性減MIMD策略和增性加增性減少AIAD都無法保證穩(wěn)定性。
The delay before acknowledgment packets are received (= latency) will have an impact on how fast the TCP congestion window increases (hence the throughput).When latency is high, it means that the sender spends more time idle (not sending any new packets), which reduces how fast throughput grows.
5.BBR算法基本原理
BBR算法是個(gè)主動(dòng)的閉環(huán)反饋系統(tǒng),通俗來說就是根據(jù)帶寬和RTT延時(shí)來不斷動(dòng)態(tài)探索尋找合適的發(fā)送速率和發(fā)送量。
相關(guān)文獻(xiàn):https://queue.acm.org/detail.cfm?id=3022184
TCP BBR(Bottleneck Bandwidth and Round-trip propagation time)是由Google設(shè)計(jì),并于2016年發(fā)布的擁塞算法,以往大部分擁塞算法是基于丟包來作為降低傳輸速率的信號(hào),而BBR基于模型主動(dòng)探測。
該算法使用網(wǎng)絡(luò)最近出站數(shù)據(jù)分組當(dāng)時(shí)的最大帶寬和往返時(shí)間來創(chuàng)建網(wǎng)絡(luò)的顯式模型。數(shù)據(jù)包傳輸?shù)拿總€(gè)累積或選擇性確認(rèn)用于生成記錄在數(shù)據(jù)包傳輸過程和確認(rèn)返回期間的時(shí)間內(nèi)所傳送數(shù)據(jù)量的采樣率。
該算法認(rèn)為隨著網(wǎng)絡(luò)接口控制器逐漸進(jìn)入千兆速度時(shí),分組丟失不應(yīng)該被認(rèn)為是識(shí)別擁塞的主要決定因素,所以基于模型的擁塞控制算法能有更高的吞吐量和更低的延遲,可以用BBR來替代其他流行的擁塞算法例如CUBIC。Google在YouTube上應(yīng)用該算法,將全球平均的YouTube網(wǎng)絡(luò)吞吐量提高了4%,在一些國家超過了14%。BBR之后移植入Linux內(nèi)核4.9版本,并且對(duì)于QUIC可用。
5.1 基于丟包反饋策略可能在的問題
基于丟包反饋屬于被動(dòng)式機(jī)制,根源在于這些擁塞控制算法依據(jù)是否出現(xiàn)丟包事件來判斷網(wǎng)絡(luò)擁塞做減窗調(diào)整,這樣就可能會(huì)出現(xiàn)一些問題:
-
丟包即擁塞
現(xiàn)實(shí)中網(wǎng)絡(luò)環(huán)境很復(fù)雜會(huì)存在錯(cuò)誤丟包,很多算法無法很好區(qū)分擁塞丟包和錯(cuò)誤丟包,因此在存在一定錯(cuò)誤丟包的前提下在某些網(wǎng)絡(luò)場景中并不能充分利用帶寬。 -
緩沖區(qū)膨脹問題BufferBloat
網(wǎng)絡(luò)連接中路由器、交換機(jī)、核心網(wǎng)設(shè)備等等為了平滑網(wǎng)絡(luò)波動(dòng)而存在緩沖區(qū),這些緩存區(qū)就像輸液管的膨脹部分讓數(shù)據(jù)更加平穩(wěn),但是Loss-Based策略在最初就像網(wǎng)絡(luò)中發(fā)生數(shù)據(jù)類似于灌水,此時(shí)是將Buffer全部算在內(nèi)的,一旦buffer滿了,就可能出現(xiàn)RTT增加丟包等問題,就相當(dāng)于有的容量本不該算在其中,但是策略是基于包含Buffer進(jìn)行預(yù)測的,特別地在深緩沖區(qū)網(wǎng)絡(luò)就會(huì)出現(xiàn)一些問題。 -
網(wǎng)絡(luò)負(fù)載高但無丟包事件
假設(shè)網(wǎng)絡(luò)中的負(fù)載已經(jīng)很高了,只要沒有丟包事件出現(xiàn),算法就不會(huì)主動(dòng)減窗降低發(fā)送速率,這種情況下雖然充分利用了網(wǎng)絡(luò)帶寬,同時(shí)由于一直沒有丟包事件出現(xiàn)發(fā)送方仍然在加窗,表現(xiàn)出了較強(qiáng)的網(wǎng)絡(luò)帶寬侵略性,加重了網(wǎng)絡(luò)負(fù)載壓力。 -
高負(fù)載丟包
高負(fù)載無丟包情況下算法一直加窗,這樣可以預(yù)測丟包事件可能很快就出現(xiàn)了,一旦丟包出現(xiàn)窗口將呈現(xiàn)乘性減少,由高位發(fā)送速率迅速降低會(huì)造成整個(gè)網(wǎng)絡(luò)的瞬時(shí)抖動(dòng)性,總體呈現(xiàn)較大的鋸齒狀波動(dòng)。 -
低負(fù)載高延時(shí)丟包
在某些弱網(wǎng)環(huán)境下RTT會(huì)增加甚至出現(xiàn)非擁塞引起丟包,此時(shí)基于丟包反饋的擁塞算法的窗口會(huì)比較小,對(duì)帶寬的利用率很低,吞吐量下降很明顯,但是實(shí)際上網(wǎng)絡(luò)負(fù)載并不高,所以在弱網(wǎng)環(huán)境下效果并不是非常理想。
5.2 TCP BBR算法基本原理
前面我們提到了一些Loss-Based算法存在的問題,TCP BBR算法是一種主動(dòng)式機(jī)制,簡單來說BBR算法不再基于丟包判斷并且也不再使用AIMD線性增乘性減策略來維護(hù)擁塞窗口,而是分別采樣估計(jì)極大帶寬和極小延時(shí),并用二者乘積作為發(fā)送窗口,并且BBR引入了Pacing Rate限制數(shù)據(jù)發(fā)送速率,配合cwnd使用來降低沖擊。
5.2.1 一些術(shù)語
- BDPBDP是Bandwidth-Delay Product的縮寫,可以翻譯為帶寬延時(shí)積,我們知道帶寬的單位是bps(bit per second),延時(shí)的單位是s,這樣BDP的量綱單位就是bit,從而我們知道BDP就是衡量一段時(shí)間內(nèi)鏈路的數(shù)據(jù)量的指標(biāo)。這個(gè)可以形象理解為水管灌水問題,帶寬就是水管的水流速度立方米/s,延時(shí)就是灌水時(shí)間單位s,二者乘積我們就可以知道當(dāng)前水管內(nèi)存儲(chǔ)的水量了,這是BBR算法的一個(gè)關(guān)鍵指標(biāo),來看一張陶輝大神文章中的圖以及一些網(wǎng)絡(luò)場景中的BDP計(jì)算:
-
長肥網(wǎng)絡(luò)
我們把具有長RTT往返時(shí)間和高帶寬的網(wǎng)絡(luò)成為長肥網(wǎng)絡(luò)或者長肥管道,它的帶寬延時(shí)積BDP很大大,這種網(wǎng)絡(luò)理論上吞吐量很大也是研究的重點(diǎn)。
-
TCP Pacing機(jī)制
可以簡單地理解TCP Pacing機(jī)制就是將擁塞控制中數(shù)據(jù)包的做平滑發(fā)送處理,避免數(shù)據(jù)的突發(fā)降低網(wǎng)絡(luò)抖動(dòng)。
5.2.2 帶寬和延時(shí)的測量
BBR算法的一些思想在之前的基于延時(shí)的擁塞控制算法中也有出現(xiàn),其中必有有名的是TCP WestWood算法。
TCP Westwood改良自New Reno,不同于以往其他擁塞控制算法使用丟失來測量,其通過對(duì)確認(rèn)包測量來確定一個(gè)合適的發(fā)送速度,并以此調(diào)整擁塞窗口和慢啟動(dòng)閾值。其改良了慢啟動(dòng)階段算法為敏捷探測和設(shè)計(jì)了一種持續(xù)探測擁塞窗口的方法來控制進(jìn)入敏捷探測,使鏈接盡可能地使用更多的帶寬。TCP WestWood算法也是基于帶寬和延時(shí)乘積進(jìn)行設(shè)計(jì)的,但是帶寬和延時(shí)兩個(gè)指標(biāo)無法同時(shí)測量,因?yàn)檫@兩個(gè)值是有些矛盾的極值,要測量最大帶寬就要發(fā)送最大的數(shù)據(jù)量但是此時(shí)的RTT可能會(huì)很大,如果要測量最小的RTT那么久意味著數(shù)據(jù)量非常少最大帶寬就無法獲得。
5.2.3 發(fā)送速率和RTT曲線
前面提到了BBR算法核心是尋找BDP最優(yōu)工作點(diǎn),在相關(guān)論文中給出了一張組合的曲線圖,我們一起來看下:
這張圖是由兩個(gè)圖組合而成,目前是展示[數(shù)據(jù)發(fā)送速率vs網(wǎng)絡(luò)數(shù)據(jù)]和[RTTvs網(wǎng)絡(luò)數(shù)據(jù)]的關(guān)系,橫軸是網(wǎng)絡(luò)數(shù)據(jù)數(shù)量。
-
app limit應(yīng)用限制階段
在這個(gè)階段是應(yīng)用程序開始發(fā)送數(shù)據(jù),目前網(wǎng)絡(luò)通暢RTT基本保持固定且很小,發(fā)送速率與RTT成反比,因此發(fā)送速率也是線性增加的,可以簡單認(rèn)為這個(gè)階段有效帶寬并沒有達(dá)到上限,RTT是幾乎固定的沒有明顯增長。 -
band limit帶寬限制階段
隨著發(fā)送速率提高,網(wǎng)絡(luò)中的數(shù)據(jù)包越來越多開始占用鏈路Buffer,此時(shí)RTT開始增加發(fā)送速率不再上升,有效帶寬開始出現(xiàn)瓶頸,但是此時(shí)鏈路中的緩存區(qū)并沒有占滿,因此數(shù)據(jù)還在增加,RTT也開始增加。 -
buffer limit緩沖區(qū)限制階段
隨著鏈路中的Buffer被占滿,開始出現(xiàn)丟包,這也是探測到的最大帶寬,這個(gè)節(jié)點(diǎn)BDP BufferSize也是基于丟包的控制策略的作用點(diǎn)。
3.一些看法
5.2.4 BBR算法的主要過程
BBR算法和CUBIC算法類似,也同樣有幾個(gè)過程:StartUp、Drain、Probe_BW、Probe_RTT,來看下這幾個(gè)狀態(tài)的遷移情況:
-
StartUp慢啟動(dòng)階段
BBR的慢啟動(dòng)階段類似于CUBIC的慢啟動(dòng),同樣是進(jìn)行探測式加速區(qū)別在于BBR的慢啟動(dòng)使用2ln2的增益加速,過程中即使發(fā)生丟包也不會(huì)引起速率的降低,而是依據(jù)返回的確認(rèn)數(shù)據(jù)包來判斷帶寬增長,直到帶寬不再增長時(shí)就停止慢啟動(dòng)而進(jìn)入下一個(gè)階段,需要注意的是在尋找最大帶寬的過程中產(chǎn)生了多余的2BDP的數(shù)據(jù)量,關(guān)于這塊可以看下英文原文的解釋:
To handle Internet link bandwidths spanning 12 orders of magnitude, Startup implements a binary search for BtlBw by using a gain of 2/ln2 to double the sending rate while delivery rate is increasing. This discovers BtlBw in log2BDP RTTs but creates up to 2BDP excess queue in the process.
-
Drain排空階段
排空階段是為了把慢啟動(dòng)結(jié)束時(shí)多余的2BDP的數(shù)據(jù)量清空,此階段發(fā)送速率開始下降,也就是單位時(shí)間發(fā)送的數(shù)據(jù)包數(shù)量在下降,直到未確認(rèn)的數(shù)據(jù)包數(shù)量
-
ProbeBW帶寬探測階段
經(jīng)過慢啟動(dòng)和排空之后,目前發(fā)送方進(jìn)入穩(wěn)定狀態(tài)進(jìn)行數(shù)據(jù)的發(fā)送,由于網(wǎng)絡(luò)帶寬的變化要比RTT更為頻繁,因此ProbeBW階段也是BBR的主要階段,在探測期中增加發(fā)包速率如果數(shù)據(jù)包ACK并沒有受影響那么就繼續(xù)增加,探測到帶寬降低時(shí)也進(jìn)行發(fā)包速率下降。
-
ProbeRTT延時(shí)探測階段
前面三個(gè)過程在運(yùn)行時(shí)都可能進(jìn)入ProbeRTT階段,當(dāng)某個(gè)設(shè)定時(shí)間內(nèi)都沒有更新最小延時(shí)狀態(tài)下開始降低數(shù)據(jù)包發(fā)送量,試圖探測到更小的MinRTT,探測完成之后再根據(jù)最新數(shù)據(jù)來確定進(jìn)入慢啟動(dòng)還是ProbeBW階段。
5.3 TCP-BBR算法效果
有一些文章認(rèn)為BBR有鮮明的特點(diǎn),把擁塞控制算法分為BBR之前和BBR之后,可見BBR還是有一定影響,但是BBR算法也不是銀彈,不過可以先看看BBR算法在谷歌推動(dòng)下的一些應(yīng)用效果,其中包括吞吐量、RTT、丟包率影響:
6.參考文獻(xiàn)