(轉)TCP的滑動窗口與擁塞窗口(主要講慢啟動,擁塞避免,快重傳,快恢復)


原地址https://blog.csdn.net/ligupeng7929/article/details/79597423
 

因此我們先了解一下16位的窗口大小究竟有什么作用。

窗口分為滑動窗口和擁塞窗口。

滑動窗口是接受數據端使用的窗口大小,用來告知發送端接收端的緩存大小,以此可以控制發送端發送數據的大小,從而達到流量控制的目的。

那么對於數據的發送端就是擁塞窗口了,擁塞窗口不代表緩存,擁塞窗口指某一源端數據流在一個RTT內可以最多發送的數據包數

一、滑動窗口

滑動窗口協議是傳輸層進行流控的一種措施,接收方通過通告發送方自己的可以接受緩沖區大小(這個字段越大說明網絡吞吐量越高),從而控制發送方的發送速度,不過如果接收端的緩沖區一旦面臨數據溢出,窗口大小值也會隨之被設置一個更小的值通知給發送端,從而控制數據發送量(發送端會根據接收端指示,進行流量控制)。

 

一、TCP的滑動窗口大小實際上就是socket的接收緩沖區大小的字節數

 

二、對於server端的socket一定要在listen之前設置緩沖區大小,因為,accept時新產生的socket會繼承監聽socket的緩沖區大小。對於client端的socket一定要在connet之前設置緩沖區大小,因為connet時需要進行三次握手過程,會通知對方自己的窗口大小。在connet之后再設置緩沖區,已經沒有什么意義。

 

對ACK的再認識,ack通常被理解為收到數據后給出的一個確認ACK,ACK包含兩個非常重要的信息:

一是期望接收到的下一字節的序號n,該n代表接收方已經接收到了前n-1字節數據,此時如果接收方收到第n+1字節數據而不是第n字節數據,接 收方是不會發送序號為n+2的ACK的。舉個例子,假如接收端收到1-1024字節,它會發送一個確認號為1025的ACK,但是接下來收到的是 2049-3072,它是不會發送確認號為3072的ACK,而依舊發送1025的ACK。

 

二是當前的窗口大小m,如此發送方在接收到ACK包含的這兩個數據后就可以計算出還可以發送多少字節的數據給對方,假定當前發送方已發送到第x字節,則可以發送的字節數就是y=m-(x-n).這就是滑動窗口控制流量的基本原理.

滑動窗口協議如圖所示:

 

 

 

 

 

在這個圖中,我們將字節從1至11進行 標號。接收方通告的窗口稱為提出的窗口,它覆蓋了從第4字節到第9字節的區域,表明接收方已經確認了包括第3字節在內的數據,且通告窗口大小為6。我們知 道窗口大小是與確認序號相對應的。發送方計算它的可用窗口,該窗口表明多少數據可以立即被發送。當接收方確認數據后,這個滑動窗口不時地向右移動。窗口兩 個邊沿的相對運動增加或減少了窗口的大小。我們使用三個術語來描述窗口左右邊沿的運動:

稱窗口左邊沿向右邊沿靠近為窗口合攏。這種現象發生在數據被發送和確認時。
當窗口右邊沿向右移動時將允許發送更多的數據,我們稱之為窗口張開。這種現象發生在另一端的接收進程讀取已經確認的數據並釋放了T C P的接收緩存時。
當右邊緣向左移動時,稱之為窗口收縮。
當接收端的緩沖區滿了,發送端接收到接收端的窗口大小為0,這個時候停止發送數據,這個時候發送端會過了超時重發的時間,發送一個窗口探測的包,此數據端僅含一個字節以獲取最新的窗口大小信息

 
二、擁塞窗口
 

 擁塞控制:防止過多的數據注入到網絡中,這樣可以使網絡中的路由器或鏈路不致過載。擁塞控制所要做的都有一個前提:網絡能夠承受現有的網絡負荷。擁塞控制是一個全局性的過程,涉及到所有的主機、路由器,以及與降低網絡傳輸性能有關的所有因素。

    流量控制:指點對點通信量的控制,是端到端正的問題。流量控制所要做的就是抑制發送端發送數據的速率,以便使接收端來得及接收。

    擁塞控制代價:需要獲得網絡內部流量分布的信息。在實施擁塞控制之前,還需要在結點之間交換信息和各種命令,以便選擇控制的策略和實施控制。這樣就產生了額外的開銷。擁塞控制還需要將一些資源分配給各個用戶單獨使用,使得網絡資源不能更好地實現共享。

2. 幾種擁塞控制方法
    慢開始( slow-start )、擁塞避免( congestion avoidance )、快重傳( fast retransmit )和快恢復( fast recovery )。

2.1 慢開始和擁塞避免
    發送方維持一個擁塞窗口 cwnd ( congestion window )的狀態變量。擁塞窗口的大小取決於網絡的擁塞程度,並且動態地在變化。發送方讓自己的發送窗口等於擁塞。

    發送方控制擁塞窗口的原則是:只要網絡沒有出現擁塞,擁塞窗口就再增大一些,以便把更多的分組發送出去。但只要網絡出現擁塞,擁塞窗口就減小一些,以減少注入到網絡中的分組數。

    慢開始算法:當主機開始發送數據時,如果立即所大量數據字節注入到網絡,那么就有可能引起網絡擁塞,因為現在並不清楚網絡的負荷情況。因此,較好的方法是 先探測一下,即由小到大逐漸增大發送窗口,也就是說,由小到大逐漸增大擁塞窗口數值。通常在剛剛開始發送報文段時,先把擁塞窗口 cwnd 設置為一個最大報文段MSS的數值。而在每收到一個對新的報文段的確認后,把擁塞窗口增加至多一個MSS的數值。用這樣的方法逐步增大發送方的擁塞窗口 cwnd ,可以使分組注入到網絡的速率更加合理。

 

 

每經過一個傳輸輪次,擁塞窗口 cwnd 就加倍。一個傳輸輪次所經歷的時間其實就是往返時間RTT。不過“傳輸輪次”更加強調:把擁塞窗口cwnd所允許發送的報文段都連續發送出去,並收到了對已發送的最后一個字節的確認。

另,慢開始的“慢”並不是指cwnd的增長速率慢,而是指在TCP開始發送報文段時先設置cwnd=1,使得發送方在開始時只發送一個報文段(目的是試探一下網絡的擁塞情況),然后再逐漸增大cwnd。

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

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

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

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

擁塞避免算法:讓擁塞窗口cwnd緩慢地增大,即每經過一個往返時間RTT就把發送方的擁塞窗口cwnd加1,而不是加倍。這樣擁塞窗口cwnd按線性規律緩慢增長,比慢開始算法的擁塞窗口增長速率緩慢得多。

    無論在慢開始階段還是在擁塞避免階段,只要發送方判斷網絡出現擁塞(其根據就是沒有收到確認),就要把慢開始門限ssthresh設置為出現擁塞時的發送 方窗口值的一半(但不能小於2)。然后把擁塞窗口cwnd重新設置為1,執行慢開始算法。這樣做的目的就是要迅速減少主機發送到網絡中的分組數,使得發生 擁塞的路由器有足夠時間把隊列中積壓的分組處理完畢。

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

 

 

 

<1>. 當TCP連接進行初始化時,把擁塞窗口cwnd置為1。前面已說過,為了便於理解,圖中的窗口單位不使用字節而使用報文段的個數。慢開始門限的初始值設置為16個報文段,即 cwnd = 16 。

<2>. 在執行慢開始算法時,擁塞窗口 cwnd 的初始值為1。以后發送方每收到一個對新報文段的確認ACK,就把擁塞窗口值另1,然后開始下一輪的傳輸(圖中橫坐標為傳輸輪次)。因此擁塞窗口cwnd 隨着傳輸輪次按指數規律增長。當擁塞窗口cwnd增長到慢開始門限值ssthresh時(即當cwnd=16時),就改為執行擁塞控制算法,擁塞窗口按線 性規律增長。

<3>. 假定擁塞窗口的數值增長到24時,網絡出現超時(這很可能就是網絡發生擁塞了)。更新后的ssthresh值變為12(即變為出現超時時的擁塞窗口數值 24的一半),擁塞窗口再重新設置為1,並執行慢開始算法。當cwnd=ssthresh=12時改為執行擁塞避免算法,擁塞窗口按線性規律增長,每經過 一個往返時間增加一個MSS的大小。

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

 

 

2.2 快重傳和快恢復
    如果發送方設置的超時計時器時限已到但還沒有收到確認,那么很可能是網絡出現了擁塞,致使報文段在網絡中的某處被丟棄。這時,TCP馬上把擁塞窗口 cwnd 減小到1,並執行慢開始算法,同時把慢開始門限值ssthresh減半。這是不使用快重傳的情況。

    快重傳算法首先要求接收方每收到一個失序的報文段后就立即發出重復確認(為的是使發送方及早知道有報文段沒有到達對方)而不要等到自己發送數據時才進行捎帶確認。

 

接收方收到了M1和M2后都分別發出了確認。現在假定接收方沒有收到M3但接着收到了M4。顯然,接收方不能確認M4,因為M4是收到的失序報文段。根據 可靠傳輸原理,接收方可以什么都不做,也可以在適當時機發送一次對M2的確認。但按照快重傳算法的規定,接收方應及時發送對M2的重復確認,這樣做可以讓 發送方及早知道報文段M3沒有到達接收方。發送方接着發送了M5和M6。接收方收到這兩個報文后,也還要再次發出對M2的重復確認。這樣,發送方共收到了 接收方的四個對M2的確認,其中后三個都是重復確認。快重傳算法還規定,發送方只要一連收到三個重復確認就應當立即重傳對方尚未收到的報文段M3,而不必 繼續等待M3設置的重傳計時器到期。由於發送方盡早重傳未被確認的報文段,因此采用快重傳后可以使整個網絡吞吐量提高約20%。

    與快重傳配合使用的還有快恢復算法,其過程有以下兩個要點:

    <1>. 當發送方連續收到三個重復確認,就執行“乘法減小”算法,把慢開始門限ssthresh減半。這是為了預防網絡發生擁塞。請注意:接下去不執行慢開始算法。

    <2>. 由於發送方現在認為網絡很可能沒有發生擁塞,因此與慢開始不同之處是現在不執行慢開始算法(即擁塞窗口cwnd現在不設置為1),而是把cwnd值設置為 慢開始門限ssthresh減半后的數值,然后開始執行擁塞避免算法(“加法增大”),使擁塞窗口緩慢地線性增大。

    下圖給出了快重傳和快恢復的示意圖,並標明了“TCP Reno版本”。

    區別:新的 TCP Reno 版本在快重傳之后采用快恢復算法而不是采用慢開始算法。

 

說明:新的 TCP Reno 版本在快重傳之后采用快恢復算法而不是采用慢啟動算法。從接收方對發送方的流量控制的角度考慮,發送方的發送窗口一定不能超過對方給出的接收窗口rwind 。

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

    在采用快恢復算法時,慢開始算法只是在TCP連接建立時和網絡出現超時時才使用。

    采用這樣的擁塞控制方法使得TCP的性能有明顯的改進。

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

    發送方窗口的上限值 = Min [ rwnd, cwnd ]

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

    當cwnd < rwnd 時,則是網絡的擁塞限制發送方窗口的最大值。

 

兩者簡單比較:
相同:提高網絡性能。 
不同: 
  [1].流量控制:在TCP連接上實現對發送流量的控制,考慮點對點之間對通信量的控制,端到端,即:控制發送端的數據發送速率,使接收端可以來得及接收,保證網絡高效穩定運行。 
  [2].擁塞控制:處理網絡擁塞現象,考慮網絡能夠承受現有的網絡負荷,全局性變量,涉及所有的路由器、主機以及與降低網絡傳輸性能有關的因素。防止過多的數據注入到網絡,使網絡中的路由器或鏈路不致過載,確保通信子網可以有效為主機傳遞分組。
————————————————
版權聲明:本文為CSDN博主「本兮言」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/ligupeng7929/article/details/79597423


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM