TCP的擁塞控制機制

咱們知道TCP經過一個定時器(timer)採樣了RTT並計算RTO,可是,若是網絡上的延時忽然增長,那麼,TCP對這個事作出的應對只有重傳數據,然而重傳會致使網絡的負擔更重,因而會致使更大的延遲以及更多的丟包,這就致使了惡性循環,最終造成「網絡風暴」 —— TCP的擁塞控制機制就是用於應對這種狀況。
首先須要瞭解一個概念,爲了在發送端調節所要發送的數據量,定義了一個「擁塞窗口」(Congestion Window),在發送數據時,將擁塞窗口的大小與接收端ack的窗口大小作比較,取較小者做爲發送數據量的上限。
擁塞控制主要是四個算法:算法

1.慢啓動:意思是剛剛加入網絡的鏈接,一點一點地提速,不要一上來就把路佔滿。
鏈接建好的開始先初始化cwnd = 1,代表能夠傳一個MSS大小的數據。
每當收到一個ACK,cwnd++; 呈線性上升
每當過了一個RTT,cwnd = cwnd*2; 呈指數讓升
閾值ssthresh(slow start threshold),是一個上限,當cwnd >= ssthresh時,就會進入「擁塞避免算法」
2.擁塞避免:當擁塞窗口 cwnd 達到一個閾值時,窗口大小再也不呈指數上升,而是以線性上升,避免增加過快致使網絡擁塞。
每當收到一個ACK,cwnd = cwnd + 1/cwnd
每當過了一個RTT,cwnd = cwnd + 1
擁塞發生:當發生丟包進行數據包重傳時,表示網絡已經擁塞。分兩種狀況進行處理:
等到RTO超時,重傳數據包
sshthresh = cwnd /2
cwnd 重置爲 1
3.進入慢啓動過程
在收到3個duplicate ACK時就開啓重傳,而不用等到RTO超時
sshthresh = cwnd = cwnd /2
進入快速恢復算法——Fast Recovery
4.快速恢復:至少收到了3個Duplicated Acks,說明網絡也不那麼糟糕,能夠快速恢復。
cwnd = sshthresh + 3 * MSS (3的意思是確認有3個數據包被收到了)
重傳Duplicated ACKs指定的數據包
若是再收到 duplicated Acks,那麼cwnd = cwnd +1
若是收到了新的Ack,那麼,cwnd = sshthresh ,而後就進入了擁塞避免的算法了。網絡

相關文章
相關標籤/搜索