路由器沒法處理高速到達的數據而被迫丟棄數據的現象叫作擁塞。算法
TCP流量控制時爲了平衡一個連接中接收方和發送方的速度匹配問題,當發送方發現發送速度大於接收方的接收速度時動態調整發送速度。網絡
可是成千上萬的TCP連接共享着整個網絡基礎設施,當網絡上這些TCP都在傳輸數據時,網絡有可能就會擁塞,TCP的擁塞控制就是在傳輸本身數據的同時實時掌握整個網絡的負載,而後基於整個網絡的負載來動態調整本身的發送速度。blog
擁塞時路由器丟失數據,丟失後基於可靠性傳輸的機制,發送方會重傳數據,重傳會再次加大網絡負載,致使更大的開銷。資源
在多路由器的狀況下,會致使更大的資源浪費,好比數據有A傳遞到B通過了三個路由器,結果被第三個路由器給丟棄了。這樣前兩個路由器的工做全被白白浪費。以下圖所示,R3擁塞,A--》B的數據到達R3以後最終被丟棄了,R一、R2的工做被白白浪費。路由
因而可知,擁塞控制勢在必行。io
網絡層不提供擁塞控制機制,主要依靠端系統對網絡的觀察來調整發送的速度最終完成擁塞的控制(好比端系統經過觀察丟包的狀況來判斷)。TCP/IP就是經過端到端的方法來解決擁塞控制(讓TCP來控制,IP無論)。基礎
核心:觀察,感知,調整,解決。TCP的擁塞控制方法。路由器
由路由器告知發送方網絡是否擁塞,主要兩種:方法
報文不詳細展開。im
TCP擁塞控制屬於端到端的控制方法,其核心即是觀察感知網絡的擁塞狀態,而後調整發送速度。在TCP中引入了擁塞窗口(cwnd:congestion window),流量控制中引入了接收窗口(rwnd:receive window)。最終TCP的發送窗口爲min{cwnd,rwnd}。
對於TCP來講核心兩點:
下面的即將要介紹的幾個方法都是基於上面的兩個核心來展開的。
慢啓動就是TCP啓動後的發送速度慢慢的進行提速,這樣才能便於感知網絡的情況。
慢啓動的核心算法:
慢啓動時cwnd時指數級增加,當增加的到ssthresh後便進入避免擁塞。避免擁塞算法比較簡單:
可見擁塞避免算法實際是將cwnd的增加由指數級增加變爲了一個線性緩慢增加。以下圖所示。
TCP認爲發生擁塞由兩種狀況:
TCP超時後的具體動做:
收到三次連續相同的ACK,說明產生了丟包,可是能收到ACK,說明超時相對不是那麼嚴重。因此針對這種狀況,TCP的作法沒有超時那麼激進:
以上介紹了TCP擁塞控制的一個總體過程。本文完。