天天看點

擁塞控制的辦法

慢開始階段

發送方維持一個叫做擁塞視窗 cwnd (congestion window)的狀态變量。擁塞視窗的大小取決于網絡的擁塞程度,并且動态地在變化。發送方讓自己的發送視窗等于擁塞視窗。如再考慮到接收方的接收能力,則發送視窗還可能小于擁塞視窗。

發送方控制擁塞視窗的原則是:隻要網絡沒有出現擁塞,擁塞視窗就再增大一些,以便把更多的資料發送出去。但隻要網絡出現擁塞,擁塞視窗就減小一些,以減少注入到網絡中的資料包。

慢開始算法的原理:

在主機剛剛開始發送封包段時可先設定擁塞視窗 cwnd = 1,即設定為一個最大封包段 MSS 的數值。

在每收到一個對新的封包段的确認後,将擁塞視窗加 1,即增加一個 MSS 的數值。 (最初始時視窗大小是1,然後發送一個封包,然後得到确認,于是視窗變成2,然後就可以一次發送2 個封包,然後這2個封包都得到确認,于是視窗+2等于4,然後就可以一次發送4個封包,然後這4個封包都得到接收方的确認,于是視窗+4等于8,依次類推)

用這樣的方法逐漸增大(​

​其實是以2的指數級增大​

​)發送端的擁塞視窗 cwnd,可以使分組注入到網絡的速率更加合理
擁塞控制的辦法

綜上就是慢開始算法的原理

擁塞避免算法

當擁塞視窗cwnd超過了慢開始門限,則每次收到确認後,隻讓擁塞視窗+1

設定慢開始門限狀态變量:

慢開始門限 ssthresh 的用法如下:

當 cwnd < ssthresh 時,使用慢開始算法。

當 cwnd > ssthresh 時,停止使用慢開始算法而改用擁塞避免算法。

當 cwnd = ssthresh 時,既可使用慢開始算法,也可使用擁塞避免算法。

擁塞避免算法的思路是讓擁塞視窗 cwnd 緩慢地增大,即每經過一個輪次就把發送方的擁塞視窗 cwnd 加 1,而不是加倍,使擁塞視窗 cwnd 按線性規律緩慢增長。

當網絡出現擁塞時:

無論在慢開始階段還是在擁塞避免階段,隻要發送方判斷網絡出現擁塞(其根據就是沒有按時收到确認),就要把慢開始門限 ssthresh設定為出現擁塞時的發送方視窗值cwnd 的一半(但不能小于2)。

然後把擁塞視窗 cwnd 重新設定為 1,執行慢開始算法。

這樣做的目的就是要迅速減少主機發送到網絡中的分組數,使得發生擁塞的路由器有足夠時間把隊列中積壓的分組處理完畢。

繼續閱讀