李秀妮
陜西省西安歐亞學(xué)院信息工程學(xué)院,陜西西安 710065
在互聯(lián)網(wǎng)應(yīng)用中,當(dāng)一個(gè)子網(wǎng)或者其中的一部分出現(xiàn)太多分組時(shí),網(wǎng)絡(luò)的性能開始下降,如網(wǎng)絡(luò)延時(shí)增大、丟包率上升、吞吐量下降等,這種情況即稱為擁塞(congestion)。導(dǎo)致?lián)砣霈F(xiàn)的原因通常是當(dāng)前的負(fù)載超過了資源的容量和處理能力。解決這擁塞一般采用兩種方式:其一是對(duì)擁塞進(jìn)行控制,其二是對(duì)流量進(jìn)行控制。
現(xiàn)今互聯(lián)網(wǎng)中擁塞控制大部分工作是由TCP完成的,目前標(biāo)準(zhǔn)TCP協(xié)議的實(shí)現(xiàn)都包含了一些避免和控制網(wǎng)絡(luò)擁塞的算法。當(dāng)今互聯(lián)網(wǎng)的可靠性和穩(wěn)定性與TCP擁塞控制機(jī)制密不可分,而TCP的成功也要?dú)w功于其穩(wěn)固的擁塞控制機(jī)制。
傳輸控制協(xié)議從應(yīng)用程序中得到大段的信息、數(shù)據(jù),然后將它們分割成若干個(gè)數(shù)據(jù)段。TCP會(huì)為這些數(shù)據(jù)段編號(hào)并排序,形成虛電路連接方式,信源的TCP會(huì)等待信宿TCP給一個(gè)確認(rèn)性應(yīng)答。沒有收到確認(rèn)應(yīng)答的數(shù)據(jù)段將被重新發(fā)送。TCP是一個(gè)全雙工的、面向連接的、可靠的并且是精確控制的協(xié)議。
TCP建立連接之后,通信雙方通過全雙工方式進(jìn)行數(shù)據(jù)傳輸;在保證可靠性上,采用超時(shí)重傳和捎帶確認(rèn)機(jī)制。在流量控制上,采用滑動(dòng)窗口機(jī)制,機(jī)制中規(guī)定,對(duì)于窗口內(nèi)未經(jīng)確認(rèn)的分組需要重傳。 在擁塞控制上,采用慢啟動(dòng)算法。
TCP擁塞控制是基于窗口方式的。發(fā)送端的主機(jī)在確定發(fā)送報(bào)文段的速率時(shí),既要根據(jù)接收端的接收能力,又要從全局考慮不要使網(wǎng)絡(luò)發(fā)生擁塞。因此,每一個(gè)TCP連接需要有以下兩個(gè)狀態(tài)變量:接收端窗口rwnd(receiver window)又稱為通知窗口(advertised window)和擁塞窗口cwnd(congestion window)。
在剛開始發(fā)送時(shí),可先將擁塞窗口cwnd設(shè)置為一個(gè)最大報(bào)文段MSS的數(shù)值。在每收到一個(gè)對(duì)新的報(bào)文段的確認(rèn)后,將擁塞窗口增加至2倍MSS的數(shù)值。用這樣的方法逐步增大發(fā)送端的擁塞窗口cwnd,可以使分組注入到網(wǎng)絡(luò)的速率更加合理。 慢啟動(dòng)和擁塞避免算法的實(shí)現(xiàn)舉例如圖1。
圖1 慢啟動(dòng)和擁塞避免算法圖例
當(dāng)TCP連接進(jìn)行初始化時(shí),將擁塞窗口置為1。圖中的窗口單位不使用字節(jié)而使用報(bào)文段。慢啟動(dòng)門限的初始值設(shè)置為 16個(gè)報(bào)文段,即ssthresh=16。發(fā)送端的發(fā)送窗口不能超過擁塞窗口cwnd和接收端窗口rwnd中的最小值。慢啟動(dòng)算法在初始化連接時(shí)很有效,他探測(cè)網(wǎng)絡(luò)環(huán)境,以確保不會(huì)把太多報(bào)文發(fā)送進(jìn)一個(gè)已經(jīng)擁塞的環(huán)境??墒蔷W(wǎng)絡(luò)進(jìn)入飽和狀態(tài)很容易,但讓網(wǎng)絡(luò)從飽和狀態(tài)中恢復(fù)卻很難,一旦擁塞發(fā)生了,要將擁塞清除掉可能需要很長時(shí)間,因此慢啟動(dòng)中cwnd指數(shù)增加就可能太激進(jìn),于是當(dāng)擁塞窗口cwnd增長到慢開始門限值ssthresh時(shí)(即當(dāng)cwnd=16時(shí)),就改為執(zhí)行擁塞避免算法,擁塞窗口按線性規(guī)律增長。
由于在擁塞避免階段,當(dāng)發(fā)生超時(shí),cwnd重新置1,進(jìn)入慢啟動(dòng),這將導(dǎo)致過大減小發(fā)送窗口尺寸,很大程度上降低了TCP連接的吞吐量。為了完善TCP的性能,又引入了快速重傳和快速恢復(fù)機(jī)制??焖僦貍麟A段,當(dāng)源端收到3個(gè)或者3個(gè)以上的重復(fù)ACK確認(rèn),即認(rèn)為發(fā)生了數(shù)據(jù)包丟失,此時(shí)將ssthresh設(shè)置為當(dāng)前cwnd的一半,ssthresh=awnd/2,并重新傳送丟失的數(shù)據(jù)包,進(jìn)入快速恢復(fù)階段。在快速恢復(fù)階段,源端每收到一個(gè)重復(fù)的ACK,則cwnd加1;若收到非重復(fù)的ACK,置cwnd=ssthresh,轉(zhuǎn)入擁塞避免;當(dāng)發(fā)生超時(shí)重傳時(shí),置ssthresh=cwnd/2,cwnd=1,進(jìn)入慢啟動(dòng)階段。快速重傳和快速恢復(fù)機(jī)制避免了數(shù)據(jù)包一發(fā)生超時(shí)就直接進(jìn)入慢啟動(dòng),在很大程度上提高了TCP的性能和吞吐量。
在慢啟動(dòng)階段,在每個(gè)RTT時(shí)間內(nèi),CWND增加一倍,這樣當(dāng)CWND增加到一定的值時(shí),就可能導(dǎo)致以網(wǎng)絡(luò)能夠處理的最大容量的2倍來發(fā)送數(shù)據(jù),從而淹沒網(wǎng)絡(luò),所以后來HOE建議使用packet-pair算法和測(cè)量RTT來為ssthresh估計(jì)合適值,一次來適時(shí)的結(jié)束慢啟動(dòng)階段。
對(duì)快速重傳和快速恢復(fù)機(jī)制的改進(jìn)改進(jìn)的方案有很多,比較著名的包括NewReno-TCP、SACK、FACK等。選擇確認(rèn)SACK:源端檢測(cè)到擁塞后,要重傳丟失的數(shù)據(jù)包,至檢測(cè)丟失時(shí)發(fā)送的全部數(shù)據(jù)包,而實(shí)際上二者之間有些數(shù)據(jù)包已正確傳到接收端,不必重傳。選擇確認(rèn)算法SACK,對(duì)數(shù)據(jù)包進(jìn)行有選擇的確認(rèn)和重傳,這樣源端就能準(zhǔn)確地知道哪些數(shù)據(jù)包已正確的傳到接收端,從而避免了不必要的重傳,減少了時(shí)延,提高了網(wǎng)絡(luò)的吞吐量。有限傳輸機(jī)制:如果分組非順序到達(dá)接收方,也會(huì)產(chǎn)生重復(fù)的ACK,而只有收到連續(xù)3次重復(fù)的ACK時(shí)才能激發(fā)快速重傳,導(dǎo)致了一定的時(shí)延和某些數(shù)據(jù)不必要的重傳,在快速恢復(fù)階段又會(huì)減少發(fā)送量,導(dǎo)致不必要的帶寬浪費(fèi)。在很多情況下,有限傳輸機(jī)制允許小窗口的TCP連接不用等到超時(shí)發(fā)生就可以從小與一個(gè)窗口的收據(jù)丟失中恢復(fù)過來。
隨著網(wǎng)絡(luò)規(guī)模的與日俱增,以傳統(tǒng)的端到端TCP為基礎(chǔ),改進(jìn)擁塞控制算法,將是完善Internet擁塞控制最主流也是最有效的途徑。在現(xiàn)有擁塞控制機(jī)制的基礎(chǔ)上,一個(gè)有效的擁塞控制算法將帶來巨大的效益,這對(duì)于網(wǎng)絡(luò)的發(fā)展十分重要。因此,對(duì)于算法的改進(jìn)和研究仍然是Internet擁塞控制中的一個(gè)重要課題。
[1]Andrew S.Tanenbaum 著.計(jì)算機(jī)網(wǎng)絡(luò)[M].潘愛民,譯.4版.北京:清華大學(xué)出版社,2004,8.
[2]徐昌彪,鮮永菊.計(jì)算機(jī)網(wǎng)絡(luò)中的擁塞控制與流量控制[M].人民郵電出版社,2007.
[3]章淼,吳建平,林闖.互聯(lián)網(wǎng)端到端擁塞控制研究綜述.
[4]李艷凌,江勇.TCP擁塞控制算法研究,2005,2.
[5][美]W.Richard Stevens著.TCP/IP詳解[M].胡谷雨,吳禮發(fā),等譯.機(jī)械工業(yè)出版社,2000,9.