TCP 擁塞控制(慢開始 擁塞避免 快重傳 快恢復)

前言

所謂擁塞控制,是指防止過多的數據注入網絡,以使網絡中的路由器或鏈路不致過載。出現擁塞時,端點並不瞭解到擁塞發生的細節面對通信連接的端點來說,擁塞往往表現爲通信時延的增加,當然,擁塞控制和流量控制也有相似的地方,即他們都通過控制發送方發送數據的速率來達到控制效果。

擁塞控制與流量控制的區別:擁塞控制時讓網絡能承受現有的網絡負荷,是一個全局性的過程,涉及所有的主機、所有的路由器,以及與降低網絡傳輸性能相關的所有因素。相反,流量控制往往是指點對點的通信量的控制,即接收端控制發送端,它所要做的是抑制發送端發送數據的速率,一遍使接收端來得及接收。

比如:某個鏈路的傳輸速率爲10Gb/s,某巨型機向一臺PC以1Gb/s的速率傳送文件,顯然網絡的帶寬使足夠大的,不存在擁塞問題,但如此高的發送速率將導致PC可能來不及接收,因此必須進行流量控制。但若有100萬臺PC在此鏈路上以1Mb/s的速率傳送文件,則現在的問題就變成了網絡的負載是否超過了現有網絡所能承受的範圍。

爲了更好地對傳輸層進行擁塞控制,因特網建議標準定義了以下4中算法:滿開始、擁塞避免、快重傳、快恢復。

發送方在確定發送報文段的速率時,既要根據接收方的接收能力,又要從全局考慮不要使網絡發生擁塞。因此,TCP協議要求發送方維護以下兩個窗口:

  • (1)接收窗口rwnd(receive windows):接收方根據目前接收緩存大小所許諾的最新窗口值,反映接收方的容量。由接收方根據其放在TCP報文的首部的窗口字段通知發送方。
  • (2)擁塞窗口cwnd(congestion windows):發送方根據自己估算的網絡擁塞程度而設置的窗口值,反映網絡的當前容量。只要網絡未出現擁塞,擁塞窗口就再增大一些,以便把更多的分組發送出去。但只要網絡出現擁塞,擁塞窗口就減小一些,以減少注入網絡的分組數。

發送窗口的上限值應取接收窗口rwnd和擁塞窗口cwnd中較小的一個

                                                                發送窗口的上限值 = min{rwnd,cwnd}

注:接收方總有足夠大的緩存空間,因而發送窗口大小由網絡的擁塞程度決定,也就是說,可以將發送窗口等同爲擁塞窗口。

🤔思考:接收窗口的大小我們知道可以根據TCP報文首部的窗口字段通知發送方,而發送方如何維護擁塞窗口呢?

慢開始和擁塞避免

慢開始算法

再TCP剛剛連接好並開始發送TCP報文段時,先令擁塞窗口cwnd = 1,每經過一個傳輸輪船(即往返時延RTT),擁塞窗口就會加倍,即cwnd得大小指數式增長。這樣慢開始一直把擁塞窗口cwnd增大到一個規定得慢開始門限ssthresh(閥值),然後改用擁塞避免算法

擁塞避免算法

發送端得擁塞窗口美經過一個往返時延RTT就增加一個MSS得大小,而不是加倍,使cwnd按線性規律增長(即加法增大),而當出現一次超時(網絡擁塞)時,令慢開始門限ssthresh等於當前cwnd的一半(即乘法減小),但不能小於2,同時cwnd重新設置爲1,執行慢開始算法。

根據cwnd得大小執行不同得算法,可歸納如下:

  • 當cwnd < ssthresh,使用慢開始算法
  • 當cwnd > ssthresh時,停止使用慢開始算法改用擁塞避免算法。
  • 當cwnd = ssthresh時,既可以使用慢開始算法,又可使用擁塞避免算法(通常爲擁塞避免算法)

慢開始和擁塞避免算法以及擁塞處理示意圖:

 

快重傳和快恢復

快重重和快恢復算法時對慢開始和擁塞避免算法的改進

快重傳

快重傳技術使用冗餘ACK來檢測丟包的發生。同樣,冗餘ACK也用於網絡擁塞檢測(丟了包當然意味着網絡可能出現了擁塞)。快重傳並非取消重傳計時器,而是再某些情況下可更早地重傳丟失的報文段。

發送方連續收到三個重複的ACK報文時,直接重傳對方尚未收到的報文端,而不必等待那個報文段設置的重傳計時器超時

快恢復

快恢復算法的原理是:發送端收到連續三個冗餘ACK(即重複確認)時,執行“乘法減小”算法,把門限ssthresh設置爲出現擁塞時發送方cwnd的一半,與慢開始把cwnd設置爲1的不同之處是。它把cwnd的值設置爲門限ssthresh改變後的數值,然後開始執行擁塞避免算法(“加法增大”),使擁塞窗口緩慢地線性增大。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章