1.網絡擁塞簡述
IP層是基於塊狀的Packet報文來分片發送的,因此,TCP協議需要將應用交付給它的字符流拆分成多個Packet(在TCP傳輸層被稱為Segment)發送,由於網速有變化且接收主機的處理性能有限,TCP還要決定何時發送這些Segment。TCP滑動窗口解決了Client、Server這兩台主機的問題,但沒有去管連接中大量路由器、交換機轉發IP報文的問題,因此當瓶頸路由器的輸入流大於其輸出流時,便會發生擁塞。如果發送方不管不顧,那么瓶頸路由器的緩沖隊列填滿后便會發生大量丟包,且此時RTT(報文往返時間)由於存在長隊列而極高。
如上圖,最好的狀態是沒有隊列,此時RTT最低,而State2中RTT升高,但沒有丟包,到State 3隊列滿時開始發生丟包
2.BBR技術簡述
TCP的擁塞控制便用於解決上述問題。在BBR出現前,擁塞控制分為四個部分:慢啟動、擁塞避免、快速重傳、快速恢復。它的意義是在不知道連接的瓶頸帶寬時,以起始較低的發送速率,以每RTT兩倍的速度快速增加發送速率,直到到達一個閾值,到該閾值后,進入線性提高發送速率的階段,該階段叫做擁塞避免,直到發生丟包,。丟包后,發速速率大幅下降,針對丟包使用快速重傳算法重送發送,同時也使用快速恢復算法把發送速率盡量平滑的升上來。如果瓶頸路由器的緩存特別大,那么這種以丟包作為探測依據的擁塞算法將會導致嚴重問題:TCP鏈路上長時間RTT變大,但吞吐量維持不變。
如CUBIC這樣基於丟包的擁塞控制算法在圖2中的第2條灰色豎線發生作用,這已經太晚了,因為此時瓶頸路由器已經達到上限,緩沖隊列已經滿載。更好的作用點是BDP上限開始發揮作用時,也就是第1條灰色豎線,是瓶頸路由器的緩沖隊列剛剛開始積壓時的節點。BBR通過檢測RTprop和BtlBw來實現擁塞控制。
RTprop:光信號從A端到B端的最小時延(其實是2倍時延,因為是一個來回),這取決於物理距離。
BtlBw:在A到B的鏈路中,它的帶寬取決於最慢的那段鏈路的帶寬,稱為瓶頸帶寬。
BDP:整條物理鏈路(不含路由器緩存)所能儲藏的比特數據之和,BDP = BtlBw * RTprop
TCP BBR協議定義的帶寬(delivery rate)= 數據量/從發送出去至收到ACK的時長
這里注意,RTporp和RTT是不一樣的,RTT里含有報文在路由器隊列里的排隊時間、ACK的延遲確認時間等。TCP每個報文必須被確認,確認動作是通過接收端發送ACK報文實現的,但由於TCP和IP頭部有40個字節,如果不攜帶數據只為發送ACK網絡效率過低,所以會讓獨立的ACK報文等一等,看看有沒有數據發的時候順便帶給對方,或者等等看多個ACK一起發,叫做延遲確認。所以,可以用下列公式表示RTT與RTprop的差別:
RTT我們可以測量得出,我們只需要找到瓶頸路由器隊列為空時多次RTT測量的最小值即為RTporo
當RTprop升高時我們便得到了BtlBw,這便找到第1條灰色豎線最好的擁塞控制點,也有了后續發送速率的依據。基於BBR算法,由於瓶頸路由器的隊列為空,最直接的影響就是RTT大幅下降,而因為沒有丟包,BBR傳輸速率也會有大幅提升。
除此之外,BBR會嘗試周期性的探測新的瓶頸帶寬,這個周期值為1.25、0.75、1、1、1、1,以此來應對鏈路發生了切換,新的瓶頸帶寬變大或者變小的情況。1.25會使得BBR嘗試發送更多的報文,而如果產生了隊列積壓,0.75則會釋放隊列。
3.BBR算法與Cubic算法數據對比
下圖是10Mbps、40ms網絡的慢啟動階段,該網絡中未確認的字節數應為10Mbps*0.04s=0.05MB。棕色線條是CUBIC算法下已發送字節數,而藍色是ACK已確認字節數,綠色則是BBR算法下的已發送字節數。顯然,最初CUBIC與BBR算法相同,在0.25秒時飛行字節數顯然遠超過了0.05MB字節數,大約在 0.1MB字節數也就是2倍BDP。大約在0.3秒時,CUBIC開始線性增加擁塞窗口,而到了0.5秒后BBR開始降低發送速率,即排空瓶頸路由器的擁塞隊列,到0.75秒時飛行字節數調整到了BDP大小,這是最合適的發送速率。
當繁忙的網絡出現大幅丟包時,BBR的表現也遠好於CUBIC算法。下圖中,丟包率從0.001%到50%時,可以看到綠色的BBR遠好於紅色的CUBIC。大約當丟包率到0.1%時,CUBIC由於不停的觸發擁塞算法,所以吞吐量極速降到10Mbps只有原先的1/10,而BBR直到5%丟包率才出現明顯的吞吐量下降。CUBIC造成瓶頸路由器的緩沖隊列越來越滿,RTT時延就會越來越大,而操作系統對三次握手的建立是有最大時間限制的,這導致建CUBIC下的網絡極端擁塞時,新連接很難建立成功。
4.總結
BBR算法的優勢:
- 在有一定丟包率的網絡鏈路上充分利用帶寬。
- 降低網絡鏈路上的 buffer 占用率,從而降低延遲。
BBR算法的不足:
設備隊列緩存較大時,BBR可能會競爭不過Cubic等比較激進算法。
BBR算法適用范圍:
高帶寬、高時延、有一定丟包率的長肥網絡,可以有效降低傳輸時延,並保證較高的吞吐量。