轉自:https://www.cnblogs.com/wxgblogs/p/5616829.html
RED不是等到已經發生擁塞后才把所有隊列尾部的分組全部丟棄,而是在檢測到網絡擁塞的早期征兆時(即路由器的平均隊列長度超過一定門限值時),以概率p隨機丟棄分組,讓擁塞控制只在個別的TCP連接上執行,因而避免全局性的擁塞控制。
RED的關鍵就是選擇三個參數最小門限、最大門限、丟棄概率和計算平均隊列長度。最小門線必須足夠大,以保證路由器的輸出鏈路有較高的利用率。而最大門限和最小門限只差也應該足夠大,是的在一個TCP往返時間RTT中隊列的正常增長仍在最大門限之內。經驗證明:使最大門限等於最小門限的二倍是合適的。
TCP的流量控制

TCP報文段發送時機的選擇
TCP的擁塞控制
慢開始和擁塞避免
發送方維持一個叫做擁塞窗口cwnd(congestion window)的狀態變量。擁塞窗口的大小取決於網絡的擁塞程度,並且動態地在變化。發送方讓自己的發送窗口等於擁塞窗口,另外考慮到接受方的接收能力,發送窗口可能小於擁塞窗口。發送方控制擁塞窗口的原則是:只要網絡沒有出現擁塞,擁塞窗口就增大一些,以便把更多的分組發送出去。但是只要網絡出現擁塞,擁塞窗口就減小一些,以減少注入到網絡的分組數。
慢開始算法的思路就是:最初的TCP在連接建立成功后會向網絡中發送大量的數據包,這樣很容易導致網絡中路由器緩存空間耗盡,從而發生擁塞。因此新建立的連接不能夠一開始就大量發送數據包,而只能根據網絡情況逐步增加每次發送的數據量,以避免上述現象的發生。具體來說,當新建連接時,cwnd初始化為1個最大報文段(MSS)大小,發送端開始按照擁塞窗口大小發送數據,每當有一個報文段被確認,cwnd就增加至多1個MSS大小。用這樣的方法來逐步增大擁塞窗口CWND。
這里用報文段的個數的擁塞窗口大小舉例說明慢開始算法,實時擁塞窗口大小是以字節為單位的。如下圖:
為了防止cwnd增長過大引起網絡擁塞,還需設置一個慢開始門限ssthresh狀態變量。ssthresh的用法如下:
當cwnd<ssthresh時,使用慢開始算法。
當cwnd>ssthresh時,改用擁塞避免算法。
當cwnd=ssthresh時,慢開始與擁塞避免算法任意。
擁塞避免算法思路:讓擁塞窗口緩慢增長,即每經過一個往返時間RTT就把發送方的擁塞窗口cwnd加1,而不是加倍。這樣擁塞窗口按線性規律緩慢增長。
無論是在慢開始階段還是在擁塞避免階段,只要發送方判斷網絡出現擁塞(其根據就是沒有收到確認,雖然沒有收到確認可能是其他原因的分組丟失,但是因為無法判定,所以都當做擁塞來處理),就把慢開始門限設置為出現擁塞時的發送窗口大小的一半。然后把擁塞窗口設置為1,執行慢開始算法。這樣做的目的就是要迅速減少主機發送到網絡中的分組數,使得發生擁塞的路由器有足夠時間把隊列中積壓的分組處理完畢。
乘法減小和加法增大
乘法減小:是指不論在慢開始階段還是擁塞避免階段,只要出現超時,就把慢開始門限減半,即設置為當前的擁塞窗口的一半(於此同時,執行慢開始算法)。當網絡出現頻繁擁塞時,ssthresh值就下降的很快,以大大將小注入到網絡中的分組數。
加法增大:是指執行擁塞避免算法后是擁塞窗口緩慢增大,以防止網絡過早出現擁塞。
快重傳和快恢復

快重傳配合使用的還有快恢復算法,有以下兩個要點:
①當發送方連續收到三個重復確認時,就執行“乘法減小”算法,把ssthresh門限減半。但是接下去並不執行慢開始算法。
②考慮到如果網絡出現擁塞的話就不會收到好幾個重復的確認,所以發送方現在認為網絡可能沒有出現擁塞。所以此時不執行慢開始算法,而是將cwnd設置為ssthresh減半后的大小,然后執行擁塞避免算法。如下圖:
在采用快恢復算法時,慢開始算法只是在TCP連接建立時和網絡出現超時時才使用。
接受窗口又稱為通知窗口。因此從接收方對發送方的流量控制角度考慮,發送方的發送窗口一定不能超過對方給出的接受窗口的RWND。
也就是說:發送窗口的上限=Min[rwnd,cwnd].
隨機早期檢測RED
以上的擁塞避免算法並沒有和網絡層聯系起來,實際上網絡層的策略對擁塞避免算法影響最大的就是路由器的丟棄策略。在簡單的情況下路由器通常按照先進先出的策略處理到來的分組。當路由器的緩存裝不下分組的時候就丟棄到來的分組,這叫做尾部丟棄策略。這樣就會導致分組丟失,發送方認為網絡產生擁塞。更為嚴重的是網絡中存在很多的TCP連接,這些連接中的報文段通常是復用路由路徑。若發生路由器的尾部丟棄,可能影響到很多條TCP連接,結果就是這許多的TCP連接在同一時間進入慢開始狀態。這在術語中稱為全局同步。全局同步會使得網絡的通信量突然下降很多,而在網絡恢復正常之后,其通信量又突然增大很多。
為避免發生網路中的全局同步現象,路由器采用隨機早期檢測(RED:randomearly detection)。該算法要點如下:
使路由器的隊列維持兩個參數,即隊列長隊最小門限min和最大門限max,每當一個分組到達的時候,RED就計算平均隊列長度。然后分情況對待到來的分組:
①平均隊列長度小於最小門限——把新到達的分組放入隊列排隊。
②平均隊列長度在最小門限與最大門限之間——則按照某一概率將分組丟棄。
③平均隊列長度大於最大門限——丟棄新到達的分組。
RED不是等到已經發生擁塞后才把所有隊列尾部的分組全部丟棄,而是在檢測到網絡擁塞的早期征兆時(即路由器的平均隊列長度超過一定門限值時),以概率p隨機丟棄分組,讓擁塞控制只在個別的TCP連接上執行,因而避免全局性的擁塞控制。
RED的關鍵就是選擇三個參數最小門限、最大門限、丟棄概率和計算平均隊列長度。最小門線必須足夠大,以保證路由器的輸出鏈路有較高的利用率。而最大門限和最小門限只差也應該足夠大,是的在一個TCP往返時間RTT中隊列的正常增長仍在最大門限之內。經驗證明:使最大門限等於最小門限的二倍是合適的。
平均隊列長度采用加權平均的方法計算平均隊列長度,這和往返時間(RTT)的計算策略是一樣的。