TCP的擁塞控制機制主要是以下四種機制:
慢啟動(慢開始)
擁塞避免
快速重傳
快速恢復
(1)慢啟動(慢開始)
在開始發送的時候設置cwnd = 1(cwnd指的是擁塞窗口)
思路:開始的時候不要發送大量數據,而是先測試一下網絡的擁塞程度,由小到大增加擁塞窗口的大小。
為了防止cwnd增長過大引起網絡擁塞,設置一個慢開始門限(ssthresh 狀態變量)當cnwd < ssthresh,使用慢開始算法當cnwd = ssthresh,既可使用慢開始算法,也可以使用擁塞避免算法當cnwd > ssthresh,使用擁塞避免算法
(2)擁塞避免
擁塞避免未必能夠完全避免擁塞,是說在擁塞避免階段將擁塞窗口控制為按線性增長,使網絡不容易出現阻塞。
思路: 讓擁塞窗口cwnd緩慢的增大,即每經過一個返回時間RTT就把發送方的擁塞控制窗口加一
無論是在慢開始階段還是在擁塞避免階段,只要發送方判斷網絡出現擁塞,就把慢開始門限設置為出現擁塞時的發送窗口大小的一半。然后把擁塞窗口設置為1,執行慢開始算法。如圖所示:
其中,判斷網絡出現擁塞的根據就是沒有收到確認,雖然沒有收到確認可能是其他原因的分組丟失,但是因為無法判定,所以都當做擁塞來處理。
(3)快速重傳
快重傳要求接收方在收到一個失序的報文段后就立即發出重復確認(為的是使發送方及早知道有報文段沒有到達對方)。發送方只要連續收到三個重復確認就立即重傳對方尚未收到的報文段,而不必繼續等待設置的重傳計時器時間到期。
由于不需要等待設置的重傳計時器到期,能盡早重傳未被確認的報文段,能提高整個網絡的吞吐量
(4)快速恢復
當發送方連續收到三個重復確認時,就執行“乘法減小”算法,把ssthresh門限減半。但是接下去并不執行慢開始算法。
考慮到如果網絡出現擁塞的話就不會收到好幾個重復的確認,所以發送方現在認為網絡可能沒有出現擁塞。所以此時不執行慢開始算法,而是將cwnd設置為ssthresh的大小,然后執行擁塞避免算法。