1.1TCP 基於丟包的擁塞控制
TCP擁塞控制將丟包視為網絡出現擁塞的信號,以下為其四個主要過程:
(1)慢啟動階段(slow start)
當建立新的TCP連接時,擁塞窗口(congestion window,cwnd)初始化為一個數據包大小。源端按cwnd大小發送數據,每收到一個ACK確認,cwnd就增加一個數據包發送量,這樣cwnd就隨着回路響應時間(Round Trip Time,RTT)的增加呈指數增長。
TCP擁塞控制將丟包視為網絡出現擁塞的信號,以下為其四個主要過程:

(1)慢啟動階段(slow start)
當建立新的TCP連接時,擁塞窗口(congestion window,cwnd)初始化為一個數據包大小。源端按cwnd大小發送數據,每收到一個ACK確認,cwnd就增加一個數據包發送量,這樣cwnd就隨着回路響應時間(Round Trip Time,RTT)的增加呈指數增長。
(2)擁塞避免階段(congestion avoidance)
如果TCP源端發現超時或收到3個相同ACK時,即認為網絡發生了擁塞。此時就進入擁塞避免階段。慢啟動閾值(ssthresh)被設置為當前擁塞窗口大小的一半;如果超時,擁塞窗口被置1。當cwnd>ssthresh,TCP就執行擁塞避免算法,此時,cwnd在每次收到一個ACK時只增加1/cwnd個數據包。這樣,在一個RTT內,cwnd將增加1,所以在擁塞避免階段,cwnd線性增長。
如果TCP源端發現超時或收到3個相同ACK時,即認為網絡發生了擁塞。此時就進入擁塞避免階段。慢啟動閾值(ssthresh)被設置為當前擁塞窗口大小的一半;如果超時,擁塞窗口被置1。當cwnd>ssthresh,TCP就執行擁塞避免算法,此時,cwnd在每次收到一個ACK時只增加1/cwnd個數據包。這樣,在一個RTT內,cwnd將增加1,所以在擁塞避免階段,cwnd線性增長。
(3)快速重傳階段(Fast Retransmit)
快重傳要求接收方在收到一個失序的報文段后就立即發出重復確認(為的是使發送方及早知道有報文段沒有到達對方)而不要等到自己發送數據時捎帶確認。快重傳算法規定,發送方只要一連收到三個重復確認ACK就應當立即重傳對方尚未收到的報文段,而不必繼續等待設置的重傳計時器RTO超時。
快重傳要求接收方在收到一個失序的報文段后就立即發出重復確認(為的是使發送方及早知道有報文段沒有到達對方)而不要等到自己發送數據時捎帶確認。快重傳算法規定,發送方只要一連收到三個重復確認ACK就應當立即重傳對方尚未收到的報文段,而不必繼續等待設置的重傳計時器RTO超時。
(4)快速恢復階段(Fast Recovery)
與快速重傳配合使用,有以下兩個要點:
①當發送方連續收到三個重復確認時,就執行“乘法減小”算法,即把ssthresh門限減半。但是接下去並不執行慢開始算法。
②考慮到如果網絡出現擁塞的話就不會收到好幾個重復的確認,所以發送方現在認為網絡可能沒有出現擁塞。所以此時不執行慢開始算法,而是將cwnd設置為ssthresh的大小,然后執行擁塞避免算法。
與快速重傳配合使用,有以下兩個要點:
①當發送方連續收到三個重復確認時,就執行“乘法減小”算法,即把ssthresh門限減半。但是接下去並不執行慢開始算法。
②考慮到如果網絡出現擁塞的話就不會收到好幾個重復的確認,所以發送方現在認為網絡可能沒有出現擁塞。所以此時不執行慢開始算法,而是將cwnd設置為ssthresh的大小,然后執行擁塞避免算法。
2.BBR動機
2.1 基於丟包的擁塞控制算法的兩大缺陷
(1)不能區分是擁塞導致的丟包還是錯誤丟包
基於丟包的擁塞控制方法把數據包的丟失解釋為網絡發生了擁塞,而假定鏈路錯誤造成的分組丟失是忽略不計的,這種情況是基於當時V. Jacobson的觀察,認為鏈路錯誤的幾率太低從而可以忽略,然而在高速網絡中,這種假設是不成立的,當數據傳輸速率比較高時,鏈路錯誤是不能忽略的。在無線網絡中,鏈路的誤碼率更高,因此,如果籠統地認為分組丟失就是擁塞所引起的,從而降低一半的速率,是對網絡資源的極大浪費。
2.1 基於丟包的擁塞控制算法的兩大缺陷
(1)不能區分是擁塞導致的丟包還是錯誤丟包
基於丟包的擁塞控制方法把數據包的丟失解釋為網絡發生了擁塞,而假定鏈路錯誤造成的分組丟失是忽略不計的,這種情況是基於當時V. Jacobson的觀察,認為鏈路錯誤的幾率太低從而可以忽略,然而在高速網絡中,這種假設是不成立的,當數據傳輸速率比較高時,鏈路錯誤是不能忽略的。在無線網絡中,鏈路的誤碼率更高,因此,如果籠統地認為分組丟失就是擁塞所引起的,從而降低一半的速率,是對網絡資源的極大浪費。
(2)引起緩沖區膨脹
我們會在網絡中設置一些緩沖區,用於吸收網絡中的流量波動,在連接的開始階段,基於丟包的擁塞控制方法傾向於填滿緩沖區。當瓶頸鏈路的緩沖區很大時,需要很長時間才能將緩沖區中的數據包排空,造成很大的網絡延時,這種情況稱之為緩沖區膨脹。在一個先進先出隊列管理方式的網絡中,過大的buffer以及過長的等待隊列,在某些情況下不僅不能提高系統的吞吐量甚至可能導致系統的吞吐量近乎於零。並且當所有緩沖區都被填滿時,會出現丟包。
我們會在網絡中設置一些緩沖區,用於吸收網絡中的流量波動,在連接的開始階段,基於丟包的擁塞控制方法傾向於填滿緩沖區。當瓶頸鏈路的緩沖區很大時,需要很長時間才能將緩沖區中的數據包排空,造成很大的網絡延時,這種情況稱之為緩沖區膨脹。在一個先進先出隊列管理方式的網絡中,過大的buffer以及過長的等待隊列,在某些情況下不僅不能提高系統的吞吐量甚至可能導致系統的吞吐量近乎於零。並且當所有緩沖區都被填滿時,會出現丟包。
3.BBR基本觀點
(1)不考慮丟包
(2)估計最優工作點 (max BW, min RTT)
(1)不考慮丟包
(2)估計最優工作點 (max BW, min RTT)
上圖紅色圓圈所示即為網絡工作的最優點,此時數據包的投遞率=BtlBW(瓶頸鏈路帶寬),保證了瓶頸鏈路被100%利用;在途數據包總數=BDP(時延帶寬積),保證未占用buffer。
然而max BW和min RTT不能被同時測得。要測量最大帶寬,就要把瓶頸鏈路填滿,此時buffer中有一定量的數據包,延遲較高。要測量最低延遲,就要保證buffer為 空,網絡中數據包越少越好,但此時帶寬較低。
BBR的解決辦法是:
交替測量帶寬和延遲,用一段時間內的帶寬極大值和延遲極小值作為估計值。
4.設計細節
4.1BBR的四個狀態(啟動、排空、帶寬探測、時延探測)
4.1BBR的四個狀態(啟動、排空、帶寬探測、時延探測)
(1)當連接建立時,BBR采用類似標准TCP的slow start,指數增加發送速率,目的也是盡可能快的占滿管道,經過三次發現投遞率不再增長,說明管道被填滿,開始占用buffer它進入排空階段(事實上此時占的是三倍帶寬*延遲)
(2)在排空階段,指數降低發送速率,(相當於是startup的逆過程)將多占的2倍buffer慢慢排空
(3)完成上面兩步,進入穩定狀態后,BBR改變發送速率進行帶寬探測:先在一個RTT時間內增加發送速率探測最大帶寬,如果RTT沒有變化,后減小發送速率排空前一個RTT多發出來地包,后面6個周期使用更新后的估計帶寬發包
(4)還有一個階段是延遲探測階段:BBR每過10秒,如果估計延遲不變,就進入延遲探測階段,為了探測最小延遲,BBR在這段時間內發送窗口固定為4個包,即幾乎不發包,占整個過程2%的時間。
4.2帶寬的動態更新(帶寬探測)
帶寬探測占據BBR絕大部分時間。在startup階段,BBR已經得到網絡帶寬的估計值。在帶寬探測階段,BBR利用一個叫做 cycle gain的數組控制發送速率,進行帶寬的更新。cycle gain數組的值為 5/4, 3/ 4, 1, 1, 1, 1, 1, 1,BBR將max BtlBW*cycle gain的值作為發送速率。一個完整的cycle包含8個階段, 每個階段持續時間為一個RTprop。
故如果數組的值是1,就保持當前的發送速率,如果是1.25,就增加發送速率至1.25倍BW,如果是0.75,BBR減小發送速率至0.75倍BW。
故如果數組的值是1,就保持當前的發送速率,如果是1.25,就增加發送速率至1.25倍BW,如果是0.75,BBR減小發送速率至0.75倍BW。
上圖顯示的是一個a 10-Mbps, 40-ms的數據流在第20s時網絡帶寬增加一倍至20 Mbp時,BBR是如何更新的。向上的尖峰表明它增加發送速率,向下的尖峰表明它降低發送速率,如果帶寬不變,增加發送速率肯定會使RTT增加,降低發送速率是為了讓他要把上一周期多發的包排空,如果帶寬增加,則增加發包速率時RTT不變。這樣經過三個周期之后,估計的帶寬也增加了一倍。
。
上圖所示為在第40s,是當網絡帶寬由20 Mbps減半至10 Mbps時,BBR的帶寬探測如何發揮作用。因為發送速率不變,inflight增加,多出來的數據包占用了buffer,RTT增加,BBR從而減小發送速率,經過4秒后,有效帶寬也降低為一半。
4.3多條BBR數據流分享瓶頸鏈路帶寬
上圖所示為多條獨立的BBR數據流分享100-Mbps/10-ms瓶頸鏈路的情況:一條連接獨占整個鏈路時,它的可用帶寬近似為鏈路的物理帶寬,n條連接共享鏈路時,最理想最公平的情況就是BW/n。每條連接的startup階段都會嘗試增加帶寬,所以吞吐量會有一個向上的尖峰,已經在鏈路中的連接會檢測到擁塞而減小自己的發送速率,吞吐量會下降。
最后通過反復的帶寬探測,他們都會趨於收斂,帶寬得到均分。
最后通過反復的帶寬探測,他們都會趨於收斂,帶寬得到均分。
