TCP擁塞控制

假設接收方總是有足夠大的緩存空間,因而發送窗口的大小由網絡的擁塞程度來決定,發送方讓自己的發送窗口等於擁塞窗口。因此擁塞窗口cwnd的大小由網絡的擁塞程度來決定,並且動態地在變化。
發送方控制擁塞窗口的的原則:
只要網絡沒有出現擁塞,擁塞窗口就能再增大一些,這樣可以把更多的分組發送出去,提高網絡的利用率。但只要網絡出現擁塞或者是可能出現擁塞,就必須把擁塞窗口減小一些,減小注入到網絡中的分組數,以便緩減網絡出現的擁塞。
判斷網絡擁塞的依據:
當網絡發生擁塞時,路由器就要丟棄分組。因此只要發送方沒有按時收到應該到達的確認報文,也就是說只要出現了超時,就猜想是網絡出現了擁塞。因此網絡擁塞的依據就是出現了超時。

TCP擁塞控制

TCP進行擁塞控制有四個核心的算法:慢開始、擁塞避免、快重傳和快恢復。

慢開始

主機開始發送數據時,並不清楚網絡的負荷情況,所以由小到大逐漸增大擁塞窗口數值。慢開始規定:在每收到一個對新的報文段的確認後,可以把擁塞窗口增加以下數值:
擁塞窗口cwnd每次的增加量 = min(N,SMSS),N是原先未被確認的,但現在被剛收到的確認報文段所確認的字節數,SMSS是最大報文段。
使用滿開始算法,每經過一個傳輸輪次,擁塞窗口cwnd就加倍。
一個傳輸輪次就是把擁塞窗口cwnd所允許發送的報文段都陸續發送出去,並收到對以發送的最後一個字節的確認所經歷的時間。
【注意】在TCP實際運行中,發送方只要收到一個對新報文段的確認,其擁塞窗口cwnd就立即加一,並可以發送新的報文段,而不需要等這個輪次中所有的確認都收到後再發送新的報文段。
爲了不避免擁塞窗口cwnd增長過大引起網絡擁塞,還需要設置一個慢開始門限ssthresh,如果cwnd < ssthresh,則使用慢算法;cwnd > ssthresh,使用擁塞避免;cwnd = ssthresh,既可以使用慢開始又可以使用擁塞避免。

擁塞避免

擁塞避免算法的思路是讓擁塞窗口cwnd緩慢地增大,即每經過一個往返時間RTT就把發送方的擁塞窗口cwnd加1,而不像慢開始階段那樣加倍增長。在擁塞避免階段有“加法增大(AI)”的特點,即按線性規律緩慢增長。

快重傳

有時,有些報文段會在網絡段丟失,但實際上並沒有發生擁塞,如果發送方遲遲收不到確認就會認爲超時,誤認爲發生了擁塞,導致發送方錯誤地開啓了慢開始,把擁塞窗口又設置爲1,降低了傳輸效率。採用快重傳可以讓發送方儘早知道了個別報文段的丟失。快重傳算法首先要求接收方不要等待自己發送數據時才進行捎帶確認,而是要立即發送確認,即使收到了失序的報文段也要利機發出對已收到的報文段重複確認。快重傳算法規定:發送方只要一連收到3個重複確認,就應該立即重傳,這樣不會超時,發送方就不會誤以爲出現了網絡擁塞,使用快重傳可以使整個網絡的吞吐量提高約20%。

快恢復

通過快重傳發送方知道了網絡並沒有發生擁塞,於是不啓動慢開始,而是執行快恢復算法,發送方調整門限值ssthresh爲當前cwnd值的一半,同時設置擁塞窗口爲ssthresh,並開始執行擁塞避免算法。
【補充】
在擁塞避免階段,擁塞窗口是按照線性規律增大的,被稱爲加法增大(AI),而一旦出現擁塞或者三次重複確認,就要把門限值設置爲當前擁塞窗口的一半,大大減少擁塞窗口的數值,被稱爲乘法減小(MD),二者合在一起就是AIMD算法。

TCP擁塞控制流程圖

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章