TCP 流量控制和擁塞控制


一 流量控制

什么是流量控制?

如果發送者發送數據過快,接收者來不及接收,那么就會有分組丟失。
為了避免分組丟失,控制發送者的發送速度,使得接收者來得及接收,這就是流量控制

流量控制的目的?

流量控制根本目的是防止分組丟失,它是構成TCP可靠性的一方面。

如何實現流量控制?

滑動窗口協議(連續ARQ協議)實現。滑動窗口協議既保證了分組無差錯、有序接收,也實現了流量控制
主要的方式就是接收方返回的 ACK 中會包含自己的接收窗口的大小,並且利用大小來控制發送方的數據發送

流量控制引發的死鎖?怎么避免死鎖的發生?

當發送者收到了一個窗口為0的應答,發送者便停止發送,等待接收者的下一個應答。但是如果這個窗口不為0的應答在傳輸過程丟失,發送者一直等待下去,而接收者以為發送者已經收到該應答,等待接收新數據,這樣雙方就相互等待,從而產生死鎖。
為了避免流量控制引發的死鎖,TCP使用了持續計時器。每當發送者收到一個零窗口的應答后就啟動該計時器。時間一到便主動發送報文詢問接收者的窗口大小。若接收者仍然返回零窗口,則重置該計時器繼續等待;若窗口不為0,則表示應答報文丟失了,此時重置發送窗口后開始發送,這樣就避免了死鎖的產生。

二 擁塞控制和流量控制的區別

擁塞控制:擁塞控制是作用於網絡的,它是防止過多的數據注入到網絡中,避免出現網絡負載過大的情況;
常用的方法就是:( 1 )慢開始、擁塞避免( 2 )快重傳、快恢復。

流量控制:它是控制發送者的發送速度從而使接收者來得及接收,防止分組丟失的。

三 擁塞控制的算法

  • 慢開始、擁塞避免算法
  • 快重傳、快恢復算法

我們在開始假定:1、數據是單方向傳遞,另一個窗口只發送確認;2、接收方的緩存足夠大,因此發送方的大小的大小由網絡的擁塞程度來決定。

慢開始

發送方維持一個叫做擁塞窗口cwnd(congestion window)的狀態變量。擁塞窗口的大小取決於網絡的擁塞程度,並且動態地在變化。發送方讓自己的發送窗口等於擁塞窗口,另外考慮到接受方的接收能力,發送窗口可能小於擁塞窗口。

慢開始算法的思路就是,不要一開始就發送大量的數據,先探測一下網絡的擁塞程度,也就是說由小到大逐漸增加擁塞窗口的大小。

這里用報文段的個數作為擁塞窗口的大小舉例說明慢開始算法,實際的擁塞窗口大小是以字節為單位的。如下圖:

 

從上圖可以看到,一個傳輸輪次所經歷的時間其實就是往返時間RTT,而且沒經過一個傳輸輪次(transmission round),擁塞窗口cwnd就加倍。

為了防止cwnd增長過大引起網絡擁塞,還需設置一個慢開始門限ssthresh狀態變量。ssthresh的用法如下:當cwnd<ssthresh時,使用慢開始算法。
當cwnd>ssthresh時,改用擁塞避免算法。
當cwnd=ssthresh時,慢開始與擁塞避免算法任意

注意,這里的“慢”並不是指cwnd的增長速率慢,而是指在TCP開始發送報文段時先設置cwnd=1,然后逐漸增大,這當然比按照大的cwnd一下子把許多報文段突然注入到網絡中要“慢得多”。

擁塞避免

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

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

整個擁塞控制的流程如下圖:

(1)擁塞窗口cwnd初始化為1個報文段,慢開始門限初始值為16
(2)執行慢開始算法,指數規律增長到第4輪,即cwnd=16=ssthresh,改為執行擁塞避免算法,擁塞窗口按線性規律增長
(3)假定cwnd=24時,網絡出現超時(擁塞),則更新后的ssthresh=12,cwnd重新設置為1,並執行慢開始算法。當cwnd=12=ssthresh時,改為執行擁塞避免

算法

關於 乘法減小(Multiplicative Decrease)和加法增大(Additive Increase):

“乘法減小”指的是無論是在慢開始階段還是在擁塞避免階段,只要發送方判斷網絡出現擁塞,就把慢開始門限ssthresh設置為出現擁塞時的發送窗口大小的一半,並執行慢開始算法,所以當網絡頻繁出現擁塞時,ssthresh下降的很快,以大大減少注入到網絡中的分組數。“加法增大”是指執行擁塞避免算法后,使擁塞窗口緩慢增大,以防止過早出現擁塞。常合起來成為AIMD算法。

注意:“擁塞避免”並非完全能夠避免了阻塞,而是使網絡比較不容易出現擁塞。

快重傳

快重傳要求接收方在收到一個失序的報文段后就立即發出重復確認(為的是使發送方及早知道有報文段沒有到達對方,可提高網絡吞吐量約20%)而不要等到自己發送數據時捎帶確認。快重傳算法規定,發送方只要一連收到三個重復確認就應當立即重傳對方尚未收到的報文段,而不必繼續等待設置的重傳計時器時間到期。如下圖:

 

快恢復

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

當發送方連續收到三個重復確認時,就執行“乘法減小”算法,把ssthresh門限減半(為了預防網絡發生擁塞)。但是接下去並不執行慢開始算法
考慮到如果網絡出現擁塞的話就不會收到好幾個重復的確認,所以發送方現在認為網絡可能沒有出現擁塞。所以此時不執行慢開始算法,而是將cwnd設置為ssthresh減半后的值,然后執行擁塞避免算法,使cwnd緩慢增大。如下圖:TCP Reno版本是目前使用最廣泛的版本。

 

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

 

鏈接


免責聲明!

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



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