尚建貞

摘要:TCP協議在Internet中廣泛使。但隨著網絡通信量的增加,網絡擁塞不可避免。如何有效的處理網絡擁塞,成為網絡研究的熱門問題,人們也提出了很多不同的解決方案。Slow-Start(慢開始)算法通過設置接收窗口、擁塞窗口兩個變量和一套完整的控制機制,可以有效避免擁塞的發生,但網絡中的數據流是動態變化的,任何一種擁塞控制算法都不可能完全避免擁塞的發生,Slow-Start算法也有其自身的局限性。
關鍵詞: TCP; 擁塞控制; Slow-Start; 接收窗口; 擁塞窗口
中圖分類號:TP393.04? ? ? ? 文獻標識碼:A? ? ? ? 文章編號:1009-3044(2018)31-0045-02
Slow-Start Analysis of TCP Congestion Control Mechanism
SHANG Jian-zhen
(Henan University of Animal Husbandry and Economy, Zhengzhou 450044, China)
Abstract:The TCP is widely used in Internet. But with the increase of network traffic, network congestion is inevitable. How to deal with network congestion effectively has become a hot issue in network research. People also put forward many different solutions. Slow-Start algorithm can effectively avoid congestion by setting two variables of receiving window, congestion window and a complete set of control mechanism. However, the data flow in the network is dynamic, and any congestion control algorithm can not completely avoid the occurrence of congestion. Slow-Start algorithm also has its own limitations.
Key words: TCP; congestion control; Slow-Start; receiving window; congestion window
1 引言
Internet具有資源共享的屬性,所以從某種意義上來說他不能因為網絡資源不足而限制用戶的數量,拒絕提供服務。當網絡資源有限的時候,只能降低服務質量繼續為有需要的用戶提供服務。擁塞的發生是由于網絡資源的缺乏引起,但是單純的增加網絡資源并不能避免擁塞的發生。當數據包在網絡中的轉發結點中經過長期時間排隊完成轉發時,數據包本身可能早已超時;源結點因為未收到對這些數據包的確認,會誤認為超時而重發這些數據包。但是這些數據包已經轉發到了下一跳結點,這樣就會浪費網絡資源,進一步加重網絡擁塞。實際上,轉發結點因為緩存空間不足而丟包更多的由于網絡擁塞引起的,它并不是引起網絡擁塞的主要原因。另外,單純提高數據鏈路的傳輸速率和提高轉發結點的處理能力也不能從根本上解決擁塞問題。
當網絡的負載超出了它的處理能力時,擁塞就會發生。為了防止出現網絡擁塞,TCP設計了很多的擁塞控制機制。雖然網絡層也試圖處理擁塞問題,但大多數的擁塞控制是由傳輸層的TCP協議完成,因為解決網絡擁塞問題的最根本的方法,是減慢數據發送的速率。
擁塞控制是一種用來調整TCP連接上發送數據包速率的算法,通過對發送數據包速率的調整,使之無限接近當前網絡不斷變化的吞吐量。
1999年發布的RFC2581中定義了三種算法:Slow-Start(慢開始),Congestion Avoidance(擁塞避免)和Fast Recovery(快速恢復)。本文僅討論其中的Slow-Start算法。
2 Slow-Start(慢開始)算法
解決網絡擁塞問題,要考慮兩個方面:網絡處理能力和接收方的處理能力。既要考慮發送端的發送速率不會擁塞網絡也要考慮接收端的處理能力。為此,對于每一個TCP連接,都會維持以下兩個狀態變量:
(1)接收方窗口大小rwinsize(riceiver window size):接收方根據當前處理能力所允許的窗口大小,也就是TCP報文段頭部中窗口大小字段,這是來自接收方的流量控制。
(2)擁塞窗口大小cwinsize(congestion window size):是發送方根據網絡擁塞情況自己估算的發送窗口的大小,是來自發送端的流量控制。
發送方確定擁塞窗口的原則是:只要網絡沒有出現擁塞,就把cwinsize的值增大一些,以便把更多的報文段發送出去;如果網絡出現了擁塞,就把cwinsize的值減小一些,以減少發送到網絡中的數據量。發送端如何確定網絡出現擁塞呢?當網絡發生擁塞時,路由器就會把一些無法處理的數據包丟棄,所以發送端如果沒有收到已發送報文的確認報文,就可以認為網絡出現了擁塞。
以上兩個變量中,當rwinsize<cwinsize時,說明網絡的處理能力大于接收的數據處理能力,但是發送方也只能照顧接收端的處理能力,把發送窗口設置為rwinsize大小;? rwinsize>cwinsize時,說明接收端處理能力大于網絡的處理能力,但為了避免網絡擁塞,發送方也只能把發送窗口設置為cwinsize的大小。所以,發送方發送窗口的最大值,應當取cwinsize和rwinsize這兩個變量中較小的一個。
所有的TCP實現中,都支持一種擁塞控制的算法——慢開始算法(slow start)。假定用報文段的個數作為窗口大小的單位,而且接收端的rwinsize足夠大,所以發送窗口只受cwinsize的制約。慢開始算法的原理可以這樣表述:
(1)發送端由小到大,逐漸增大cwinsize的值,而不是開始發送時就設置一個比較大的值。這樣可以使發送端在開始發送時發送到網絡中的數據量大大減少,對于避免網絡擁塞非常有利。同時,每收到對一個報文的確認,就使cwinsize的值加1。
例如,開始時cwinsize=1,發送第一個報文段M1;收到確認后cwinsize加1,此時cwinsize=2;可以再發送2個報文,收到2個確認報文后cwinsize加2,此時cwinsize=4;可以再發送4個報文,收到4個確認報文后cwinsize加4,此時cwinsize=8。
可以看到,在這個過程中,cwinsize的數值呈指數級增長,速度很快。
(2)為防止cwinsize增長過快(無限制的增長,最終會擁塞網絡),設置一個臨界值tmp。當cwinsize>tmp時,每經過一段時間(一般是一個往返時延RTT)cwinsize值只加1,而不管這段時間內收到了幾個確認報文。此時cwinsize的數值呈線性增長,速度大大慢了下來。
(3)不管在上述的任何一個階段,只要網絡發生了擁塞(發送方沒有收到確認或者是收到了重復的確認信息),就把tmp的數值設置為發生擁塞時cwinsize數值的一半,同時把cwinsize重新設置為初始值,重新開始(1)的過程。
這樣做可以迅速減少發送方發送到網絡中的數據量,使發生擁塞的網絡路由器有足夠的時間處理隊列中的數據分組。
圖1說明了上述慢開始算法進行擁塞控制的過程。
(1)TCP連接進行初始化,設置擁塞窗口cwinsize=1,臨界值tmp=16。
(2)開始執行慢開始算法,發送端每收到一個對已發送報文段的確認,cwinsize就加1,然后開始下一次傳輸,所以發送窗口隨著傳輸次數的變化,呈現指數級的增長規律。當cwinsize的值增長到臨界值tmp的時候,就改為線性增長,速率大大慢了下來。
(3)假定當cwinsize=24的時候,網絡出現了擁塞(超時未收到確認報文),則擁塞窗口cwinsize重新設置為1,同時臨界值設置為發生擁塞時發送窗口的一半即tmp=12,然后重新執行慢開始算法。
需要指出的是,任何一種擁塞算法都不能完全避免網絡擁塞。擁塞控制的作用是在擁塞避免階段把擁塞窗口控制為按照線性規律增長,使網絡不太容易出現擁塞。RFC 2581,RFC 2309和RFC 3168提出了其他幾種擁塞控制的方法,感興趣的讀者可以查閱相應的文檔。
參考文獻:
[1] RFC 793,Transmission Control Protocol[S].
[2] RFC 2581,TCP Congestion Control[S].
[3] RFC 2582,The NewReno Modification to TCP's Fast Recovery Algorithm[S].
[4] RFC 2309,Recommendations on Queue Management and Congestion? Avoidance in the Internet[S].
[5] 王碩. 計算機網絡基礎[M].北京:中國水利水電出版社,2014.
[6] 謝鈞. 計算機網絡教程[M].北京:人民郵電出版社,2018.