客戶端c和伺服器s之間建立乙個tcp連線,該連線總是以1kb的最大段長傳送tcp段,客戶端c有足夠的資料要傳送。當擁塞視窗為16kb的時候發生超時,如果接下來的4個rtt往返時間內的tcp段的傳輸是成功的,那麼當第4個rtt時間內傳送的所有tcp段都得到了ack時,擁塞視窗大小是多大?
16kb超時,閾值變為8kb,客戶端從1kb開始穿(執行快開始演算法)
1rtt 結束,1kb->2kb
2rtt結束,2kb->4kb
3rtt 結束,4kb->8kb(到達閾值,執行擁塞避免演算法)
4rtt結束,8kb->9kb
計算機網路中的頻寬、交換結點中的快取和處理機等,都是網路的資源。在某段時間,若對網路中某一資源的需求超過了該資源所能提供的可用部分,網路的效能就會變壞。這種情況就叫做擁塞。傳送方維持乙個叫做擁塞視窗cwnd(congestion window)的狀態變數。擁塞視窗的大小取決於網路的擁塞程度,並且動態地在變化。傳送方讓自己的傳送視窗等於擁塞視窗,另外考慮到接受方的接收能力,傳送視窗可能小於擁塞視窗。擁塞控制就是防止過多的資料注入網路中,這樣可以使網路中的路由器或鏈路不致過載。擁塞控制是乙個全域性性的過程,和流量控制不同,流量控制指點對點通訊量的控制。
慢開始演算法的思路就是,不要一開始就傳送大量的資料,先探測一下網路的擁塞程度,也就是說由小到大逐漸增加擁塞視窗的大小。這裡用報文段的個數的擁塞視窗大小舉例說明慢開始演算法,實時擁塞視窗大小是以位元組為單位的。如下圖:
當然收到單個確認但此確認多個資料報的時候就加相應的數值。所以一次傳輸輪次之後擁塞視窗就加倍。這就是乘法增長,和後面的擁塞避免演算法的加法增長比較。
為了防止cwnd增長過大引起網路擁塞,還需設定乙個慢開始門限ssthresh狀態變數。ssthresh的用法如下:
當cwnd小於ssthresh時,使用慢開始演算法。擁塞避免演算法讓擁塞視窗緩慢增長,即每經過乙個往返時間rtt就把傳送方的擁塞視窗cwnd加1,而不是加倍。這樣擁塞視窗按線性規律緩慢增長。當cwnd大於ssthresh時,改用擁塞避免演算法。
無論是在慢開始階段還是在擁塞避免階段,只要傳送方判斷網路出現擁塞(其根據就是沒有收到確認,雖然沒有收到確認可能是其他原因的分組丟失,但是因為無法判定,所以都當做擁塞來處理),就把慢開始門限設定為出現擁塞時的傳送視窗大小的一半。然後把擁塞視窗設定為1,執行慢開始演算法。如下圖:
快重傳要求接收方在收到乙個失序的報文段後就立即發出重複確認(為的是使傳送方及早知道有報文段沒有到達對方)而不要等到自己傳送資料時捎帶確認。快重傳演算法規定,傳送方只要一連收到三個重複確認就應當立即重傳對方尚未收到的報文段,而不必繼續等待設定的重傳計時器時間到期。如下圖:
快重傳配合使用的還有快恢復演算法,有以下兩個要點:
①當傳送方連續收到三個重複確認時,就執行「乘法減小」演算法,把ssthresh門限減半。但是接下去並不執行慢開始演算法。
②考慮到如果網路出現擁塞的話就不會收到好幾個重複的確認,所以傳送方現在認為網路可能沒有出現擁塞。所以此時不執行慢開始演算法,而是將cwnd設定為ssthresh的大小,然後執行擁塞避免演算法。如下圖:
參考:
TCP擁塞控制
擁塞控制就是防止過多的資料注入到網路中,這樣可以使網路中的路由器或鏈路不致過載,擁塞控制要做的都有個前提,就是網路能夠承受現有的網路負荷。擁塞控制是個全域性性的過程。幾種擁塞控制方法 慢開始 擁塞避免 快重傳 快恢復 1.慢開始和擁塞避免 傳送方維持乙個叫做擁塞視窗的狀態變數,擁塞視窗取決於網路的擁...
TCP擁塞控制
計算機網路中的頻寬 交換結點中的快取和處理機等,都是網路的資源。在某段時間,若對網路中某一資源的需求超過了該資源所能提供的可用部分,網路的效能就會變壞。這種情況就叫做擁塞。擁塞控制就是防止過多的資料注入網路中,這樣可以使網路中的路由器或鏈路不致過載。擁塞控制是乙個全域性性的過程,和流量控制不同,流量...
TCP 擁塞控制
我們都知道 tcp 是傳輸層的協議,網路請求經過傳輸層到達網路層之後是通過 ip 包進行傳輸的。如果我們傳送方大量的 ip 包的時候,有可能我們的鏈路資源有限,那麼我們的 ip 包就有可能丟失或者被丟棄,這樣我們的請求就不是絕對安全的,那接下來我們就說一下,tcp是如何處理前面的情況的。一 什麼是網...