擁塞控制 慢啟動 快恢復 擁塞避免

2021-09-24 22:47:49 字數 3784 閱讀 7459

1.  慢開始和擁塞避免

擁塞視窗:

傳送方維持乙個擁塞視窗 cwnd ( congestion window )的狀態變數。擁塞視窗的大小取決於網路的擁塞程度,並且動態地在變化。傳送方讓自己的傳送視窗等於擁塞。

慢開始演算法

在剛剛開始傳送報文段時,先把擁塞視窗 cwnd 設定為1個最大報文段mss的數值,而後每收到乙個對新的報文段的確認,就把擁塞視窗增加1個mss的數值,這樣擁塞視窗cwnd的值就隨著傳輸輪次(乙個輪次即傳送完乙個cwnd的mss)呈指數級增長,事實上,慢啟動的速度一點也不慢,只是它的起點比較低一點而已。用這樣的方法逐步增大傳送方的擁塞視窗 cwnd ,可以使分組注入到網路的速率更加合理。

乙個傳輸輪次所經歷的時間其實就是往返時間rtt,不過「傳輸輪次」更加強調:把擁塞視窗cwnd所允許傳送的報文段都連續傳送出去,並收到了對已傳送的最後乙個位元組的確認。

慢開始門限ssthresh:

為了防止擁塞視窗cwnd增長過大引起網路擁塞,還需要設定乙個慢開始門限ssthresh狀態變數(如何設定ssthresh)。慢開始門限ssthresh的用法如下:

當 cwnd < ssthresh 時,使用上述的慢開始演算法。

當 cwnd > ssthresh 時,停止使用慢開始演算法而改用擁塞避免演算法。

當 cwnd = ssthresh 時,既可使用慢開始演算法,也可使用擁塞控制避免演算法。

擁塞避免演算法

當cwnd >= ssthresh時,就會進入「擁塞避免演算法」,讓擁塞視窗cwnd緩慢地增大,每收到1個ack擁塞視窗cwnd = cwnd + 1/cwnd,即每經過乙個傳輸輪次就把傳送方的擁塞視窗cwnd加1。這樣擁塞視窗cwnd按線性規律緩慢增長,比慢開始演算法的擁塞視窗增長速率緩慢得多。

網路擁塞:

無論在慢開始階段還是在擁塞避免階段,只要傳送方判斷網路出現擁塞(超時計時器rto時限已到但還沒有收到確認),就要把慢開始門限ssthresh=cwnd/2(>=2),然後把擁塞視窗cwnd=1,執行慢開始演算法。這樣做的目的就是要迅速減少主機傳送到網路中的分組數,使得發生擁塞的路由器有足夠時間把佇列中積壓的分組處理完畢。

如下圖,用具體數值說明了上述擁塞控制的過程。現在傳送視窗的大小和擁塞視窗一樣大。

1). 當tcp連線進行初始化時,把擁塞視窗cwnd置為1mss,慢開始門限的初始值設定為16個mss,即 ssthresh = 16 。

2). 在執行慢開始演算法時,擁塞視窗 cwnd 的初始值為1。以後傳送方每收到乙個對新報文段的確認ack,就把擁塞視窗cwnd加1,則每個傳輸輪次擁塞視窗cwnd翻倍,因此在慢開始階段擁塞視窗cwnd 隨著傳輸輪次按指數規律增長。

3). 當擁塞視窗cwnd增長到慢開始門限值ssthresh時(即當cwnd=16時),就改為執行擁塞控制演算法,每個傳輸輪次擁塞視窗cwnd加1,因此在擁塞控制階段擁塞視窗cwnd 隨著傳輸輪次按線性規律增長。

4). 假定擁塞視窗的數值增長到24時,超時計時器rto時限已到但還沒有收到確認,則認為網路出現超時(這很可能就是網路發生擁塞了)。更新後的ssthresh值變為ssthresh/2=12,擁塞視窗cwnd=1,然後回到第2)步繼續執行。

強調:「擁塞避免」並非指完全能夠避免了擁塞。利用以上的措施要完全避免網路擁塞還是不可能的。「擁塞避免」是說在擁塞避免階段將擁塞視窗控制為按線性規律增長,使網路比較不容易出現擁塞。

2. 快重傳和快恢復

快重傳演算法:

快重傳演算法首先要求接收方每收到乙個失序的報文段就立即發出重複確認(為的是使傳送方及早知道有報文段沒有到達對方),然後若是傳送方接收到3個重複確認ack,則啟動快重傳演算法。

接收方收到了m1和m2後都分別發出了確認。現在假定接收方沒有收到m3但接著收到了m4、m5、m6。顯然,接收方不能確認m4、m5、m6,因為m4、m5、m6是收到的失序報文段。按照快重傳演算法的規定,接收方應及時傳送對m2的重複確認,這樣,傳送方共收到了接收方的四個對m2的確認,其中後三個都是重複確認。

快重傳演算法還規定,傳送方只要一連收到三個重複確認就應當立即重傳對方尚未收到的報文段m3,而不必繼續等待m3設定的重傳計時器rto到期。

tcp reno演算法定義在rfc5681。快速重傳和快速恢復演算法一般同時使用。快速恢復演算法認為,你還有3個duplicated acks說明網路也不那麼糟糕,所以沒有必要像rto超時那麼強烈,並不需要重新回到慢啟動進行,這樣可能降低效率。所以協議棧會做如下工作:

1). 擁塞視窗減半cwnd=cwnd/2

2). 慢開始門限ssthresh=cwnd(減半後的值)

然後啟動快速恢復演算法:

1). 設定cwnd = ssthresh+ack個數(一般情況下會是3個dup acks),然後重傳指定的資料報;

2). 如果再次收到dup acks,則cwnd=cwnd+1, 並且在條件允許的情況下傳送下乙個報文段(非重傳報文段)

3). 如果收到新的ack, 則快速恢復演算法結束,設定cwnd = ssthresh, 進入擁塞避免階段

上面這個演算法是有問題,那就是——它依賴於3個重複的acks。因為,3個重複的acks並不代表只丟了乙個資料報,很有可能是丟了好多包。但這個演算法只會重傳乙個,而剩下的那些包只能等到rto超時,於是,進入了惡夢模式——超時乙個阻塞視窗減半,多個超時會超成tcp的傳輸速度呈級數下降,而且也不會觸發快速恢復演算法了。

這個演算法是reno演算法的改進,沒有使用sack機制

當傳送者這邊收到了3個duplicated acks,進入快速恢復模式,開始重傳重複acks指示的那個包。如果只有這乙個包丟了,那麼,重傳這個包後回來的ack會把整個已經被傳送方傳輸出去的資料的ack返回來。如果沒有的話,說明有多個包丟了。我們叫這個ack為partial ack。 

一旦傳送方這邊發現了partial ack出現,那麼傳送方就可以推理出來有多個包被丟了,於是繼續重傳滑動視窗裡未被ack的第乙個包。直到再也收不到了partial ack,才真正結束快速恢復這個過程。

接收方根據自己的接收能力設定了接收視窗rwnd,並把這個視窗值寫入tcp首部中的視窗字段,傳送給傳送方。因此,接收視窗又稱為通知視窗。因此,從接收方對傳送方的流量控制的角度考慮,傳送方的傳送視窗一定不能超過對方給出的接收視窗rwnd 。

傳送方視窗的上限值 = min [ rwnd, cwnd ]

當rwnd < cwnd 時,是接收方的接收能力限制傳送方視窗的最大值。

當cwnd < rwnd 時,則是網路的擁塞限制傳送方視窗的最大值。

TCP擁塞控制 慢啟動 擁塞避免 快重傳 快啟動

一般原理 發生擁塞控制的原因 資源 頻寬 交換節點的快取 處理機 的需求 可用資源。作用 擁塞控制就是為了防止過多的資料注入到網路中,這樣可以使網路中的路由器或者鏈路不至於過載。擁塞控制要做的都有乙個前提 就是網路能夠承受現有的網路負荷。對比流量控制 擁塞控制是乙個全域性的過程,涉及到所有的主機 路...

TCP擁塞控制 慢啟動 擁塞避免 快重傳 快啟動

擁塞控制作用 為了防止過多的資料注入到網路中,這樣可以使網路中的路由器或者鏈路不至於過載.擁塞視窗 傳送方為乙個動態變化的視窗叫做擁塞視窗,大小取決於網路的擁塞程度。傳送方讓自己的傳送視窗 擁塞視窗,但是傳送視窗不是一直等於擁塞視窗的,在網路狀況好的時候,擁塞視窗不斷的增加,傳送方的視窗自然也隨著增...

TCP擁塞控制 慢啟動 擁塞避免 快重傳 快啟動

一般原理 發生擁塞控制的原因 資源 頻寬 交換節點的快取 處理機 的需求 可用資源。作用 擁塞控制就是為了防止過多的資料注入到網路中,這樣可以使網路中的路由器或者鏈路不至於過載。擁塞控制要做的都有乙個前提 就是網路能夠承受現有的網路負荷。傳送方為乙個動態變化的視窗叫做擁塞視窗,擁塞視窗的大小取決於網...