1 慢開始
基於窗口的擁塞控制,發送方維持一個擁塞窗口cwnd,擁塞窗口的大小取決於網絡的擁塞程度,並且動態變化,發送方使自己的發送窗口小於等於擁塞窗口,實現擁塞控制。
擁塞窗口cwnd的變化:
- 主機開始發送數據時,現將cwnd設置爲1-4個發送方的最大報文段SMSS。
- 每收到一個對新的報文段的確認,就把擁塞窗口增大最多一個SMSS的數值。
- 每經過一個傳輸輪次,cwnd大小就加倍。
- 爲防止cwnd增長過大,需要設置一個慢開始門限ssthresh,cwnd超過ssthresh時就不再使用慢開始算法,改用擁塞避免算法。
2 擁塞避免
擁塞避免算法:
- 擁塞避免算法讓cwnd緩慢地增大,沒經過一個傳輸倫次,cwnd+1,也就是加法增大。
- 如果出現超時,就把ssthresh=cwnd/2,cwnd=1。重新開始慢開始算法
- 如果連續收到三個重複確認,就立即進行重傳。ssthresh=cwnd/2,cwnd=ssthresh,進行擁塞控制算法。這稱爲乘法減小,二者合在一起就是所謂的AIMD算法。
從流量控制考慮,發送方的窗口不能超過接收方給出的接受窗口值。
從擁塞控制考慮,發送方的窗口不能超過擁塞窗口。
實際上發送方的窗口上限值=min(rwnd,cwnd)。
3 主動隊列管理AQM
在路由器中,隊列通常按先進先出的順序轉發,當隊列已滿時,就會把後來的分組丟棄。因此就會產生超時重傳。
在實際使用中,通常有很多TCP連接的報文段是複用在網絡層的IP數據報中發送,因此一旦產生尾部丟棄,就或有多個TCP連接在同一時間進入到慢開始狀態,這稱爲全局同步。而網絡恢復後,通信量又會變大很多。
爲了避免全局同步現象,提出了主動隊列管理,也就是不等到隊列滿再丟棄尾部,而是稍微提前一些丟棄一些分組,使一些TCP連接提前進入慢開始,從而消除全局同步。其中就有流行多年的早期隨機檢測RED,其規則如下:
- 路由器維持兩個參數,即隊列最大門限和最小門限,當新到達一個分組時,如果當前隊列大小小於最小門限,就將新分組加入隊列。
- 如果當前隊列大小大於最大門限,就丟棄新分組。
- 如果當前隊列大小介於最小門限和最大門限之間,就以一定概率p丟棄新分組。