慢開始階段
發送方維持一個叫做擁塞視窗 cwnd (congestion window)的狀态變量。擁塞視窗的大小取決于網絡的擁塞程度,并且動态地在變化。發送方讓自己的發送視窗等于擁塞視窗。如再考慮到接收方的接收能力,則發送視窗還可能小于擁塞視窗。
發送方控制擁塞視窗的原則是:隻要網絡沒有出現擁塞,擁塞視窗就再增大一些,以便把更多的資料發送出去。但隻要網絡出現擁塞,擁塞視窗就減小一些,以減少注入到網絡中的資料包。
慢開始算法的原理:
在主機剛剛開始發送封包段時可先設定擁塞視窗 cwnd = 1,即設定為一個最大封包段 MSS 的數值。
在每收到一個對新的封包段的确認後,将擁塞視窗加 1,即增加一個 MSS 的數值。 (最初始時視窗大小是1,然後發送一個封包,然後得到确認,于是視窗變成2,然後就可以一次發送2 個封包,然後這2個封包都得到确認,于是視窗+2等于4,然後就可以一次發送4個封包,然後這4個封包都得到接收方的确認,于是視窗+4等于8,依次類推)
用這樣的方法逐漸增大(
)發送端的擁塞視窗 cwnd,可以使分組注入到網絡的速率更加合理
其實是以2的指數級增大
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiQDOxEzX3xCZlhXam9VbsUmepNXZy9CXwJWZ3xCdh1mcvZ2Lc1zaHRGcWdUYuVzVa9GczoVdG1mWfVGc5RHLwIzX39GZhh2csATMflHLwEzX4xSZz91ZsAzMfRHLGZkRGZkRfJ3bs92YskmNhVTYykVNQJVMRhXVEF1X0hXZ0xiNx8VZ6l2cssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLyYDMzUWOiJGN0UGZiFTNyYzX2UTOwEDMwEzLcRDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
綜上就是慢開始算法的原理
擁塞避免算法
當擁塞視窗cwnd超過了慢開始門限,則每次收到确認後,隻讓擁塞視窗+1
設定慢開始門限狀态變量:
慢開始門限 ssthresh 的用法如下:
當 cwnd < ssthresh 時,使用慢開始算法。
當 cwnd > ssthresh 時,停止使用慢開始算法而改用擁塞避免算法。
當 cwnd = ssthresh 時,既可使用慢開始算法,也可使用擁塞避免算法。
擁塞避免算法的思路是讓擁塞視窗 cwnd 緩慢地增大,即每經過一個輪次就把發送方的擁塞視窗 cwnd 加 1,而不是加倍,使擁塞視窗 cwnd 按線性規律緩慢增長。
當網絡出現擁塞時:
無論在慢開始階段還是在擁塞避免階段,隻要發送方判斷網絡出現擁塞(其根據就是沒有按時收到确認),就要把慢開始門限 ssthresh設定為出現擁塞時的發送方視窗值cwnd 的一半(但不能小于2)。
然後把擁塞視窗 cwnd 重新設定為 1,執行慢開始算法。
這樣做的目的就是要迅速減少主機發送到網絡中的分組數,使得發生擁塞的路由器有足夠時間把隊列中積壓的分組處理完畢。