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