TCP擁塞控制原理

1、何爲擁塞

路由器沒法處理高速到達的數據而被迫丟棄數據的現象叫作擁塞。算法

2、何爲擁塞控制

TCP流量控制時爲了平衡一個連接中接收方和發送方的速度匹配問題,當發送方發現發送速度大於接收方的接收速度時動態調整發送速度。網絡

可是成千上萬的TCP連接共享着整個網絡基礎設施,當網絡上這些TCP都在傳輸數據時,網絡有可能就會擁塞,TCP的擁塞控制就是在傳輸本身數據的同時實時掌握整個網絡的負載,而後基於整個網絡的負載來動態調整本身的發送速度。blog

3、網絡擁塞的開銷

擁塞時路由器丟失數據,丟失後基於可靠性傳輸的機制,發送方會重傳數據,重傳會再次加大網絡負載,致使更大的開銷。資源

在多路由器的狀況下,會致使更大的資源浪費,好比數據有A傳遞到B通過了三個路由器,結果被第三個路由器給丟棄了。這樣前兩個路由器的工做全被白白浪費。以下圖所示,R3擁塞,A--》B的數據到達R3以後最終被丟棄了,R一、R2的工做被白白浪費。路由

因而可知,擁塞控制勢在必行。io

4、擁塞控制的基本方法

4.1 端到端的擁塞控制

網絡層不提供擁塞控制機制,主要依靠端系統對網絡的觀察來調整發送的速度最終完成擁塞的控制(好比端系統經過觀察丟包的狀況來判斷)。TCP/IP就是經過端到端的方法來解決擁塞控制(讓TCP來控制,IP無論)。基礎

核心:觀察,感知,調整,解決。TCP的擁塞控制方法。路由器

4.2 網絡輔助的擁塞控制

 由路由器告知發送方網絡是否擁塞,主要兩種:方法

  1. 路由器直接高速發送方網絡情況
  2. 當發送擁塞時,路由器在當前報文中標識擁塞,當接收方拿到這個擁塞標識後,由接收方告知發送方網絡擁塞,這種方式至少要一個RTT發送方纔能知道擁塞。

報文不詳細展開。im

5、TCP擁塞控制方法

TCP擁塞控制屬於端到端的控制方法,其核心即是觀察感知網絡的擁塞狀態,而後調整發送速度。在TCP中引入了擁塞窗口(cwnd:congestion window),流量控制中引入了接收窗口(rwnd:receive window)。最終TCP的發送窗口爲min{cwnd,rwnd}。

5.1 如何感知網絡?

對於TCP來講核心兩點:

  1. 丟包(超時,或者三次冗餘ack)就表明網絡擁塞,須要減小cwnd的size。
  2. 確認表明網絡暢通,能夠加大cwnd的size。確認的越快cwnd增長的越快(反之亦然)。自計時(self-clocking)

下面的即將要介紹的幾個方法都是基於上面的兩個核心來展開的。

5.2 慢啓動(Slow Start)

慢啓動就是TCP啓動後的發送速度慢慢的進行提速,這樣才能便於感知網絡的情況。

慢啓動的核心算法:

  1. 剛開始cwnd=1個MSS(max segment size)
  2. 每當收到一個ack,cwnd=cwnd+1。這樣每過一個RTT。cwnd便會翻倍:cwnd=cwnd*2,這是指數級增長
  3. 當cwnd=ssthresh(慢啓動閾值,slow start threshold)時,中止指數級增長,進入避免擁塞流程。

5.3 擁塞避免

慢啓動時cwnd時指數級增加,當增加的到ssthresh後便進入避免擁塞。避免擁塞算法比較簡單:

  1. 每收到一個ack,cwnd=cwnd+1/cwnd;
  2. 因而可知,每過一個RTT。cwnd=cwnd+1

可見擁塞避免算法實際是將cwnd的增加由指數級增加變爲了一個線性緩慢增加。以下圖所示。

5.4 擁塞發生(感知到擁塞)

TCP認爲發生擁塞由兩種狀況:

  • 超時
  • 收到連續三次相同的ACK(快速重傳的場景)

5.4.1 超時

TCP超時後的具體動做:

  • ssthresh=cwnd/2
  • cwnd=1
  • 進入慢啓動流程

 

5.4.2 連續三次相同的ACK

  • 進入快速恢復流程

5.5 快速恢復

 收到三次連續相同的ACK,說明產生了丟包,可是能收到ACK,說明超時相對不是那麼嚴重。因此針對這種狀況,TCP的作法沒有超時那麼激進:

  • ssthresh=cwnd
  • cwnd=cwnd/2+3,3表明連續收到了3個ACK,累加三個窗口大小。
  • 進入擁塞避免流程

 以上介紹了TCP擁塞控制的一個總體過程。本文完。

相關文章
相關標籤/搜索