李 婷
(西安財經學院統(tǒng)計學院,陜西 西安 710061)
網絡中的擁塞來源于網絡資源和流量分布的不均衡性。一旦網絡中存在過多的數(shù)據(jù)包,就會導致網絡性能的下降,這種現(xiàn)象稱為擁塞。擁塞會導致分組丟失率增加,從而增大端到端的延遲,累積到一定程度就是整個系統(tǒng)的崩潰。這樣的例子在互聯(lián)網發(fā)展史上曾經不止一次的出現(xiàn)過,當網絡處于擁塞崩潰狀態(tài)時,微小的負載增量都將使網絡的有效吞吐量急劇下降。
網絡擁塞發(fā)生的原因說起來也很簡單,就是“需求”大于“供給”。網絡本身無法根據(jù)現(xiàn)有資源的情況限制用戶的數(shù)量;互聯(lián)網絡又是一個分散控制系統(tǒng),無法控制用戶使用資源的數(shù)量,不斷增長的用戶和應用的數(shù)量必然會導致網絡發(fā)生擁塞。
研究擁塞控制的目的不是要完全避免擁塞,而是研究怎樣的擁塞程度是合適的。TCP網絡是可靠數(shù)據(jù)傳輸,采用分組交換技術來提高網絡鏈路的利用率,也就是說,路由器隊列緩存如果是滿的,則網絡利用率最高,但傳輸延遲大;隊列始終是空的或不滿,則網絡利用率低,傳輸延遲小。所以擁塞控制的目標就是實現(xiàn)網絡利用率和傳輸延遲等綜合性能指標達到最優(yōu)化,提高網絡的總體性能,保證網絡系統(tǒng)長期的穩(wěn)定性和魯棒性。
TCP的實現(xiàn)包含四個連續(xù)的基本過程,其實是四個不同的階段,分別是:慢啟動、擁塞避免、快速重傳和快速恢復。
慢啟動:當一個新的TCP連接建立時,發(fā)送方發(fā)送一個缺省大小為 512字節(jié)的 TCP 報文段(segment),稱為擁塞窗口(cwnd),該 cwnd的值被初始化為一個數(shù)據(jù)包,因此每經過一個RTT,cwnd將指數(shù)增加。該算法的原理就是將能發(fā)送到網絡的新數(shù)據(jù)包的發(fā)送速率對應從接受端返回的確認消息的速率。
擁塞避免:擁塞避免的觸發(fā)條件是當發(fā)現(xiàn)接收方的ACK確認包超時到達或者收到了三個相同的ACK確認包時,TCP就認為網絡中出現(xiàn)了擁塞,開始執(zhí)行擁塞避免算法,這里的觸發(fā)條件是有前提條件的,那就是TCP假設由于線路傳輸引起的數(shù)據(jù)包損壞和丟失的概率非常小,Jacobson V在1988年提出的值為小于1%時條件就成立。在這一階段,慢啟動閾值(ssthresh)設置為cwnd的一半,如果是超時,cwnd則被置1。如果此時cwnd<=ssthresh。TCP就重新進入慢啟動,如果cwnd>ssthresh,TCP進入擁塞避免,發(fā)送方每收到一個 ACK,則cwnd=cwnd+1/cwnd。可見慢啟動階段cwnd的增加是指數(shù)的,而擁塞避免階段則是線性的。
快速重傳和快速恢復:發(fā)送方不等到數(shù)據(jù)包超時,在收到三個或三個以上的重復ACK時就判斷數(shù)據(jù)包已經丟失,這樣不用等定時器超時后cwnd置1,就馬上重傳該數(shù)據(jù)包,同時將ssthresh的值置為當前cwnd的一半,這種算法來保證TCP保持足夠的吞吐量??焖倩謴偷乃惴ㄊ牵?1)當?shù)谌齻€重復的ACK到達,設置ssthresh=cwnd/2;重傳丟失的報文;設置cwnd=ssthresh+3。加3是因為三個重復的ACK表示有三個數(shù)據(jù)包已經被接受方緩存了。(2)每次有一個更多的重復ACK到達,把cwnd加1并在可能的情況下傳輸一個報文段。(3)當確認新數(shù)據(jù)的下一個ACK到達時,設置cwnd=ssthresh,進入擁塞避免。
隨著Internet應用在互聯(lián)網絡中的占的比例逐步增大,Web數(shù)據(jù)流占了網絡流量的相當部分,這些TCP連接的數(shù)據(jù)量一般都很短小,通過了解TCP擁塞控制原理,我們知道短TCP流主要工作的階段是慢啟動階段,它不具備長TCP流的傳輸時間,無法達到擁塞避免階段,所以短TCP流的問題是,如果一個分組丟失,按照擁塞控制算法,需要等待定時器超時重傳,這在帶寬競爭上就無法和長TCP流競爭,從而造成網絡的擁塞節(jié)點處,長TCP流會擠掉短TCP流,使貸款分配不均。針對這些問題,研究者們提出了傳統(tǒng)的慢啟動存在的兩個問題:(1)數(shù)據(jù)發(fā)送從一個數(shù)據(jù)包開始,要經過多個RTT才能達到較大吞吐量,這不利于流量小但是鏈路延遲又比較大的TCP流的傳輸;(2)采用指數(shù)增長的方式發(fā)送數(shù)據(jù)造成了數(shù)據(jù)突發(fā),易引起瓶頸鏈路的擁塞。
針對第一個問題,大家提出了很多解決方法,比如采用大的初始窗口,將初始窗口從 1MSS 增加到 4MSS,(Allman M.et al,1998),這種方法雖然可以改善慢啟動的性能,但是不能適應多變的網絡帶寬。還有就是將各個TCP連接的信息共享(Padmanabhan V.et al,1998;Touch J,1997;Savage S.et al,1999),后面的連接可以使用具有相同目的地址的連接信息,從而可以減少慢啟動的時延,但是這樣會使連接很快造成網絡擁塞,而短TCP的長度只需要幾個RTT就可以傳輸完畢,網絡擁塞會造成額外的時延。再后來提出了將初始窗口設定為4個分組,而從以快速重傳來減少重傳超時造成的傳輸時延(Mellia M.et al,2001)。
解決第二個問題可以通過使用帶寬時延的估計來設定初始慢啟動閾值 ssthresh(Hoe J,1996)。 Smoot-start方法(Marchese M,2001)使發(fā)送方從慢啟動階段較為平滑的過渡到擁塞避免階段,減少了數(shù)據(jù)包丟失和突發(fā)流,當擁塞窗口到達Smsthresh后,采用比較平緩的指數(shù)方式增長擁塞窗口,逐漸達到默認值或估算的ssthresh值。
有時發(fā)送端減少擁塞窗口值并不是因為分組丟失,而是分組數(shù)據(jù)傳輸中順序錯誤引起的重復ACK。有限傳輸機制 (Allman M,Balakrishman H.and Floyd S.2001)是一種改進方法,當發(fā)送端收到一個或兩個重復的ACK后,如果被允許,發(fā)送端就發(fā)送一個新的分組。這種方式對錯序的狀況有較好的調節(jié)作用。還有D-SACK方式,是一種基于SACK的方式,通過給TCP發(fā)送端一個附加信息,來判斷是否發(fā)生了不必要的重傳,D-SACK通過接收端受用SACK選項來報告收到了重復的分組序列,D-SACK在容易引起錯序的環(huán)境下提供更高的效率。
快速恢復的改進機制有SACK (Selective Acknowledgement),F(xiàn)ACK(Forward Acknowledgement),TCP New-Reno 等。SACK 方式的接收端通過ACK向發(fā)送端通過所有正確的分組,發(fā)送端只需重傳真正丟失的分組。FACK是基于SACK的改進,它們的問題都是增加了TCP的復雜性,對TCP版本的兼容性較差。TCP New-Reno不需要接收端的特殊支持,相對實現(xiàn)起來簡單,但是數(shù)據(jù)傳輸效率相對不高。Rate-Halving(Allman M ,Dawkins S,Glover D,et al,2000)是 FACK 的一個比較新的版本。在快速恢復階段,每收到2個ACK發(fā)送一個新的分組,從而在一個RTT里將擁塞窗口減小到網絡能處理的分組數(shù)的一半大小,并保持了TCP的自計時特性。
目前,TCP基于窗口的擁塞控制策略被廣泛的應用。各種改進的TCP控制策略在不同側面解決了一定的問題,但是也有著局限性,有的實現(xiàn)起來過于復雜,有的解決了多個分組丟失的恢復問題,但對恢復過程中出現(xiàn)的分組丟失卻無法得到解決。
在實際的應用中,針對不同特點的TCP網絡,有著適合的改進策略,這些策略不用做到面面俱到,只要具有一定的針對性就可以。網絡擁塞的改進是十分靈活的,方法也很非常多,其原因正式因為不同網絡中傳輸?shù)臄?shù)據(jù)特點不同,從而選擇合適的改進策略是關鍵。
[1]Allman M,Hayes C,Ostermann S.An Evaluation of TCP with Larger Initial Windows[J].ACM Computer Communication Review,1998,28(5):41-52.
[2]鄧亞平,葉凌偉,陳雁.TCP/IP擁塞控制算法的改進[J].計算機科學,2001(4):110-113.
[3]王彬.TCP/IP 網絡擁塞控制策略研究[D].浙江大學,2004.