1. 程式人生 > >流量控制 and 擁塞控制

流量控制 and 擁塞控制

1. 流量控制 - Flow Control

序言:資料的傳送與接收過程當中很可能出現收方來不及接收的情況,這時就需要對發方進行控制以免資料丟失。利用滑動視窗機制可以很方便的在TCP連線上實現對傳送方的流量控制。TCP的視窗單位是位元組,不是報文段,傳送方的傳送視窗不能超過接收方給出的接收視窗的數值。

流量控制

說明:使傳送方暫停傳送的狀態將持續到主機B重新發出一個新的視窗值為止。B向A傳送的三個報文段都設定了ACK=1。
  考慮一種特殊的情況,接收方若沒有快取足夠使用,就會發送零視窗大小的報文,此時傳送放將傳送視窗設定為0,停止傳送資料;之後接收方有足夠快取,傳送了非零視窗大小的報文,但是這個報文中途丟失,那麼傳送方的傳送視窗就一直為0導致死鎖。為此,TCP為每一個連線設有一個持續計時器(Persistence Timer)。當TCP連線的一方收到對方的零視窗通知時就啟動持續計時器。若持續計時器設定的時間到期,就傳送一個零視窗探測報文段(攜有1位元組的資料),那麼收到這個報文段的一方就重新設定持續計時器,給出現在的視窗值。
  TCP規定,即使設定為零視窗,也必須接收以下幾種報文段:零視窗探測報文段、確認報文段和攜帶緊急資料的報文段。

1.1 傳輸效率問題
  可以用不同的機制控制TCP報文段的傳送時機:
  [1]. TCP維持一個變數MSS,等於最大報文段長度。只要緩衝區存放的資料達到MSS位元組時,就組裝成了一個TCP報文段傳送出去。
  [2]. 由傳送方的應用程序指明要傳送的報文段,即:TCP支援推送操作。
  [3]. 傳送方的一個計時器期限到了,這時就把當前已有的快取資料裝入報文段(但長度不能超過MSS大小)傳送出去。

1.2 Nagle演算法
  傳送方把第一個資料位元組傳送出去,把後面到達的資料位元組快取起來。當傳送方接收對第一個資料字元的確認後,再把傳送快取中的所有資料組裝成一個報文段再發送出去,同時繼續對隨後到達的資料進行快取。只有在收到對前一個報文段的確認後,才繼續傳送下一個報文段。規定一個TCP連線最多隻能有一個未被確認的未完成的小分組,在該分組的確認到達之前不能傳送其他的小分組。當資料到達較快而網路速率較慢時,用這樣的方法可明顯地減少所用的網路頻寬。
  Nagle演算法還規定:當到達的資料已達到傳送視窗大小的一半或已經達到報文段的最大長度時,就可立即傳送一個報文段。

1.3 糊塗視窗綜合症
  TCP接收方的快取已滿,而互動式的應用程序一次只從接收快取中讀取1位元組(這樣就使接收快取空間僅騰出1位元組),然後向傳送方傳送確認,並把視窗設定為1個位元組(但傳送的資料報為40位元組的的話)。然後,傳送方又發來1個位元組的資料(傳送方的IP資料報是41位元組),接收方發回確認,仍然將視窗設定為1個位元組。這樣,網路的效率很低。要解決這個問題,可讓接收方等待一段時間,使得或者接收快取已有足夠空間容納一個最長的報文段或者等到接收方快取已有一半的空閒空間。只要出現這兩種情況,接收方就發回確認報文,並向傳送方通知當前的視窗大小。此外,傳送方也不要傳送太小的報文段,而是把資料報積累成足夠大的報文段,或達到接收方快取的空間的一半大小。

2. 擁塞控制 - Congestion Control

序言:網路擁塞現象是指到達通訊子網中某一部分的分組數量過多,使得該部分網路來不及處理,以致引起這部分乃至整個網路效能下降的現象,嚴重時導致網路通訊業務陷入停頓出現死鎖現象。擁塞控制是通過擁塞視窗處理網路擁塞現象的一種機制。

傳送報文段速率確定:
   [1]. 全域性考慮防止擁塞 <- - 擁塞視窗 (Congestion Window) - -> 傳送端流量控制,傳送端根據自己估計的網路擁塞程度而設定的視窗值;
   [2]. 接收端的接收能力 <- - 接收視窗 (Reciver Window) - -> 接收端流量控制,接收端根據目前的接收快取大小所許諾的最新視窗值;

    傳送方視窗的上限值 = Min [ rwind, cwind ]
  當rwind < cwind 時,接收方的接收能力限制傳送方視窗的最大值。
  當cwind < rwind 時,網路的擁塞限制傳送方視窗的最大值。

    因特網建議標準RFC2581定義了擁塞控制的四種演算法:慢開始(Slow-start),擁塞避免(Congestion Avoidance),快重傳(Fast Restrangsmit)和快恢復(Fast Recovery)。我們假定
     1)資料單方向傳送,而另外一個方向只傳送確認;
     2)接收方總是有足夠大的快取空間,因為傳送視窗的大小由網路的擁塞程度來決定。

2.1 慢啟動 - (Slow Start) 和 擁塞避免 - (Congestion Avoidance)

慢啟動
  傳送方維護一個擁塞視窗cwind的狀態變數。擁塞視窗的大小取決於網路的擁塞程度,動態變化。通過逐漸增加cwind的大小來探測可用的網路容量,防止連線開始時採用不合適的傳送量導致網路擁塞。
  -[1]. 當主機開始傳送資料時,如果通過較大的傳送視窗立即將全部資料位元組都注入到網路中,由於不清楚網路情況,有可能引起網路擁塞;
  -[2]. 較好方法是試探,從小到達逐漸增大發送端擁塞控制視窗的cwind數值;
  -[3]. 開始傳送報文段時,先將擁塞視窗cwind設定為一個最大報文段MSS值。每收到一個對新報文段的ACK確認後,將擁塞視窗cwind增加至多一個MSS的數值。當rwind足夠大的時候,為防止擁塞視窗cwind的增長引起網路擁塞,還需要另外一個變數,慢開始門限ssthresh。
    當 cwind < ssthresh時,使用上述慢啟動演算法;
    當 cwind > ssthresh時,停止使用慢啟動演算法,改用擁塞避免演算法;

 慢啟動侷限性
[1]. 需要獲得網路內部流量分佈的資訊,浪費可用的網路容量,額外開銷;
[2]. 估算合理的ssthresh值並不容易,可能耗時較長;

  慢啟動的“慢”並不是指cwind的增長速度慢,而是指在TCP開始傳送報文段時先設定cwind=1,使得傳送方在開始時只發送一個報文段(目的是探測一下網路的擁塞情況),然後再逐漸增大cwind。

擁塞避免
  讓擁塞視窗cwind緩慢地增大,每經過一個往返時間RTT就把傳送方的擁塞視窗cwind加1,而不是加倍。這樣擁塞視窗cwind線性緩慢增長,比慢開始演算法的擁塞視窗增長速率緩慢得多。
  無論慢啟動開始階段還是在擁塞避免階段,只要傳送方判斷網路出現擁塞(其根據就是沒有收到確認),就要把慢啟動門限ssthresh設定為出現擁塞時的傳送方視窗值的一半(但不能小於2)。然後把擁塞視窗cwind重新設定為1,執行慢啟動演算法。目的是迅速減少主機發送到網路中的分組數,使得發生擁塞的路由器有足夠時間把佇列中積壓的分組處理完畢。

控制過程
  -[1]. TCP連線初始化,將擁塞視窗cwind設定為1個報文段,即cwind=1;
  -[2]. 執行慢開始演算法,cwind按指數規律增長,直到cwind == ssthresh時,開始執行擁塞避免演算法,cwind按線性規律增長;
  -[3]. 當網路發生擁塞,把ssthresh值更新為擁塞前ssthresh值的一半,cwind重新設定為1,再按照 [2] 執行。

慢啟動和擁塞避免

說明:由指數增長拉低到線性增長,降低出現擁塞的可能。“擁塞避免”並非指完全能夠避免擁塞,利用以上的措施要完全避免網路擁塞還是不可能的。
  慢開始演算法只是在TCP連線建立和網路出現超時時才使用。

2.2 快重傳 - (Fast Retransmission) 和 快恢復 - (Fast Recover)

基本原理
  一條TCP連線有時會因等待重傳計時器的超時而空閒較長的時間,慢開始和擁塞避免無法很好的解決這類問題,因此提出了快重傳和快恢復的擁塞控制方法。
  為使傳送方及早知道有報文段沒有達到對方,快速重傳演算法首先要求接收方每收到一個報文段後就立即發出重複確認。快重傳演算法並非取消了重傳機制,只是在某些情況下更早的重傳丟失的報文段,即:當TCP源端收到到三個相同的ACK確認時,即認為有資料包丟失,則源端重傳丟失的資料包,而不必等待 RTO(Retransmission Timeout)超時。由於傳送方儘早重傳未被確認的報文段,因此,採用快重傳後可以使整個網路吞吐量提高約20%。

控制過程
  與快重傳配合使用的還有快恢復演算法,具體地:
 - [1]. 當傳送方連續收到三個重複確認時,執行“乘法減小”演算法,慢啟動門限減半,為了預防網路發生擁塞。
 - [2]. 由於傳送方現在認為網路很可能沒有發生擁塞,因此現在不執行慢啟動演算法,而是把cwind值設定為慢啟動門限減半後的值,然後開始執行擁塞避免演算法,擁塞視窗cwind值線性增大。避免了當網路擁塞不夠嚴重時採用”慢啟動”演算法而造成過大地減小發送視窗尺寸的現象。

快重傳和快恢復

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

兩者簡單比較

相同:提高網路效能。
不同
  [1].流量控制:在TCP連線上實現對傳送流量的控制,考慮點對點之間對通訊量的控制,端到端,即:控制傳送端的資料傳送速率,使接收端可以來得及接收,保證網路高效穩定執行。
  [2].擁塞控制:處理網路擁塞現象,考慮網路能夠承受現有的網路負荷,全域性性變數,涉及所有的路由器、主機以及與降低網路傳輸效能有關的因素。防止過多的資料注入到網路,使網路中的路由器或鏈路不致過載,確保通訊子網可以有效為主機傳遞分組。