Linux從4.9版本開始內核默認安裝編譯了BBR算法。關于BBR的資料有很多,我在這里將一些簡單易懂的原理作了記錄整理。
在BBR出現(xiàn)以前TCP已經(jīng)有了12流控算法,這些算法大都是基于丟包控制的擁塞避免,這意味著在數(shù)據(jù)傳輸過程中,只要丟包就被認為是網(wǎng)絡擁塞,數(shù)據(jù)減半速率進行發(fā)送。當出現(xiàn)以下情況:包括瞬時流量過大、突發(fā)信號干擾丟包、數(shù)據(jù)校驗錯誤丟包時,這種處理方式就成為了限制網(wǎng)絡發(fā)送速率的瓶頸。
隨著現(xiàn)代網(wǎng)絡帶寬越來越高,網(wǎng)絡越來越復雜,過于保守的傳統(tǒng)算法往往浪費大量可用帶寬。這樣的背景下,谷歌BBR算法誕生,與傳統(tǒng)算法不同,它是基于帶寬實時測量的算法。所以我們首先了解一下它是如何記錄可用帶寬和通信往返時間的。
測量可用帶寬值BtlBW: BBR在每次收到對方的ack時,都要實時計算傳輸速率,該值等于應答數(shù)據(jù)量除以應答時間。同時以10個通信往返時間為周期,將周期內測量到的最大帶寬值保存在BtlBW中。
測量通信往返時間值RTprop:實時測量通信往返時間RTT,將值保存在RTprop中。如果10秒內,該值沒有變化,就會在在一個RTT時間內只發(fā)送4個包,通過大大幅減少進入網(wǎng)絡的數(shù)據(jù)包的方式,使測量到的RTT整體變小,進而提升后續(xù)的發(fā)展速率。
BBR算法主要處理階段包括:
1.起步階段
傳輸起步階段,與傳統(tǒng)算法基本一致,每次發(fā)送速率翻倍增長。不同的是,如果連續(xù)三次翻倍增長后,對比發(fā)現(xiàn)速率增長小于25%,意味著帶寬進入瓶頸,有部分數(shù)據(jù)進入了緩沖區(qū)。于是立即將發(fā)送速率減半,并進入排干階段。
2.排干階段
排干階段主要目的通過減半速率讓緩沖區(qū)逐漸清空數(shù)據(jù)。當outstanding package size(TCP發(fā)送出去還沒被對方ack的值)≤BtlBW×RTT,這代表緩沖區(qū)數(shù)據(jù)已經(jīng)處理完畢,所有流量都在鏈路中,就進入了穩(wěn)健階段。
3.穩(wěn)健階段
該階段主要任務就是穩(wěn)定發(fā)包。
同時,由于網(wǎng)絡中可用帶寬不是一成不變的,所以穩(wěn)健階段在不停地周期性探測最大可用帶寬的變化趨勢。簡單來說,就是周期性地將發(fā)送速率乘以一個大于1的系數(shù),檢查可用帶寬是否增加;同一周期內,再將發(fā)送速率除以同樣的系數(shù),保持平穩(wěn),并探測可用帶寬是否變小。
通過上述三個階段的處理,BBR對傳統(tǒng)算法進行了有效優(yōu)化,實了無論帶寬升降,TCP發(fā)送速率都是小范圍的波動,避免了突發(fā)的速率驟然升降,更好利用了可用帶寬。