TCP如何實現的擁塞控制

2021-10-06 02:12:59 字數 3376 閱讀 1220

在某段時間,若對網路中某一資源的需求超過了該資源所能提供的可用部分,網路效能就要變壞,這種情況就叫做網路擁塞。

如:在乙個道路上,如果沒有道路管制(如靠右行駛),這個道路上的來去的車一多而且都不遵守交通規則,或者後面的車輛已經看到了前面已經堵車了,但是還乙個勁的往前擠,那麼這個路就會越來越堵。

出現網路擁塞的條件:     對資源需求的總和 > 可用資源

如:一根網線的頻寬是50m,但是網路中的所有人傳輸的頻寬已經大於50m了就會出現堵塞

而流量控制是兩台計算機之間調控自己的傳輸速度。和擁塞沒有關係。

擁塞控制起到的作用

假設網路的最大吞吐量是50m。(可用理解為網線的頻寬為50m)

理想的擁塞控制:當網路上傳輸的資料報的流量超過了50m,路由器就會處理不過來大量的資料報時就會丟包,再傳輸過來的資料報就會直接扔掉。而且網路一點也不堵。

實際的擁塞控制:為了避免出現綠線的情況。如果出現了丟包的情況,路由器就會自動減緩傳送速度和接受速度。

無擁塞控制:網路線路上傳輸的資料報如果沒有擁塞控制,如果有丟包完全不考慮,還是該扔多少就扔多少。這樣就會適得其反,扔了20m就出處理了10m,而有10m的資料報丟包堵住了。最後就會造成死鎖(傳輸的資料越快,接收到的資料報最後就會為0)堵住。

傳送方維持擁塞視窗(cwnd,就是可靠傳輸中的接收視窗)的原則: 

只要網路沒有擁塞,擁塞視窗就增大一些,以便傳送更多分組出去

只要網路出現擁塞,擁塞視窗就減小大一些,以減少網路中的分組數。

1.慢開始演算法:開始的傳輸速率慢,到後面會越來越快,以2的指數的速率加快

但是如果不控制cwnd就會快速膨脹,為了防止因為cwnd的過度增長引起的網路擁塞,需要使用慢開始門限ssthresh控制:

慢開始門限ssthresh預設值是16。會根據發生網路擁塞的峰值(下一次是峰值的一半,如下圖)隨時都會變化

2.擁塞避免演算法:通過慢開始門限的約束,讓擁塞視窗cwnd緩慢地增大,即每經過乙個往返時間rtt就把傳送方的cwnd擁塞視窗cwnd加1cwnd,而不是加倍cwnd。這樣擁塞視窗cwnd按線性規律緩慢增長,比慢開始演算法的擁塞視窗增長速率緩慢得多。

擁塞避免演算法

不能完全避免擁塞,只是使網路不容易出現擁塞。

3.慢開始和擁塞避免的工作原理:

先使用慢開始演算法 然後 使用擁塞避免演算法。

第一輪,cwnd=1,開始執行慢開始演算法,因為不知道網路到底堵不堵,所以只傳送1個資料報試探一下,如果在規定時間內接收到確認包就進行第二輪。

第二輪,cwnd=2,一次傳送2個資料報,如果正常接收到確認包就進行第三輪。

第三輪,cwnd=4,一次傳送4個資料報,如果正常接收到確認包就進行第四輪。

下面的都看右面的圖。

cwnd=8,一次傳送8個資料報,如果正常接收到確認包就進行第五輪。

cwnd=16,已經到等於了預設慢開始門限的值,一次傳送16個資料報,正常傳送資料報16個。

cwnd=17,因為預設慢開始門限就是16,執行擁塞避免演算法,一次只增長乙個cwnd,所以這一次不是32,而是17。

。。。cwnd=24,到了該點傳送24個cwnd的位置已經開始出現丟包現象,網路開始有點擁塞。

cwnd=25,由於網路出現了丟包,所以就要從0重新開始傳送資料報,執行慢開始演算法。倍數增長。但是此時的慢開始門限的值也會變為網路擁塞點的1/2個cwnd,也就是12。

cwnd=1,因為丟包了,所以重新開始執行慢開始演算法。

。。。cwnd=12,開始執行擁塞避免演算法。之後重複上面的步驟。

快速重傳:要求接收方在收到乙個失序的報文段後就立即發出重複確認(為的是使傳送方及早知道有報文段沒有到達對方),而不要等到自己傳送資料時捎帶確認。

如:a給b發資料,假設b每接收到5個資料報就向a確認,當b收到了1、2後,但是直接收到了4,b會認為3已經丟了,立即向a傳送3個連續確認(都是3個),a收到3個連續確認,讓a發第3個,b就不等到5個再確認,讓a重新傳送3的資料報。  為了防止a重發後面b已經收到的資料報。

然後又從cwnd=1開始重新傳送資料報,執行快速恢復。

快速恢復的工作機制:

(1)當傳送方連續收到三個重複確認,就執行「乘法減小」演算法,立刻把慢開始門限ssthresh減半為12。這是為了預防網路發生擁塞。然後立即重傳丟失的報文段,並將cwnd設定為新的ssthresh(如:12。減半後的ssthresh)

注意:接下來不執行慢開始演算法

有些快重傳實現是把開始時的擁塞視窗cwnd值再增大一點,即等於 ssthresh + 3 * mss 。這樣做的理由是:既然傳送方收到三個重複的確認,就表明有三個分組已經離開了網路。這三個分組不再消耗網路資源而是停留在接收方的快取中。可見現在網路中並不是堆積了分組而是減少了三個分組。因此可以適當把擁塞視窗擴大了些。

(2)因為傳送方收到了3個連續的資料報,所以傳送方現在認為網路很可能沒有發生擁塞,因此與慢開始不同之處是現在不執行慢開始演算法(即擁塞視窗cwnd現在不設定為1),而是把cwnd值設定為慢開始門限ssthresh減半後的數值(如:12),然後開始執行擁塞避免演算法(「加法增大」),使擁塞視窗緩慢地線性增大

(3)每次收到乙個重複的確認時,設定cwnd=cwnd+smss(擁塞視窗cwnd加1).此時傳送端可以傳送新的tcp報文段

(4)當收到新資料的確認時,設定cwnd=ssthresh(如:12。ssthresh是新的慢啟動門限值,由第一步計算得到)

原因是因為該ack確認了新的資料,說明從重複ack時的資料都已收到,該恢復過程已經結束,可以回到恢復之前的狀態了,也即再次進入擁塞避免演算法

快速重傳和快速恢復完成之後,擁塞控制將恢復到擁塞避免階段。

如有問題歡迎指出

TCP擁塞控制

擁塞控制就是防止過多的資料注入到網路中,這樣可以使網路中的路由器或鏈路不致過載,擁塞控制要做的都有個前提,就是網路能夠承受現有的網路負荷。擁塞控制是個全域性性的過程。幾種擁塞控制方法 慢開始 擁塞避免 快重傳 快恢復 1.慢開始和擁塞避免 傳送方維持乙個叫做擁塞視窗的狀態變數,擁塞視窗取決於網路的擁...

TCP擁塞控制

計算機網路中的頻寬 交換結點中的快取和處理機等,都是網路的資源。在某段時間,若對網路中某一資源的需求超過了該資源所能提供的可用部分,網路的效能就會變壞。這種情況就叫做擁塞。擁塞控制就是防止過多的資料注入網路中,這樣可以使網路中的路由器或鏈路不致過載。擁塞控制是乙個全域性性的過程,和流量控制不同,流量...

TCP 擁塞控制

我們都知道 tcp 是傳輸層的協議,網路請求經過傳輸層到達網路層之後是通過 ip 包進行傳輸的。如果我們傳送方大量的 ip 包的時候,有可能我們的鏈路資源有限,那麼我們的 ip 包就有可能丟失或者被丟棄,這樣我們的請求就不是絕對安全的,那接下來我們就說一下,tcp是如何處理前面的情況的。一 什麼是網...