1、引言
計算機網(wǎng)絡中的帶寬官觅、交換結(jié)點中的緩存和處理機等,都是網(wǎng)絡的資源阐污。在某段時間缰猴,若對網(wǎng)絡中某一資源的需求超過了該資源所能提供的可用部分,網(wǎng)絡的性能就會變壞疤剑。這種情況就叫做擁塞。擁塞控制就是防止過多的數(shù)據(jù)注入網(wǎng)絡中闷堡,這樣可以使網(wǎng)絡中的路由器或鏈路不致過載隘膘。擁塞控制是一個全局性的過程,和流量控制不同杠览,流量控制指點對點通信量的控制弯菊。
2、慢開始與擁塞避免
發(fā)送方維持一個叫做 擁塞窗口cwnd(congestion window) 的狀態(tài)變量踱阿。擁塞窗口的大小取決于網(wǎng)絡的擁塞程度管钳,并且動態(tài)地在變化。發(fā)送方讓自己的發(fā)送窗口等于擁塞窗口软舌,另外考慮到接受方的接收能力才漆,發(fā)送窗口可能小于擁塞窗口。慢開始算法的思路就是佛点,不要一開始就發(fā)送大量的數(shù)據(jù)醇滥,先探測一下網(wǎng)絡的擁塞程度,也就是說由小到大逐漸增加擁塞窗口的大小超营。這里用報文段的個數(shù)的擁塞窗口大小舉例說明慢開始算法鸳玩,實時擁塞窗口大小是以字節(jié)為單位的。如下圖:
當然收到單個確認但此確認多個數(shù)據(jù)報的時候就加相應的數(shù)值演闭。所以一次傳輸輪次之后擁塞窗口就加倍不跟。這就是乘法增長,和后面的擁塞避免算法的加法增長比較米碰。為了防止cwnd增長過大引起網(wǎng)絡擁塞窝革,還需設置一個慢開始門限ssthresh狀態(tài)變量。ssthresh的用法如下:當cwnd<ssthresh時见间,使用慢開始算法聊闯。****當cwnd>ssthresh時,改用擁塞避免算法米诉。****當cwnd=ssthresh時菱蔬,慢開始與擁塞避免算法任意。擁塞避免算法讓擁塞窗口緩慢增長,即每經(jīng)過一個往返時間RTT就把發(fā)送方的擁塞窗口cwnd加1拴泌,而不是加倍魏身。這樣擁塞窗口按線性規(guī)律緩慢增長。無論是在慢開始階段還是在擁塞避免階段蚪腐,只要發(fā)送方判斷網(wǎng)絡出現(xiàn)擁塞(其根據(jù)就是沒有收到確認箭昵,雖然沒有收到確認可能是其他原因的分組丟失,但是因為無法判定回季,所以都當做擁塞來處理)家制,就把慢開始門限設置為出現(xiàn)擁塞時的發(fā)送窗口大小的一半。然后把擁塞窗口設置為1泡一,執(zhí)行慢開始算法颤殴。如下圖:
** 再次提醒這里只是為了討論方便而將擁塞窗口大小的單位改為數(shù)據(jù)報的個數(shù),實際上應當是字節(jié)鼻忠。**
3涵但、快重傳和快恢復
快重傳要求接收方在收到一個失序的報文段后就立即發(fā)出重復確認(為的是使發(fā)送方及早知道有報文段沒有到達對方)而不要等到自己發(fā)送數(shù)據(jù)時捎帶確認√快重傳算法規(guī)定矮瘟,發(fā)送方只要一連收到三個重復確認就應當立即重傳對方尚未收到的報文段,而不必繼續(xù)等待設置的重傳計時器時間到期塑娇。如下圖:
快重傳配合使用的還有快恢復算法澈侠,有以下兩個要點:①當發(fā)送方連續(xù)收到三個重復確認時,就執(zhí)行“乘法減小”算法埋酬,把ssthresh門限減半埋涧。但是接下去并不執(zhí)行慢開始算法。②考慮到如果網(wǎng)絡出現(xiàn)擁塞的話就不會收到好幾個重復的確認奇瘦,所以發(fā)送方現(xiàn)在認為網(wǎng)絡可能沒有出現(xiàn)擁塞棘催。所以此時不執(zhí)行慢開始算法,而是將cwnd設置為ssthresh的大小耳标,然后執(zhí)行擁塞避免算法醇坝。如下圖:
4、隨機早期檢測RED
以上的擁塞避免算法并沒有和網(wǎng)絡層聯(lián)系起來次坡,實際上網(wǎng)絡層的策略對擁塞避免算法影響最大的就是路由器的丟棄策略呼猪。在簡單的情況下路由器通常按照先進先出的策略處理到來的分組。當路由器的緩存裝不下分組的時候就丟棄到來的分組砸琅,這叫做尾部丟棄策略宋距。這樣就會導致分組丟失,發(fā)送方認為網(wǎng)絡產(chǎn)生擁塞症脂。更為嚴重的是網(wǎng)絡中存在很多的TCP連接谚赎,這些連接中的報文段通常是復用路由路徑淫僻。若發(fā)生路由器的尾部丟棄,可能影響到很多條TCP連接壶唤,結(jié)果就是這許多的TCP連接在同一時間進入慢開始狀態(tài)雳灵。這在術(shù)語中稱為全局同步。全局同步會使得網(wǎng)絡的通信量突然下降很多闸盔,而在網(wǎng)絡恢復正常之后悯辙,其通信量又突然增大很多。為避免發(fā)生網(wǎng)路中的全局同步現(xiàn)象迎吵,路由器采用隨機早期檢測(RED:randomearly detection)躲撰。該算法要點如下:使路由器的隊列維持兩個參數(shù),即隊列長隊最小門限min和最大門限max击费,每當一個分組到達的時候茴肥,RED就計算平均隊列長度。然后分情況對待到來的分組:①平均隊列長度小于最小門限——把新到達的分組放入隊列排隊荡灾。②平均隊列長度在最小門限與最大門限之間——則按照某一概率將分組丟棄。③平均隊列長度大于最大門限——丟棄新到達的分組瞬铸。
以概率p隨機丟棄分組批幌,讓擁塞控制只在個別的TCP連接上執(zhí)行,因而避免全局性的擁塞控制嗓节。RED的關(guān)鍵就是選擇三個參數(shù)最小門限荧缘、最大門限、丟棄概率和計算平均隊列長度拦宣。平均隊列長度采用加權(quán)平均的方法計算平均隊列長度截粗,這和往返時間(RTT)的計算策略是一樣的。