袁希群
鐵嶺廣播電視大學(xué)(鐵嶺 112000)
Internet網(wǎng)絡(luò)是分組交換網(wǎng)絡(luò),資源為眾多用戶(hù)共享,無(wú)法根據(jù)資源狀態(tài)限制用戶(hù)數(shù)量,同時(shí)也無(wú)法控制用戶(hù)使用資源的數(shù)量。如果網(wǎng)絡(luò)中的報(bào)文數(shù)量過(guò)多,網(wǎng)絡(luò)來(lái)不及處理,勢(shì)必導(dǎo)致網(wǎng)絡(luò)擁塞,嚴(yán)重時(shí)甚至?xí)?dǎo)致網(wǎng)絡(luò)通信陷入停頓,即出現(xiàn)死鎖現(xiàn)象。擁塞控制就是TCP為了應(yīng)對(duì)IP網(wǎng)絡(luò)的擁塞情況而對(duì)發(fā)送方進(jìn)行發(fā)送速率控制的一種服務(wù)。引發(fā)控制的原因就是網(wǎng)絡(luò)堵塞。
擁塞是一種持續(xù)過(guò)載的網(wǎng)絡(luò)狀態(tài),此時(shí)用戶(hù)對(duì)網(wǎng)絡(luò)資源的需求超過(guò)了固有的容量。就Internet的體系結(jié)構(gòu)而言,擁塞的發(fā)生是其固有的屬性。因?yàn)樵谑孪葲](méi)有任何協(xié)商和請(qǐng)求許可機(jī)制的資源共享網(wǎng)絡(luò)中,幾個(gè)IP分組同時(shí)到達(dá)路由器,并期望經(jīng)同一個(gè)輸出端口轉(zhuǎn)發(fā)的可能性是存在的,顯然,不是所有分組可以同時(shí)接受處理,必須有一個(gè)服務(wù)順序,中間節(jié)點(diǎn)上的緩存為等候服務(wù)的分組提供一定保護(hù)。然而,如果此狀況具有一定的持續(xù)性,當(dāng)緩存空間被耗盡時(shí),路由器只有丟棄分組。當(dāng)網(wǎng)絡(luò)中存在過(guò)多的報(bào)文時(shí),網(wǎng)絡(luò)的性能就會(huì)相應(yīng)下降,這種現(xiàn)象就被成為擁塞。
造成網(wǎng)絡(luò)擁塞的原因:①多條流入線(xiàn)路有分組到達(dá),并需要同一輸出線(xiàn)路,此時(shí),如果路由器沒(méi)有足夠的內(nèi)存來(lái)存放所有這些分組,那么有的分組就會(huì)丟失;②路由器的慢帶處理器的緣故,以至于難以完成必要的處理工作,如緩沖區(qū)排隊(duì)、更新路由表等。
防止擁塞的方法:①在傳輸層可采用:重傳策略、亂序緩存策略、確認(rèn)策略、流控制策略和確定超時(shí)策略。②在網(wǎng)絡(luò)層可采用:子網(wǎng)內(nèi)部的虛電路與數(shù)據(jù)報(bào)策略、分組排隊(duì)和服務(wù)策略、分組丟棄策略、路由算法和分組生存管理。③在數(shù)據(jù)鏈路層可采用:重傳策略、亂序緩存策略、確認(rèn)策略和流控制策略。
發(fā)送報(bào)文段速率的確定,既要根據(jù)接收端的接收能力,又要從全局考慮不要使網(wǎng)絡(luò)發(fā)生擁塞,這由接收端窗口和擁塞窗口兩個(gè)狀態(tài)變量確定。接收端窗口rwnd(receiver window)又稱(chēng)通知窗口(advertised window),是接收端根據(jù)目前的接收緩存大小所許諾的最新窗口值,是來(lái)自接收端的流量控制。擁塞窗口cwnd(congestion window)是發(fā)送端根據(jù)自己估計(jì)的網(wǎng)絡(luò)擁塞程度而設(shè)置的窗口值,是來(lái)自發(fā)送端的流量控制。
發(fā)送端發(fā)送窗口的上限值應(yīng)當(dāng)取接收端窗口rwnd和擁塞窗口cwnd之中較小的那一個(gè),即發(fā)送窗口的上限值=Min[rwnd,cwnd]。也就是說(shuō)TCP發(fā)送端的發(fā)送速率是受目的主機(jī)或網(wǎng)絡(luò)中較慢的一個(gè)約束。
慢開(kāi)始原理可以歸結(jié)為三點(diǎn)。
(1)當(dāng)主機(jī)開(kāi)始發(fā)送數(shù)據(jù)時(shí),如果立即將較大的發(fā)送窗口中的全部數(shù)據(jù)字節(jié)都注入到網(wǎng)絡(luò)中,那么由于不清楚網(wǎng)絡(luò)的情況,有可能引起網(wǎng)絡(luò)擁塞;
(2)比較好的方法是試探一下,即從小到大逐漸增大發(fā)送端的擁塞窗口數(shù)值;
(3)通常在剛剛開(kāi)始發(fā)送報(bào)文段時(shí)可以現(xiàn)將擁塞窗口 cwnd設(shè)置為一個(gè)最大報(bào)文段 MSS的數(shù)值。在每收到一個(gè)對(duì)新報(bào)文段的確認(rèn)后,將擁塞窗口增加至多一個(gè) MSS的數(shù)值。當(dāng) rwnd足夠大的時(shí)候,為了防止擁塞窗口cwnd的增長(zhǎng)引起網(wǎng)絡(luò)擁塞,還需另外一個(gè)變量——慢開(kāi)始門(mén)限ssthresh。
擁塞控制的具體過(guò)程為。
(1)TCP連接初始化,將擁塞窗口 cwnd值置為1;
(2)執(zhí)行慢開(kāi)始算法,cwnd按指數(shù)規(guī)律增長(zhǎng)。直到cwnd=ssthresh,開(kāi)始執(zhí)行擁塞避免算法,cwnd按線(xiàn)性規(guī)律增長(zhǎng);
(3)當(dāng)網(wǎng)絡(luò)發(fā)生擁塞,把 ssthresh值更新為擁塞前ssthresh值的一半,cwnd重新設(shè)置為1,按步驟(2)執(zhí)行。
在這里強(qiáng)調(diào)一下,慢開(kāi)始的“慢”并不是指擁塞窗口cwnd的增長(zhǎng)速率慢,即使cwnd增長(zhǎng)得很快,和一開(kāi)始就將cwnd設(shè)置為較大的數(shù)值相比,使用慢開(kāi)始算法可以使發(fā)送端在開(kāi)始發(fā)送時(shí)向網(wǎng)絡(luò)注入的分組數(shù)大大減少。慢開(kāi)始按指數(shù)規(guī)律增長(zhǎng),擁塞避免按線(xiàn)性規(guī)律增長(zhǎng)。判斷網(wǎng)絡(luò)發(fā)生擁塞的依據(jù)是發(fā)送方未按時(shí)收到ACK(TCP數(shù)據(jù)包首部中的確認(rèn)標(biāo)志,對(duì)已接收到的 TCP報(bào)文進(jìn)行確認(rèn)。)或收到了重復(fù)的 ACK?!皳砣苊狻辈⒎侵改軌蛲耆苊鈸砣钦f(shuō)在擁塞避免階段將擁塞窗口控制為按線(xiàn)性規(guī)律增長(zhǎng),使得網(wǎng)絡(luò)不容易出現(xiàn)擁塞。
一條TCP連接有時(shí)會(huì)因等待重傳計(jì)時(shí)器的超時(shí)而空閑較長(zhǎng)的時(shí)間,慢開(kāi)始和擁塞控制算法又無(wú)法很好地解決這類(lèi)問(wèn)題,因此提出了快重傳和快恢復(fù)的擁塞控制算法??熘貍魉惴ú⒎侨∠酥貍鳈C(jī)制,只是在某些情況下更早地重傳丟失的報(bào)文段(如果當(dāng)發(fā)送端接連收到三個(gè)重復(fù)的確認(rèn)ACK時(shí),則斷定分組丟失,立即重傳丟失的報(bào)文段,而不必等待重傳計(jì)時(shí)器超時(shí))??旎謴?fù)算法常常與快重傳算法配合使用,當(dāng)不使用快恢復(fù)算法時(shí),發(fā)送端發(fā)現(xiàn)網(wǎng)絡(luò)出現(xiàn)擁塞就將擁塞窗口降低為1,然后執(zhí)行慢開(kāi)始算法,這樣做會(huì)導(dǎo)致網(wǎng)絡(luò)不能很快地恢復(fù)到正常工作狀態(tài)。當(dāng)使用快恢復(fù)算法時(shí),慢開(kāi)始算法只是在TCP建立時(shí)才使用。
網(wǎng)絡(luò)層策略對(duì)TCP擁塞控制影響最大的就是路由器數(shù)據(jù)報(bào)丟失策略。為了避免發(fā)生網(wǎng)絡(luò)中的全局同步現(xiàn)象,可以在路由器采用隨機(jī)早期丟棄RED(Random Early Discard,隨機(jī)早期檢測(cè))。RED正常工作的關(guān)鍵就是要選擇好三個(gè)參數(shù):最小門(mén)限THmin、最大門(mén)限THmax和概率p。RED中的“隨機(jī)”就體現(xiàn)在概率p上,也就是說(shuō)RED不是等到已經(jīng)發(fā)生網(wǎng)絡(luò)擁塞后才將所有在隊(duì)列尾部的數(shù)據(jù)全部丟棄,而是在檢測(cè)到網(wǎng)絡(luò)擁塞的早期征兆時(shí),就先以概率p丟棄個(gè)別數(shù)據(jù)報(bào),讓擁塞控制只在個(gè)別TCP連接上進(jìn)行,因而避免發(fā)生全局的擁塞控制??傊?,隨機(jī)早期丟棄RED算法使得路由器可以更好的管理其隊(duì)列長(zhǎng)度。采用RED的好處就是當(dāng)平均隊(duì)列長(zhǎng)度超過(guò)門(mén)限THmin時(shí),就會(huì)有少量的數(shù)據(jù)報(bào)被丟棄,從而避免網(wǎng)絡(luò)擁塞的發(fā)生。
(1) TCP Vegas
1994年,Brakmo提出了一種新的擁塞控制機(jī)制TCP Vegas,從另外的一個(gè)角度來(lái)進(jìn)行擁塞控制。從前面可以看到,TCP的擁塞控制是基于網(wǎng)絡(luò)丟包,一旦出現(xiàn)丟包,于是調(diào)整擁塞窗口,然而由于丟包不一定是由于網(wǎng)絡(luò)進(jìn)入了擁塞,但是由于RTT(Round-Trip Time,往返時(shí)延)值與網(wǎng)絡(luò)運(yùn)行情況有比較密切的關(guān)系,于是TCP Vegas利用RTT值的改變來(lái)判斷網(wǎng)絡(luò)是否擁塞,從而調(diào)整擁塞控制窗口。如果發(fā)現(xiàn)RTT在增大,Vegas就認(rèn)為網(wǎng)絡(luò)正在發(fā)生擁塞,于是開(kāi)始減小擁塞窗口,如果RTT變小,Vegas認(rèn)為網(wǎng)絡(luò)擁塞正在逐步解除,于是再次增加擁塞窗口。由于Vegas不是利用丟包來(lái)判斷網(wǎng)絡(luò)可用帶寬,而是利用RTT變化來(lái)判斷,因而可以更精確的探測(cè)網(wǎng)絡(luò)的可用帶寬,從而效率更好。TCP Vegas也存在一定的缺陷,在這里就不再闡述了。
(2) Limited transmit算法
這個(gè)算法是在擁塞窗口比較小的時(shí)候如果在一個(gè)傳輸窗口內(nèi)有多個(gè)包丟失時(shí)比較有效率的恢復(fù)算法。Limited Transmit就是當(dāng)收到兩個(gè)重復(fù)ACK時(shí),開(kāi)始檢測(cè)兩個(gè)條件:①接收方的通告窗口rwnd是否允許傳輸新的數(shù)據(jù)包,即是否滿(mǎn)足rwnd>cwnd?;②停留在網(wǎng)絡(luò)中的數(shù)據(jù)包個(gè)數(shù)是否小于或等于cwnd+2?
如果這兩個(gè)條件都滿(mǎn)足的話(huà),那么TCP再發(fā)送新的數(shù)據(jù)包,其實(shí)第二個(gè)條件換個(gè)意思理解就是說(shuō)在這種情況下可以超出擁塞窗口最多再發(fā)送兩個(gè)數(shù)據(jù)包。假設(shè)新的數(shù)據(jù)包和相應(yīng)的ACK不被丟失的話(huà),那么有了這兩個(gè)新的數(shù)據(jù)包,從而發(fā)送端與接收端就可以立即從相互等待的僵局中恢復(fù)出來(lái),發(fā)送方接著進(jìn)入標(biāo)準(zhǔn)的快速恢復(fù)。注意的是盡管可以發(fā)送兩個(gè)新的數(shù)據(jù)包,但是cwnd的值要保持不變,而不能把它增加2。顯然Limited Transmit算法比利用超時(shí)重傳在包亂序時(shí)具有更好的魯棒性。
擁塞控制不僅是網(wǎng)絡(luò)穩(wěn)定、高效運(yùn)行的關(guān)鍵,同時(shí)又是實(shí)現(xiàn)各種服務(wù)質(zhì)量的基礎(chǔ)和前提。實(shí)際的網(wǎng)絡(luò)是一個(gè)不斷發(fā)展的系統(tǒng),網(wǎng)絡(luò)擁塞控制研究也是一個(gè)非常困難、有挑戰(zhàn)性的研究領(lǐng)域。對(duì)于網(wǎng)絡(luò)擁塞控制的研究仍有許多工作要做。
[1]徐昌彪,鮮永菊.計(jì)算機(jī)網(wǎng)絡(luò)中的擁塞控制與流量控制.北京:人民郵電出版社,2007.
[2]孫知信.網(wǎng)絡(luò)異常流量識(shí)別與監(jiān)控技術(shù)研究.北京:清華大學(xué)出版社,2010.
[3]王崇,張大方,曾彬.高速網(wǎng)絡(luò)中TCP擁塞控制算法的研究和改進(jìn).計(jì)算機(jī)技術(shù)與自動(dòng)化,2007(3).
[4]王秀利.網(wǎng)絡(luò)擁塞控制及拒絕服務(wù)攻擊防范.北京:郵電大學(xué)出版社,2009.
[5]季敏,張利萍.網(wǎng)絡(luò)擁塞控制概述.軍民兩用技術(shù)與產(chǎn)品,2006(8).
[6]孫德輝.網(wǎng)絡(luò)化控制系統(tǒng)--理論、技術(shù)及工程應(yīng)用.北京:國(guó)防工業(yè)出版社,2008.