1擁塞
??在計算機網(wǎng)絡(luò)中的鏈路容量(即帶寬)暖庄、交換節(jié)點(如路由器)中的緩存和處理機等犯眠,都是網(wǎng)絡(luò)的資源谊娇。在某段時間內(nèi)簿晓,若對網(wǎng)絡(luò)中某一資源的需求超過了該資源所能提供的可用部分眶拉,網(wǎng)絡(luò)的性能就要變壞,從而導致吞吐量將隨著輸入負荷增大而降低憔儿。這種情況就叫做擁塞忆植。通俗來說,就跟交通擁堵性質(zhì)一樣谒臼。
??網(wǎng)絡(luò)擁塞的原因有很多朝刊,如交換節(jié)點的緩存容量太小、輸出鏈路的容量和處理機的速度蜈缤。
擁塞常常趨于惡化拾氓。如果一個路由器沒有足夠的緩存空間,它就會丟失一些新到的分組底哥,但當分組被丟失時咙鞍,發(fā)送這一分組的源點就會重傳這一分組,甚至重傳多次趾徽,這樣會引起更多的分組流入網(wǎng)絡(luò)和被網(wǎng)絡(luò)中的路由器丟失续滋。可見擁塞引起的重傳并不會緩解網(wǎng)絡(luò)的擁塞孵奶,返回會加劇網(wǎng)絡(luò)的擁塞疲酌。
2 擁塞控制
??擁塞控制就是防止過多的數(shù)據(jù)注入網(wǎng)絡(luò)中,這樣可以使網(wǎng)絡(luò)中的路由器或鏈路不致于過載了袁。擁塞控制是一個全局性的過程朗恳。涉及網(wǎng)絡(luò)中所有的主機、所有的路由器早像,以及與降低網(wǎng)絡(luò)傳輸性能有關(guān)的所有因素。
??擁塞控制和流量控制的關(guān)系密切肖爵,但是流量控制往往是指點對點的通信量控制卢鹦,是個端對端的問題。流量控制所要做的就是抑制發(fā)送方發(fā)送數(shù)據(jù)的速率劝堪,以便使接收端來得及接收冀自。
如上圖所示,對于左側(cè)圖秒啦,如果多臺主機通過鏈路上的路由器向接收方發(fā)送數(shù)據(jù)熬粗,如果主機的發(fā)送數(shù)據(jù)過快,就可能導致網(wǎng)絡(luò)擁塞余境,發(fā)送方的數(shù)據(jù)遲遲到不了接收方驻呐,那么接收端就會察覺到網(wǎng)絡(luò)發(fā)生擁塞灌诅,但是接收端不清楚是哪臺或哪些主機發(fā)送速率過快導致的擁塞。而對于右圖含末,由于是端對端的通信猜拾,如果接收方發(fā)現(xiàn)來不及接受數(shù)據(jù),它會知道是與它通信的主機發(fā)送速率過快導致的佣盒。
3 擁塞控制算法
??TCP進行擁塞控制的算法有四種挎袜,即慢開始(slow-start)、擁塞避免(congestion-avoidance)肥惭、快重傳(fast retransmit)盯仪、快恢復(fù)(fast recovery)。
??為了討論問題方便蜜葱,提出以下假定:
(1) 數(shù)據(jù)是單方向傳送的全景,對方只傳送確認報文。
(2) 接收方總有足夠大的緩存空間笼沥,因而發(fā)送窗口的大小由網(wǎng)絡(luò)的擁塞程度來決定蚪燕。
??3.1 慢開始和擁塞避免
??擁塞控制也叫做基于窗口的擁塞控制帕胆。為此征峦,發(fā)送方維持一個叫作擁塞窗口cwnd(congestion window)的狀態(tài)變量。擁塞窗口的大小取決于網(wǎng)絡(luò)的用誰程度糠亩,并且動態(tài)的變化汹桦。發(fā)送方讓自己的發(fā)送窗口等于擁塞窗口鲁驶。
在流量控制一文中還提到一個接受窗口值rwnd,從接收方流量控制角度考慮舞骆,發(fā)送方窗口一定不能超過對方給出的接收方窗口值rwnd钥弯。
??本節(jié)討論擁塞控制假定了接收方有足夠大的緩存空間,所以無需考慮rwnd督禽。但是在實際中脆霎,兩者都需要考慮,并且發(fā)送方窗口的上限值應(yīng)當取接收方窗口值rwnd和擁塞窗口cwnd這兩個變量中較小的值狈惫。即發(fā)送方窗口上限值 = min { rwnd , cwnd }睛蛛。
??接收方窗口值rwnd和擁塞窗口值cwnd的區(qū)別:
接收窗口值:接收方根據(jù)緩存設(shè)置的值,并告知給發(fā)送方胧谈,反映接收方容量忆肾。
擁塞窗口值:發(fā)送方根據(jù)自己估算的網(wǎng)絡(luò)擁塞程度而設(shè)置的窗口值,反映網(wǎng)絡(luò)當前容量菱肖。
??發(fā)送方控制擁塞窗口的原則是:只要網(wǎng)絡(luò)沒有出現(xiàn)擁塞客冈,擁塞窗口就可以再擴大一些,以便讓更多的分組發(fā)送出去稳强,如果網(wǎng)絡(luò)出現(xiàn)了擁塞场仲,就必須將擁塞窗口減小一些和悦,以減少分組的發(fā)送。判斷網(wǎng)絡(luò)擁塞的依據(jù)就是出現(xiàn)了超時燎窘。
3.1.1 慢開始算法
??慢開始算法的思路:剛開始發(fā)送數(shù)據(jù)時摹闽,不一下向網(wǎng)絡(luò)中注入大量數(shù)據(jù),而是先探測一下褐健,即由小到大逐漸增大發(fā)送窗口付鹿,也就是說,由小到大逐漸增大擁塞窗口數(shù)值蚜迅。
??慢開始算法具體規(guī)定:剛開始發(fā)送數(shù)據(jù)時舵匾,先把擁塞窗口cwnd根據(jù)發(fā)送方的最大報文段SMSS(Sender Maximum Segment Size)數(shù)值的大小設(shè)置為不超過2-4個SMSS的數(shù)值。在每收到一個對新的報文段的確認后谁不,可以把擁塞窗口增加最多一個SMSS的數(shù)值坐梯。用這樣的方法逐步增大發(fā)送方的擁塞窗口rwnd,可以使分組注入到網(wǎng)絡(luò)中的速率更加合理刹帕。
??下面舉例說明一下吵血,雖然實際上TCP是用字節(jié)數(shù)作為窗口大小的單位,但為了方便描述偷溺,下面使用報文段的個數(shù)來作為窗口的大小的單位蹋辅,并且假設(shè)所有的報文段大小相等。
剛開始時發(fā)送方先將窗口大小cwnd設(shè)置為1(這里的1是指的是一個報文段的字節(jié)數(shù)挫掏,下同)侦另,發(fā)送第一個分組,接收方接收后確認分組0尉共。發(fā)送方接收到對分組0的確認后褒傅,將cwnd增加到2(即收到一個確認就把擁塞窗口增加一個報文段長度)。
發(fā)送方接著發(fā)送分組2 ~ 3袄友,接收方接收后確認分組2 ~ 3殿托,發(fā)送方收到2個確認后將cwnd從2增加到4。
發(fā)送方接著發(fā)送分組4 ~ 7剧蚣,接收方接收后確認分組4 ~ 7支竹,發(fā)送方收到4個確認后將cwnd從4增加到8。
....
??所以券敌,慢開始算法每經(jīng)過一個傳輸輪次(transmission round)唾戚,擁塞窗口cwnd就加倍柳洋。
一個傳輸輪次:發(fā)送方從發(fā)送一批分組到接收到它們的確認所經(jīng)歷的時間待诅,即往返時間RTT(RTT并非是恒定的數(shù)值)。
??注:在TCP實際運行時熊镣,發(fā)送方只有收到一個確認就可以將cwnd加1并發(fā)送新的分組卑雁,并不需要等一個輪次所有的確認都收到后再發(fā)送新的分組募书。
??從上面可以看出,慢開始算法雖然起始的窗口很小测蹲,但是每過一個輪次莹捡,窗口大小翻倍,呈指數(shù)爆炸增長扣甲,所以必須要對其進行一個限制篮赢,防止其增長過大引起網(wǎng)絡(luò)擁塞。這個限制就是慢開始門限ssthresh狀態(tài)變量琉挖。慢開始門限ssthresh的用法如下:
????當cwnd < ssthresh時启泣,使用上述慢開始算法。
????當cwnd > ssthresh時示辈,停止使用慢開始算法而改用擁塞避免算法寥茫。
3.1.2 擁塞避免算法
??擁塞避免算法的思路是讓擁塞窗口cwnd緩慢增大,即每經(jīng)過一個往返時間RTT就把發(fā)送方的擁塞窗口cwnd加1矾麻,而不是像慢開始階段那樣加倍增長纱耻。因此在擁塞避免階段就有“加法增大”AI(Additive Increase)的特點。這表明在擁塞避免階段险耀,擁塞窗口cwnd按線性規(guī)律增長弄喘,比慢開始算法的擁塞窗口增長速率緩慢得多。
??下面用一個具體的例子來說明擁塞控制的過程胰耗,下圖假設(shè)TCP發(fā)送窗口等于擁塞窗口限次,慢開始初始門限設(shè)置為16個報文段,即ssthresh = 16柴灯。
注:橫坐標是傳輸輪次卖漫。
(1) 在執(zhí)行慢開始算法時,發(fā)送方每收到一個對新報文段確認的ACK赠群,就把擁塞窗口的值加1羊始,然后開始下一輪的傳輸。剛開始cwnd呈指數(shù)規(guī)律增長查描,當cwnd = 16時(即第一個紅色的點處)突委,擁塞窗口到達慢開始門限。
(2) 當擁塞窗口達到慢開始門限時冬三,即進入避免擁塞階段匀油,擁塞窗口按線性規(guī)律增長,使網(wǎng)絡(luò)比較不容易出現(xiàn)擁塞勾笆。
(3) 當擁塞窗口 cwnd = 24時敌蚜,網(wǎng)絡(luò)出現(xiàn)超時(第二個紅點處),發(fā)送方判斷為網(wǎng)絡(luò)擁塞窝爪。于是調(diào)整門限值 ssthresh = cwnd / 2 = 12(即發(fā)送窗口的一半)弛车,同時設(shè)置擁塞窗口cwnd = 1齐媒,進入慢開始階段。
(4) 重新進入慢開始階段后纷跛,當擁塞窗口再次達到新的門限ssthresh = 12時(第四個紅點處)喻括,改為執(zhí)行擁塞避免算法,擁塞窗口按線性規(guī)律增長贫奠,每經(jīng)過一個往返時延就增加一個MSS的大小唬血。
??在擁塞避免階段,擁塞窗口是按照線性規(guī)律增大的唤崭,這常稱為加法增大AI刁品。無論在慢開始階段還是擁塞避免階段,只要出現(xiàn)一次超時(即出現(xiàn)一次網(wǎng)絡(luò)擁塞)浩姥,就把慢開始門限值 ssthresh 設(shè)置為當前擁塞窗口的一半挑随,這叫做乘法減小 MD(Multiplication Decrease)。
??當網(wǎng)絡(luò)頻繁出現(xiàn)擁塞時勒叠,ssthresh 值就下降的很快兜挨,以大大減少注入網(wǎng)絡(luò)中的分組數(shù)。
?? 3.2 快速重傳和快恢復(fù)
快速重傳機制之前介紹過眯分,這里簡單概括下拌汇,即發(fā)送方如果收到連續(xù)3個冗余ACK,那么發(fā)送方就會執(zhí)行快重傳算法弊决,立即重傳這個被確認過3次的報文段之后的報文段噪舀,這樣可以讓發(fā)送方在超時事件之前知道報文發(fā)生了丟失。
??快恢復(fù)算法飘诗,如果發(fā)送方連續(xù)接收到3個冗余ACK与倡,發(fā)送方知道現(xiàn)在只是丟失了個別的報文段,此時調(diào)整門限值 ssthresh為當前擁塞窗口的一半昆稿,同時設(shè)置擁塞窗口 cwnd為新的門限值(發(fā)生報文段丟失時擁塞窗口的一半)纺座,而不是從1開始。
如上圖所示溉潭,當cwnd = 24時净响,收到了3個冗余ACK,于是不啟動慢開始喳瓣,而是執(zhí)行快恢復(fù)算馋贤。這時,發(fā)送方調(diào)整門限值 ssthresh = cwnd / 2 = 12畏陕,同時設(shè)置擁塞窗口 cwnd = ssthresh = 12配乓,并開始擁塞避免算法。
??TCP對這種丟包事件的行為,相比于超時指示的丟包扰付,不那么劇烈,所以對于連續(xù)收到3個冗余ACK仁讨,擁塞窗口不會從1開始開始羽莺。