網路中的鏈路容量和交換結點中的快取和處理機都有著工作的極限,當網路的需求超過它們的工作極限時,就出現了擁塞。擁塞控制就是防止過多的資料注入到網路中,這樣可以使網路中的路由器或鏈路不致過載。常用的方法就是
1. 慢開始和擁塞避免
2. 快重傳和快恢復
下面分別說一下兩種方法:
傳送方維持乙個叫做「擁塞視窗」的變數,該變數和接收埠共同決定了傳送者的傳送視窗;
當主機開始傳送資料時,避免一下子將大量位元組注入到網路,造成或者增加擁塞,選擇傳送乙個1位元組的試探報文;
當收到第乙個位元組的資料的確認後,就傳送2個位元組的報文;
若再次收到2個位元組的確認,則傳送4個位元組,依次遞增2的指數級;
最後會達到乙個提前預設的「慢開始門限」,比如24,即一次傳送了24個分組。慢開始門限ssthresh的用法如下:
cwnd < ssthresh, 繼續使用慢開始演算法;
cwnd > ssthresh,停止使用慢開始演算法,改用擁塞避免演算法;
cwnd = ssthresh,既可以使用慢開始演算法,也可以使用擁塞避免演算法;
所謂擁塞避免演算法就是:每經過乙個往返時間rtt就把傳送方的擁塞視窗+1,即讓擁塞視窗緩慢地增大,按照線性規律增長;
當出現網路擁塞,比如丟包時,將慢開始門限設為出現擁塞時視窗值的一半,然後將cwnd設為1,執行慢開始演算法(較低的起點,指數級增長);
如果傳送方設定的計時器超時仍然沒有收到確認,那麼很可能是網路出現了擁塞,導致報文在網路的某處被丟棄,在這種情況下tcp馬上把擁塞視窗cwnd減小到1,並執行慢開始演算法,同時把慢開始門限值ssthresh減半,這就是不使用快重傳的情況。
再看使用快重傳的情況,該演算法要求接收方每收到乙個失序的報文段後立刻發出確認(為的就是讓傳送方及早知道有報文段沒有達到對方),而不要等待自己傳送資料時才進行捎帶確認。
在上面的m3沒有達到的情況下,根據可靠傳輸原理,接收方可以什麼都不用做,也可以在適當的時機傳送一次對m2的確認,靜靜的等待傳送方m3的計時器超時重發。現在的快重傳不是這樣的,它要求在傳送發收到對某個序號的重複三次確認後,就立即重發該序號,不要等到計時器超時。這樣可以盡早的重傳未被確認的報文段,因此使用快重傳後可以使整個網路的吞吐量提高約20%。
總結:這裡的乙個小的改動就接收方立即給出確認報文,傳送方不在傻傻的等自己想要的報文的確認,因為這樣可能等不到該序號的確認,等來的全是失序報文的確認,最後導致計時器超時。所以要傳送方等待三個重複的失序報文的確認就立即重傳報文,不用等到計時器超時。
與快重傳配合的就是快恢復,當連續收到三個重複確認的報文時,執行「乘法減少」,把慢開始門限減半,這是為了預防網路發生擁塞。這時傳送方認為網路可能沒有發生擁塞,因為如果真的發生了擁塞,就不會有一連串的有好幾個失序報文到達接收方,更不會一連串的能收到這些失序報文的確認。因此這時把cwnd值設定為慢開始門限ssthresh減半後的數值,然後開始執行擁塞避免演算法(加法增大)。
注意:這裡不是說慢開始和擁塞避免就沒有用了,不是的。採用快重傳和快恢復演算法的時候,慢開始在tcp連線建立時或者網路出現超時(也就是傳送端的超時計時器超時)時仍然需要使用。
TCP擁塞控制
擁塞控制就是防止過多的資料注入到網路中,這樣可以使網路中的路由器或鏈路不致過載,擁塞控制要做的都有個前提,就是網路能夠承受現有的網路負荷。擁塞控制是個全域性性的過程。幾種擁塞控制方法 慢開始 擁塞避免 快重傳 快恢復 1.慢開始和擁塞避免 傳送方維持乙個叫做擁塞視窗的狀態變數,擁塞視窗取決於網路的擁...
TCP擁塞控制
計算機網路中的頻寬 交換結點中的快取和處理機等,都是網路的資源。在某段時間,若對網路中某一資源的需求超過了該資源所能提供的可用部分,網路的效能就會變壞。這種情況就叫做擁塞。擁塞控制就是防止過多的資料注入網路中,這樣可以使網路中的路由器或鏈路不致過載。擁塞控制是乙個全域性性的過程,和流量控制不同,流量...
TCP 擁塞控制
我們都知道 tcp 是傳輸層的協議,網路請求經過傳輸層到達網路層之後是通過 ip 包進行傳輸的。如果我們傳送方大量的 ip 包的時候,有可能我們的鏈路資源有限,那麼我們的 ip 包就有可能丟失或者被丟棄,這樣我們的請求就不是絕對安全的,那接下來我們就說一下,tcp是如何處理前面的情況的。一 什麼是網...