TCP的擁塞控制


TCP的擁塞控制

一、擁塞控制的一般原理

1.1.簡介

  • 在某段時間,若對網絡中某資源的需求超過了該資源所能提供的可用部分,網絡的性能就要變壞——產生擁塞(congestion)。

  • 出現資源擁塞的條件:

    ​ 對資源需求的總和 > 可用資源

  • 擁塞控制是一個全局性的過程,涉及到所有的主機、所有的路由器,以及與降低網絡傳輸性能有關的所有因素。

  • 流量控制往往指在給定的發送端和接收端之間的點對點通信量的控制,它所要做的就是抑制發送端發送數據的速率,以便使接收端來得及接收。

1.2.擁塞控制所起的作用

image-20200129215454048

  • 吞吐量(throughput)表示在單位時間內通過某個網絡(或信道、接口)的數據量。比如某網絡的帶寬為100M,那么該網絡的最大吞吐量為100M/s 。
  • 可以看到,理想的擁塞控制為:隨着傳輸數據量(負載)的增加,數據傳輸速度(吞吐量)越來越快,當吞吐量達到網絡的最大帶寬時,繼續增大傳輸數據量,傳輸的速度(吞吐量)也不會再增加,所以這樣並不會造成網絡擁塞導致傳輸速度(吞吐量)下降。例如,路由器間的帶寬為100M,當傳輸150M數據時,路由器把處理不過來的50M數據扔掉,繼續保持100M的傳輸速度。
  • 當無擁塞控制時,假設兩路由器間的網絡帶寬為100M,當傳輸的數據小於100M時,隨着數據量(負載)的增加丟包情況越來越明顯,此時成為輕度擁塞;當傳輸的數據量(負載)大於100M時,大量的數據包使路由器無法及時處理,錯誤情況越來越多,最后路由器死機,無法傳輸數據導致死鎖,此時吞吐量為0。
  • 在實際的擁塞控制中,網絡設備隨着傳輸的數據量(提供的負載)越來越大,傳輸的速度(吞吐量)越快,丟包率也越來越大,依靠擁塞控制機制會適當降低數據傳輸的速度(吞吐量),以減少擁塞。

二、擁塞控制方法

2.1.簡介

  • 發送方維持一個叫做擁塞窗口 cwnd (congestion window)的狀態變量。

    擁塞窗口的大小取決於網絡的擁塞程度,並且動態地在變化。發送方讓自己的發送窗口等於擁塞窗口。如再考慮到接收方的接收能力,則發送窗口還可能小於擁塞窗口。

  • 發送方控制擁塞窗口的原則是:

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

2.2.慢開始和擁塞避免(1988年提出)

  • 慢開始圖例:

image-20200129222757313

發送窗口一般等於擁塞窗口。

第一輪:剛開始cwnd=1,發送窗口也為1,發送方先發送一個報文M1測試連接通暢程度,當收到對M1報文的確認之后,cwnd+1,即發送窗口變為2,可以同時發送兩個報文M2~M3;

第二輪:發送方發送兩個報文M2M3,發送方收到了M2報文的確認后使cwnd+1變為3,收到了M3報文確認后cwnd+1變為4,即每收到一個對新報文的確認(重傳的不算在內)就使cwnd+1。由此cwnd=4,即發送窗口也為4,可以同時發送四個報文M4M7 。

以此類推第三輪之后cwnd=8。傳輸速度由慢開始,每輪翻倍,最后傳輸速度越來越快。

傳輸輪次 (transmission round)

  • 使用慢開始算法后,每經過一個傳輸輪次,擁塞窗口 cwnd 就加倍。
  • 一個傳輸輪次所經歷的時間其實就是往返時間 RTT。

慢開始門限狀態變量ssthresh

  • 當 cwnd < ssthresh 時,使用慢開始算法(cwnd每輪加倍)。
  • 當 cwnd > ssthresh 時,停止使用慢開始算法而改用擁塞避免算法。
  • 擁塞避免算法的思路是讓擁塞窗口 cwnd 緩慢地增大,即每經過一個往返時間 RTT 就把發送方的擁塞窗口 cwnd 加 1,而不是加倍,使擁塞窗口 cwnd 按線性規律緩慢增長。
  • 當 cwnd = ssthresh 時,既可使用慢開始算法,也可使用擁塞避免算法。

當網絡出現擁塞時

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

**慢開始和擁塞避免算法的實現舉例 **

image-20200129225121695

  • 可以看到,開始時采用慢開始算法,每經歷一輪cwnd翻倍,傳輸的數據包翻倍,到第4輪時cwnd=16,意味着可以同時發送16個數據包,到達了設定的慢開始門限值ssthresh,隨后采用擁塞避免算法。
  • 采用擁塞避免算法期間,每經歷一輪cwnd+1。當cwnd=24時,發送方不能准時收到確認數據包(即丟包),判斷出現網絡擁塞,於是把慢開始門限值ssthresh重新設為當前cwnd值(24)的一半,即12,並把cwnd重置為1 ,再次進入慢開始階段。
  • 可以看到:采用慢開始算法,cwnd按指數規律增長;采用擁塞避免算法,cwnd按線性規律增長。

注意

  • “擁塞避免”並非指完全能夠避免了擁塞。利用以上的措施要完全避免網絡擁塞還是不可能的。

  • “擁塞避免”是說在擁塞避免階段把擁塞窗口控制為按線性規律增長,使網絡比較不容易出現擁塞。

2.3.快重傳和快恢復(1990年提出)

快重傳舉例

當不出現丟包情況時,接收方是每接收多個數據包才給發送方一個確認。例如每收到5個連續的數據包,發送以此確認信息。

當出現丟包情況時:如發送數據包M1~M5,丟失了M3,如按上述規律,接收方要等到接收完M5后才能向發送方反饋丟失M4的信息。實際上,接收方接連收到不連續的數據包M2、M4,就已經發現丟失了M3,可采用以下的快重傳方式。

image-20200129231323069

  • 快重傳算法要求接收方每收到一個失序的報文段后就立即發出重復確認。這樣做可以讓發送方盡早知道有報文段沒有到達接收方。
  • 發送方只要一連收到三個重復確認就應當立即重傳對方尚未收到的報文段。

**快恢復算法 **

  • 當發送端收到連續三個重復的確認時,就執行“乘法減小”算法,把慢開始門限 ssthresh 減半。但接下去不執行慢開始算法。

  • 由於發送方現在認為網絡很可能沒有發生擁塞,因此現在不執行慢開始算法,即擁塞窗口 cwnd 現在不設置為 1 。而是將cwnd當前值減半作為新的慢開始門限 ssthresh 值,並讓cwnd的值等於這個新的慢開始門限ssthresh值。

    也有人認為,由於接收了三個重復的ACK,按照上述規律沒收到一個ACK,cwnd+1,所以cwnd=新ssthresh+3,這里采用前一種觀點。

    隨后開始執行擁塞避免算法(“加法增大”),使擁塞窗口緩慢地線性增大。 這便是快恢復算法。

  • 下為圖例:

image-20200129234028843

可以看到,當發送端收到3個重復的確認后,執行快重傳算法,cwnd

快恢復是配套着快重傳使用的,快恢復是相對於慢開始算法而言的。使用快恢復算法時,cwnd從較大值開始,通過擁塞避免算法逐漸線性增大,經過較短時間便能恢復比較快的傳輸速度;使用慢開始算法時,cwnd從1開始,需要較常時間才能達到較快的速度。

2.4.發送窗口的上限值

前面講過發送方的發送窗口是由接收方的接收窗口決定的。例如接收方的接收窗口為100字節,那么發送方的發送窗口就為100字節。實際上:

  • 發送方的發送窗口的上限值應當取為接收方窗口 rwnd 和擁塞窗口 cwnd 這兩個變量中較小的一個,即應按以下公式確定:

image-20200129234256008

  • 即剛開始發送數據時,由於網絡情況未知cwnd的值由1開始按指數規律增大,而接收窗口的是固定的假設為100字節。此時 cwnd < rwnd ,網絡的擁塞窗口cwnd限制了發送窗口的最大值。
  • 之后cwnd的值越來越大,最后被限制在接收方的接收窗口大小100字節上。此時此時 cwnd > rwnd ,接收方的接收能力限制了發送窗口的最大值。


免責聲明!

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



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