摘 要: 互聯(lián)網(wǎng)業(yè)務(wù)的快速發(fā)展使得網(wǎng)絡(luò)擁塞日益嚴(yán)重,因此如何減輕網(wǎng)絡(luò)擁塞也就成為當(dāng)前研究的熱點(diǎn)。針對(duì)這一問(wèn)題,首先敘述了TCP擁塞控制的基本原理及其相關(guān)算法;然后對(duì)擁塞控制算法進(jìn)行了詳細(xì)分析并提出了自適應(yīng)比例系數(shù)的新策略;最后對(duì)新策略進(jìn)行NS2仿真。仿真結(jié)果表明,新方法提高了包投遞率,降低了端到端時(shí)延。
關(guān)鍵詞: 擁塞控制;自適應(yīng);NS2
21世紀(jì)以來(lái),計(jì)算機(jī)網(wǎng)絡(luò)發(fā)生了突飛猛進(jìn)的發(fā)展,各種新業(yè)務(wù)在互聯(lián)網(wǎng)上的應(yīng)用也越來(lái)越廣泛,這就給帶寬有限的網(wǎng)絡(luò)帶來(lái)了巨大的負(fù)擔(dān),從而引發(fā)了嚴(yán)重的網(wǎng)絡(luò)擁塞問(wèn)題。
TCP是互聯(lián)網(wǎng)上應(yīng)用極其廣泛的基于滑動(dòng)窗口的擁塞控制協(xié)議。它使用了一種可靠的設(shè)計(jì)思路,這種思路具有較為簡(jiǎn)單、擴(kuò)展性強(qiáng)等特點(diǎn)。它能夠依據(jù)網(wǎng)絡(luò)的實(shí)際具體情況自動(dòng)地調(diào)整擁塞窗口的大小,使得TCP數(shù)據(jù)的發(fā)送能夠依據(jù)網(wǎng)絡(luò)的負(fù)擔(dān)自適應(yīng)地變化。但近年來(lái),互聯(lián)網(wǎng)上的用戶越來(lái)越多,業(yè)務(wù)量也隨之增加,網(wǎng)絡(luò)擁塞問(wèn)題亦越來(lái)越嚴(yán)重。因此,人們對(duì)擁塞控制的研究重視程度亦越來(lái)越高,先后提出了許多新的算法,如TCP Tahoe、TCP Reno、TCP New-Reno、TCP sack、TCP Vegas[1]。這些算法著重研究了快重傳和快恢復(fù)機(jī)制,而慢開(kāi)始和擁塞避免并無(wú)過(guò)多涉及。但慢啟動(dòng)和擁塞避免亦不能忽視,因?yàn)檫@些策略的好壞對(duì)擁塞控制機(jī)制的影響同樣是巨大的。針對(duì)該問(wèn)題,本文提出了一種自適應(yīng)比例系數(shù)的擁塞控制策略。
1 TCP擁塞控制原理及相關(guān)算法
互聯(lián)網(wǎng)擁塞控制主要由傳輸層完成,它通過(guò)改變一些主要的參數(shù)來(lái)降低發(fā)送端數(shù)據(jù)的發(fā)送速率。這些參數(shù)主要包括擁塞窗口cwnd(發(fā)送端一次最多發(fā)送的數(shù)據(jù)包的個(gè)數(shù))和慢開(kāi)始門限ssthresh(慢開(kāi)始階段與擁塞避免階段的分界點(diǎn))。
早期的擁塞控制協(xié)議中,發(fā)送端每發(fā)送一個(gè)報(bào)文就必須收到接收端返回的ACK后才能發(fā)送下一個(gè)報(bào)文。發(fā)送端在等待接收端發(fā)送ACK的期間內(nèi)不發(fā)送任何報(bào)文;當(dāng)報(bào)文丟失時(shí),必須等到計(jì)時(shí)器超時(shí)后才能重發(fā)丟失的數(shù)據(jù)包。顯然,這種策略嚴(yán)重地浪費(fèi)了網(wǎng)絡(luò)的帶寬,網(wǎng)絡(luò)傳輸數(shù)據(jù)的效率極其低下。
現(xiàn)在使用的擁塞控制協(xié)議采用了AMID[2]控制算法,能夠達(dá)到較好的擁塞控制效果,提高了網(wǎng)絡(luò)數(shù)據(jù)的傳輸效率,這種策略一般分為4個(gè)階段[3],具體如下:
(1)慢開(kāi)始階段。在TCP建立連接之初,如果發(fā)送方將cwnd設(shè)置為較大值,發(fā)送方有可能將較大的數(shù)據(jù)字節(jié)全部注入到網(wǎng)絡(luò)中,但此時(shí)并不清楚網(wǎng)絡(luò)的狀況,因此就有可能引起網(wǎng)絡(luò)擁塞。經(jīng)實(shí)際證明,最好的方法是試探一下,即由小到大逐漸增大發(fā)送端的cwnd數(shù)值。通常發(fā)送方在開(kāi)始發(fā)送數(shù)據(jù)報(bào)文段時(shí)將cwnd設(shè)置為一個(gè)最大的MSS數(shù)值,發(fā)送方每接收到接收方發(fā)來(lái)的一個(gè)ACK,就把cwnd增加一個(gè)值,直到cwnd增加到ssthresh(慢開(kāi)始門限值),此時(shí)進(jìn)入擁塞避免階段,采取擁塞避免算法。在采取擁塞避免算法之前,擁塞窗口cwnd的值以指數(shù)方式增長(zhǎng)。
(2)擁塞避免階段。當(dāng)cwnd值達(dá)到ssthresh(慢開(kāi)始門限值)時(shí),此后進(jìn)入擁塞避免階段,發(fā)送端的cwnd每經(jīng)過(guò)一個(gè)RTT(往返時(shí)延)就增加一個(gè)MSS的大?。ǘ还茉跁r(shí)間RTT內(nèi)收到了幾個(gè)接收端發(fā)送的ACK)。這樣,發(fā)送端cwnd就不再像慢開(kāi)始階段那樣進(jìn)行指數(shù)增長(zhǎng) ,而是按線性規(guī)律增長(zhǎng)(稱為加法增大),這比慢開(kāi)始算法的擁塞窗口增長(zhǎng)速率緩慢得多。在沒(méi)有丟包之前,該策略將一直持續(xù)下去。當(dāng)假定cwnd的數(shù)值增長(zhǎng)到N(N=24)時(shí),網(wǎng)絡(luò)出現(xiàn)超時(shí)(表明網(wǎng)絡(luò)擁塞了)。ssthresh置為N/2(為發(fā)送窗口數(shù)值的一半,這種算法稱為乘法減小),cwnd重置為1,并執(zhí)行慢開(kāi)始算法。當(dāng)cwnd=12時(shí)改為執(zhí)行擁塞避免算法,擁塞窗口按線性規(guī)律增長(zhǎng),每經(jīng)過(guò)一個(gè)RTT就增加一個(gè)MSS的大小。
(3)快重傳階段。前面的慢開(kāi)始和擁塞避免算法是在TCP早期使用的擁塞控制算法,后來(lái)人們對(duì)其進(jìn)行了改進(jìn),因此就有了快重傳和快恢復(fù)。假設(shè)發(fā)送端發(fā)送了M1~M4這4個(gè)報(bào)文段,當(dāng)接收端收到M1和M2后,就發(fā)出確認(rèn)ACK2和ACK3?,F(xiàn)假定M3丟失了,接收端收到下一個(gè)M4,發(fā)現(xiàn)其序號(hào)不對(duì),但仍收下放在接收緩存中,同時(shí)發(fā)出確認(rèn),但發(fā)出的是重復(fù)的ACK3(不能發(fā)送ACK5,因?yàn)锳CK5表示M4和M3都已經(jīng)收到了)。這樣發(fā)送端知道現(xiàn)在可能是網(wǎng)絡(luò)出現(xiàn)的擁塞造成了分組丟失或是M3仍滯留在網(wǎng)絡(luò)中某處,還需經(jīng)過(guò)較長(zhǎng)的時(shí)延才能到達(dá)接收端。發(fā)送端接著發(fā)送M5和M6,接收端收到了M5和M6后,還要分別發(fā)出重復(fù)的ACK3。這樣發(fā)送端共接收到了4個(gè)ACK3,其中3個(gè)是重復(fù)。如果快重傳算法規(guī)定,當(dāng)發(fā)送端連續(xù)收到3個(gè)重復(fù)的ACK時(shí)即可斷定有分組丟失了,就應(yīng)立即重傳丟失的報(bào)文而不必繼續(xù)等待為M3設(shè)置的重傳計(jì)時(shí)器超時(shí)。由此可知,快重傳并非取消重傳計(jì)時(shí)器,而是在某些情況下更早地重傳丟失的報(bào)文段。
(4)快恢復(fù)階段。與快重傳配合使用的還有快恢復(fù)算法,當(dāng)不使用快恢復(fù)算法時(shí),發(fā)送端若發(fā)現(xiàn)網(wǎng)絡(luò)出現(xiàn)擁塞就將擁塞窗口置為1,然后執(zhí)行慢開(kāi)始算法。但這樣做的缺點(diǎn)是網(wǎng)絡(luò)不能很快地恢復(fù)到正常狀態(tài)??旎謴?fù)算法可以較好地解決這一問(wèn)題。當(dāng)發(fā)送端連續(xù)接收到3個(gè)重復(fù)的ACK時(shí),就采用乘法減小設(shè)置ssthresh,與慢開(kāi)始不同的是cwnd設(shè)置為ssthresh+3×MSS,然后執(zhí)行擁塞避免算法,這樣可以使網(wǎng)絡(luò)快速恢復(fù)到正常水平(與cwnd設(shè)置為1相比),大大地提高了網(wǎng)絡(luò)的吞吐量。
TCP擁塞控制算法效果圖如圖1所示。
2 乘法減小及其存在問(wèn)題
當(dāng)假定cwnd的數(shù)值增長(zhǎng)到N(N=24)時(shí),網(wǎng)絡(luò)出現(xiàn)超時(shí)(表明網(wǎng)絡(luò)擁塞了)。ssthresh置為N/2,ssthresh的新數(shù)值為12,這種算法稱為“乘法減小”。進(jìn)一步說(shuō),“乘法減小”是指不論在慢開(kāi)始階段還是擁塞避免階段,只要出現(xiàn)一次超時(shí)(即出現(xiàn)一次網(wǎng)絡(luò)擁塞),就將慢開(kāi)始門限值ssthresh設(shè)置為當(dāng)前的擁塞窗口值的1/2。當(dāng)網(wǎng)絡(luò)頻繁出現(xiàn)擁塞時(shí),ssthresh值就會(huì)下降得很快,以大大減少注入到網(wǎng)絡(luò)中的分組數(shù)。但是網(wǎng)絡(luò)擁塞極其頻繁時(shí),這種固定比例的減小策略就會(huì)存在問(wèn)題,這種減小力度不夠大,仍會(huì)造成網(wǎng)絡(luò)十分擁堵,甚至使得網(wǎng)絡(luò)發(fā)生崩潰;當(dāng)網(wǎng)絡(luò)很少出現(xiàn)擁塞時(shí),這種固定的減小策略會(huì)使得注入網(wǎng)絡(luò)的分組數(shù)不夠多,從而造成網(wǎng)絡(luò)帶寬得不到充分利用,造成網(wǎng)絡(luò)資源的浪費(fèi)。
3 一種新的變比例因子的乘法減小策略
針對(duì)固定比例因子的“乘法減小”策略容易出現(xiàn)的一些問(wèn)題,本文提出了一種新的變比例因子的策略,其主要思路是在數(shù)據(jù)傳送初期設(shè)置4個(gè)參數(shù):3個(gè)時(shí)間參數(shù)t1、t2、△t和比例因子p,依據(jù)3個(gè)時(shí)間參數(shù)的變化來(lái)動(dòng)態(tài)調(diào)整比例因子p的大小,從而使得比例因子p根據(jù)網(wǎng)絡(luò)的狀況自適應(yīng)地變化。
具體思路:引入3個(gè)時(shí)間參數(shù)a、b、c和p(0<p<1)。t1是上次超時(shí)的時(shí)間,t2是本次超時(shí)的時(shí)間,△t是本次超時(shí)與上次超時(shí)的時(shí)間差,p是減小比例系數(shù)并賦初值為0.5。當(dāng)出現(xiàn)超時(shí)時(shí),比較t2-t1與△t的大小,(1)若t2-t1<△t,判斷p是否小于0.2,如果p<0.2,則p的值大小不變,且將t2-t的值賦給△t,將t2的值賦給t1;否則將p-0.2的值賦給p,將t2-t的值賦給△t,將t2的值賦給t1;(2)若t2-t1≥△t,判斷p是否小于0.8,如果p>0.8,則p的值大小不變,將t2-t的值賦給△t,t2的值賦給t1,否則將p+0.2的值賦給p,t2-t的值賦給△t,且將t2的值賦給t1。新策略的算法描述大致如下。
t1=初值;
t2=初值;
p=0.5 ;
if(超時(shí))
{
t2=getcurrenttime();
if(t2-t1>=△t)
{
if(p>0.8)
{
p=0.9;
ssthresh=(int)p×cwnd;
△t=t2-t1;
t1=t2;
}
else
{
p+= 0.2;
ssthresh=(int)p×cwnd;
△t=t2-t1;
t1=t2;
}
}
else
{
if(p<0.2)
{
p=0.1;
ssthresh=(int)p×cwnd;
△t=t2-t1;
t1=t2;
}
else
{
p-=0.2;
ssthresh=(int)p×cwnd;
△t=t2-t1;
t1=t2;
}
}
}
本文所提出的動(dòng)態(tài)變化系數(shù)策略如上所述,新策略可以根據(jù)網(wǎng)絡(luò)狀態(tài)的好壞動(dòng)態(tài)地調(diào)整系數(shù)p的大小。
4 仿真
4.1 仿真場(chǎng)景
為了證明新策略的有效性,本文使用NS2[4]網(wǎng)絡(luò)仿真軟件對(duì)未改進(jìn)的策略與改進(jìn)后的策略進(jìn)行了仿真對(duì)比。本文使用的網(wǎng)絡(luò)拓?fù)鋱D如圖2所示。
圖2中,s1、s2為發(fā)送端,t1、t2為干路的路由器,r1、r2為接收端。在上面的拓?fù)鋱D中,建立了兩條鏈路,一條為s1將數(shù)據(jù)通過(guò)干路路由器轉(zhuǎn)發(fā),將數(shù)據(jù)發(fā)送到r1;另一條為s2將數(shù)據(jù)通過(guò)干路路由器轉(zhuǎn)發(fā),將數(shù)據(jù)發(fā)送到r2。兩條鏈路均采用基于TCP的FTP連接,傳輸速率為10 Mb/s,延遲為2 ms,分組大小為1 000 B。干路路由器t1、t2之間構(gòu)成瓶頸鏈路,傳輸速率為1.5 Mb/s,延遲為50 ms。
4.2 仿真結(jié)果分析
圖3、圖4是新舊策略包到達(dá)率和端到端延時(shí)比較,可以看到,新策略的到達(dá)率比原策略大,這是因?yàn)樾虏呗钥梢愿鶕?jù)網(wǎng)絡(luò)狀態(tài)的好壞動(dòng)態(tài)調(diào)整乘法比例因子。當(dāng)網(wǎng)絡(luò)發(fā)生擁擠時(shí),新策略降低乘法因子,減少數(shù)據(jù)包的發(fā)送,減小網(wǎng)絡(luò)負(fù)擔(dān),因此數(shù)據(jù)包到達(dá)的可能性提高,封包端到端時(shí)延減小。
本文闡述了擁塞控制原理及算法并對(duì)算法做出了一些改進(jìn),提出了自適應(yīng)比例因子乘法減小策略。通過(guò)NS2仿真分析可知,這種策略明顯提高了網(wǎng)絡(luò)的性能。
參考文獻(xiàn)
[1] 王云濤,方建安,張曉輝,等.基于TCP Vegas的網(wǎng)絡(luò)擁塞控制改進(jìn)算法[J].計(jì)算機(jī)應(yīng)用研究,2009,26(12):56-58.
[2] Yang Ming,Hang Fuyan.AIMD-based congestion control for layered multicast[S].IEEE.2002,02:833-837.
[3] 謝希仁.計(jì)算機(jī)網(wǎng)絡(luò)[M].北京:電子工業(yè)出版社,2006.
[4] 徐雷鳴,龐博,趙耀.NS與網(wǎng)絡(luò)模擬[M].北京:人民郵電大學(xué)出版社,2003.