TCP流量控制和擁塞控制

來源:互聯網
上載者:User

TCP的流量控制

1. 利用滑動視窗實現流量控制

    如果發送方把資料發送得過快,接收方可能會來不及接收,這就會造成資料的丟失。所謂流量控制就是讓發送方的發送速率不要太快,要讓接收方來得及接收。

    利用滑動視窗機制可以很方便地在TCP串連上實現對發送方的流量控制。

    設A向B發送資料。在串連建立時,B告訴了A:“我的接收視窗是 rwnd = 400 ”(這裡的 rwnd 表示 receiver window) 。因此,發送方的發送視窗不能超過接收方給出的接收視窗的數值。請注意,TCP的視窗單位是位元組,不是報文段。TCP串連建立時的視窗協商過程在圖中沒有顯示出來。再設每一個報文段為100位元組長,而資料報文段序號的初始值設為1。大寫ACK表示首部中的確認位ACK,小寫ack表示確認欄位的值ack。

    可以看出,B進行了三次流量控制。第一次把視窗減少到 rwnd = 300 ,第二次又減到了 rwnd = 100 ,最後減到 rwnd = 0 ,即不允許發送方再發送資料了。這種使發送方暫停發送的狀態將持續到主機B重新發出一個新的視窗值為止。B向A發送的三個報文段都設定了 ACK = 1 ,只有在ACK=1時確認號欄位才有意義。

    TCP為每一個串連設有一個持續計時器(persistence timer)。只要TCP串連的一方收到對方的零視窗通知,就啟動持續計時器。若持續計時器設定的時間到期,就發送一個零視窗控測報文段(攜1位元組的資料),那麼收到這個報文段的一方就重新設定持續計時器。

2. 必須考慮傳輸速率

    可以用不同的機制來控制TCP報文段的發送時機。如: <1>. TCP維持一個變數,它等於最大報文段長度MSS。只要緩衝中存放的資料達到MSS位元組時,就組裝成一個TCP報文段發送出去。<2>. 由發送方的應用進程指明要求發送報文段,即TCP支援的推送( push )操作。<3>. 發送方的一個計時器期限到了,這時就把已有的快取資料裝入報文段(但長度不能超過MSS)發送出去。

    Nagle演算法:若發送應用進程把要發送的資料逐個位元組地送到TCP的發送緩衝,則發送方就把第一個資料位元組先發送出去,把後面到達的資料位元組都緩衝起來。當發送方接收對第一個資料字元的確認後,再把發送緩衝中的所有資料群組裝成一個報文段再發送出去,同時繼續對隨後到達的資料進行緩衝。只有在收到對前一個報文段的確認後才繼續發送下一個報文段。當資料到達較快而網路速率較慢時,用這樣的方法可明顯地減少所用的網路頻寬。Nagle演算法還規定:當到達的資料已達到 發送視窗大小的一半或已達到報文段的最大長度時,就立即發送一個報文段。

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

 

TCP的擁塞控制

1.  擁塞:即對資源的需求超過了可用的資源。若網路中許多資源同時供應不足,網路的效能就要明顯變壞,整個網路的輸送量隨之負荷的增大而下降。

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

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

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

2. 幾種擁塞控制方法

    慢開始( slow-start )、擁塞避免( congestion avoidance )、快重傳( fast retransmit )和快恢複( fast recovery )。

2.1 慢開始和擁塞避免

    發送方維持一個擁塞視窗 cwnd ( congestion window )的狀態變數。擁塞視窗的大小取決於網路的擁塞程度,並且動態地在變化。發送方讓自己的發送視窗等於擁塞。

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

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

 

                       圖5-24 發送方沒收到一個確認把視窗cwnd增加1倍

 

每經過一個傳輸輪次,擁塞視窗 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 版本在快重傳之後採用快恢複演算法而不是採用慢開始演算法。

 

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

    在採用快恢複演算法時,慢開始演算法只是在TCP串連建立時和網路出現逾時時才使用。

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

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

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

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

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.