TCP擁塞控制
計算機網絡中的帶寬、交換結點中的緩存和處理機等,都是網絡的資源。在某段時間,若對網絡中某一資源的需求超過了該資源所能提供的可用部分,網絡的性能就會變壞。這種情況就叫做擁塞。
擁塞控制就是防止過多的數據注入網絡中,這樣可以使網絡中的路由器或鏈路不致過載。擁塞控制是一個全局性的過程,和流量控制不同,流量控制對接收者的,它是通過控制發送者的發送速度保證接收者能夠來得及接收。
慢開始算法 和 擁塞避免算法
發送方維持一個叫做擁塞窗口cwnd(congestion window)的狀態變量。發送窗口是動態變化的,擁塞窗口的大小取決於網絡的擁塞程度,發送方讓自己的發送窗口等於擁塞窗口,另外考慮到接受方的接收能力,發送窗口可能小於擁塞窗口。
慢開始算法的思路就是,開始發送時先發送少量分組,探測一下網絡的擁塞程度,也就是說由小到大逐漸增加擁塞窗口的大小。
這里用報文段的個數的擁塞窗口大小舉例說明慢開始算法,實時擁塞窗口大小是以字節為單位的。如下圖:
為了防止cwnd增長過大引起網絡擁塞,發送方維護一個慢開始門限
發送窗口 < 慢開始門限:使用慢開始算法
發送窗口 > 慢開始門限:使用擁塞避免算法
發送窗口 = 慢開始門限:使用慢開始算法或擁塞避免算法
算法的具體過程:
通信開始時,發送方的發送窗口設為1,並發送第一個分組M1;
接收方收到M1后,返回確認應答,此時發送方發送窗口擴大兩倍,並發送M2、M3;(即,發送方每次收到確認應答后,都將發送窗口設為當前值的兩倍)
若發送窗口>慢開始門限,則使用擁塞避免算法,每次收到確認應答后都將發送窗口+1;
若發送方出現了超時重傳,則表明網絡出現擁塞,此時:
a)慢開始門限設為當前發送窗口的一半;
b)發送窗口設為1;
c)啟用擁塞避免算法;
在發送超時重傳時,發送窗口有可能已經超過了慢開始門限,也有可能還沒超過;此時不管何種情況,都一律啟用擁塞避免算法,並執行上述三步操作!
慢開始算法的作用:慢開始算法將發送窗口從小擴大,而且按指數級擴大,從而避免一開始就往網絡中注入過多的分組從而導致擁塞;它將窗口慢慢擴大的過程其實也在探測網絡擁塞情況的過程,當發現出現擁塞時,及時降低發送速度,從而減緩網絡擁塞。
擁塞避免算法的作用:擁塞避免算法使發送窗口以線性方式增長,而非指數級增長,從而使網絡更加不容易發生擁塞。
AIMD算法(加法增大乘法減小算法)
慢開始算法 和 擁塞避免算法 還有個名稱叫做『加法增大乘法減小算法』。
加法增加:指的是擁塞避免算法,使得發送窗口以線性的方式增長;
乘法減小:指的是不管當前正使用慢開始算法還是擁塞避免算法,只要發生擁塞時,慢開始門限將會變成當前窗口的一半。
快重傳算法 和 快恢復算法
上述慢開始算法和擁塞避免算法能保證網絡出現擁塞時進行相應的處理,而快重傳和快恢復是一種擁塞預防的方式,此時網絡可能尚未出現擁塞,但已經有擁塞的征兆,因此得作出一些預防措施。
快重傳和快恢復
快重傳原理:因為TCP具有累計確認的能力,因此接收者收到一個分組的時候不會立即發出應答,可能需要等待收到多個分組之后再同一發出累計確認。但快重傳算法就要求,接收者如果接收到一個亂序的分組的話,就必須立即發出前一個正確分組的確認應答,這樣能讓發送者盡早地知道有一個分組可能丟失,快重傳算法規定,發送方只要一連收到三個重復確認就應當立即重傳對方尚未收到的報文段,而不必繼續等待設置的重傳計時器時間到期。如下圖:
快恢復原理:當發送者收到同一個分組的三個確認應答后,就基本可以判斷這個分組已經丟失了;這時候無需等待超時,直接執行『乘法減小加法增大』: 將慢開始門限ssthresh減半,但是接下去並不執行慢開始算法。考慮到如果網絡出現擁塞的話就不會收到好幾個重復的確認,所以發送方現在認為網絡可能沒有出現擁塞。所以此時不執行慢開始算法,而是將cwnd設置為ssthresh的大小,然后執行擁塞避免算法。如下圖:
隨機早期檢測RED
以上的擁塞避免算法並沒有和網絡層聯系起來,實際上網絡層的策略對擁塞避免算法影響最大的就是路由器的丟棄策略。在簡單的情況下路由器通常按照先進先出的策略處理到來的分組。當路由器的緩存裝不下分組的時候就丟棄到來的分組,這叫做尾部丟棄策略。這樣就會導致分組丟失,發送方認為網絡產生擁塞。更為嚴重的是網絡中存在很多的TCP連接,這些連接中的報文段通常是復用路由路徑。若發生路由器的尾部丟棄,可能影響到很多條TCP連接,結果就是這許多的TCP連接在同一時間進入慢開始狀態。這在術語中稱為全局同步。全局同步會使得網絡的通信量突然下降很多,而在網絡恢復正常之后,其通信量又突然增大很多。
為避免發生網路中的全局同步現象,路由器采用隨機早期檢測(RED:randomearly detection)。該算法要點如下:
使路由器的隊列維持兩個參數,即隊列長隊最小門限min和最大門限max,每當一個分組到達的時候,RED就計算平均隊列長度。然后分情況對待到來的分組:
①平均隊列長度小於最小門限——把新到達的分組放入隊列排隊。
②平均隊列長度在最小門限與最大門限之間——則按照某一概率將分組丟棄。
③平均隊列長度大於最大門限——丟棄新到達的分組。
以概率p隨機丟棄分組,讓擁塞控制只在個別的TCP連接上執行,因而避免全局性的擁塞控制。
RED的關鍵就是選擇三個參數最小門限、最大門限、丟棄概率和計算平均隊列長度。平均隊列長度采用加權平均的方法計算平均隊列長度,這和往返時間(RTT)的計算策略是一樣的。
轉載 https://blog.csdn.net/sicofield/article/details/9708383