tcp的流量控制和擁塞控制

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)發送出去。it

   Nagle算法:若發送應用進程把要發送的數據逐個字節地送到TCP的發送緩存,則發送方就把第一個數據字節先發送出去,把後面到達的數據字節都緩存起 來。當發送方接收對第一個數據字符的確認後,再把發送緩存中的全部數據組裝成一個報文段再發送出去,同時繼續對隨後到達的數據進行緩存。只有在收到對前一 個報文段的確認後才繼續發送下一個報文段。當數據到達較快而網絡速率較慢時,用這樣的方法可明顯地減小所用的網絡帶寬。Nagle算法還規定:當到達的數 據已達到 發送窗口大小的一半或已達到報文段的最大長度時,就當即發送一個報文段。io

   另,糊塗窗口綜合證: 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 ,可使分組注入到網絡的速率更加合理。

 

每通過一個傳輸輪次,擁塞窗口 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 時,則是網絡的擁塞限制發送方窗口的最大值。

相關文章
相關標籤/搜索