計算機網絡-TCP擁塞控制

1 擁塞概念

  • 在某段時間,若對網絡中某資源的需求超過了該資源所能提供的可用部分,網絡的性能就要變壞。這種現象稱爲擁塞 (congestion)
  • 若網絡中有許多資源同時產生擁塞,網絡的性能就要明顯變壞,整個網絡的吞吐量將隨輸入負荷的增大而下降
  • 出現擁塞的原因:∑ 對資源需求 > 可用資源,這裏的資源包括很多方面,比如路由器的緩存、路由器的處理速度、通信線路的容量等等
  • 擁塞的現象和堵車的現象有點相似,比如出現堵車有一個原因就是道路不夠寬,我們紅綠燈的交替速度不夠快等等諸多方面元素

既然擁塞是因爲可用資源不足,那麼增加資源是否可以解決擁塞現象?

  • 不可以
  • 這是因爲網絡擁塞是一個非常複雜的問題。簡單地採用上述做法,在許多情況下,不但不能解決擁塞問題,而且還可能使網絡的性能更壞
  • 如增大緩存,但未提高輸出鏈路的容量和處理機的速度,排隊等待時間將會大大增加,引起大量超時重傳,會進一步的加劇擁塞,解決不了網絡擁塞
  • 如果一個路由器沒有足夠的緩存空間,它就會丟棄一些新到的分組,但當分組被丟棄時,發送這一分組的源點就會重傳這一分組,甚至可能還要車傳多次。這樣會引起更多的分組流入網絡和被網絡中的路由器丟棄
  • 如提高處理機處理的速率會會將瓶頸轉移到其他地方,只提高某一方面是不可能提高整體效率的,那麼限制堵車的辦法不是多修路,而是限制車到路上

擁塞控制與流量控制的區別:

  • 擁塞控制:對全局的每一個發送端進行控制
  • 流量控制:對單一的發送端進行控制
    在這裏插入圖片描述

2 擁塞控制的一般原理

在這裏插入圖片描述

  • 對理想的擁塞控制在達到資源上限之前,網絡的吞吐量是平穩上升的,而達到最高點之後,整個網絡的吞吐量可在最高點延續,這個時候哪怕有更多的分組注入網絡,也能夠以最高的吞吐量進行發送和接收數據
  • 實際的擁塞控制不可能達到理想擁塞控制的效果,隨着注入網絡的分組增加,吞吐量會逐漸增加,但達不到上限
  • 在設計擁塞算法時,由於擁塞都是動態的,每一時刻的可用資源和需求資源都是動態變化的,所以無法明確的確定一個邊界,由於擁塞控制是一個全局問題,而發送方的一點無法獲取到全局的網絡狀況,所以這使得擁塞控制的設計極爲複雜

在設計擁塞控制算法時,有兩類控制方法:

  1. 開環控制:事先將有關發生擁塞的因素都考慮周到,力求在網絡工作的時候不發生擁塞,這需要全面的考慮到各方面原因並以參數的形式將其設計到算法中來
  2. 閉環控制:監測網絡系統,以便檢測到擁塞在何時、何處發生,將擁塞發生的信息傳送到可採取行動的地方,通常是發送方或中間路由器,調整網絡系統的運行以解決出現的問題,比如可以限制發送方發送報文的速度,通常閉環控制是最常用的控制方式
    在這裏插入圖片描述

3 擁塞控制的方法

  • TCP 採用基於窗口的方法進行擁塞控制。該方法屬於閉環控制方法
  • TCP發送方維持一個擁塞窗口 cwnd (Congestion Window)
  • 發送端利用擁塞窗口根據網絡的擁塞情況調整發送的數據量
  • 發送窗口大小不僅取決於接收方窗口,還取決於網絡的擁塞狀況,所以真正的發送窗口值爲:真正的發送窗口值 = Min (接收方窗口值,擁塞窗口值)

控制擁塞窗口的原則:

  • 只要網絡沒有出現擁塞,擁塞窗口就可以再增大一些,以便把更多的分組發送出去,這樣就可以提高網絡的利用率
  • 但只要網絡出現擁塞或有可能出現擁塞,就必須把擁塞窗口減小一些,以減少注入到網絡中的分組數,以便緩解網絡出現的擁塞

擁塞的判斷:

  • 重傳定時器超時:現在通信線路的傳輸質量一般都很好,因傳輸岀差錯而丟棄分組的概率是很小的(遠小於1%)。只要出現了超時,就可以猜想網絡可能出現了擁塞
  • 收到三個相同(重複)的ACK:個別報文段會在網絡中丟失,預示可能會出現擁塞(實際未發生擁塞),因此可以儘快採取控制措施,避免擁塞

TCP擁塞控制算法分爲四種,分別用於數據傳輸的不同階段:

  1. 慢開始 (slow-start)
  2. 擁塞避免 (congestion avoidance)
  3. 快重傳 (fast retransmit)
  4. 快恢復 (fast recovery)

3.1 慢開始 (Slow start)

  • 目的:用來確定網絡的負載能力或擁塞程度
  • 算法的思路:由小到大逐漸增大擁塞窗口數值
  • 初始擁塞窗口cwnd設置:舊的規定在剛剛開始發送報文段時,先把初始擁塞窗口cwnd設置爲1至2個發送方的最大報文段SMSS( Sender Maximum Segment Size)的數值,新的RFC5681把初始擁塞窗口cwnd設置爲不超過2至4個SMSS的數值
  • 慢開始門限 ssthresh(狀態變量):防止擁塞窗口cwnd增長過大引起網絡擁塞,當我們發送的報文段數量達到慢開始門限後,就會從慢開始階段轉換爲擁塞避免階段

慢開始門限 ssthresh 的用法如下

  • 當 cwnd < ssthresh 時,使用慢開始算法
  • 當 cwnd > ssthresh 時,停止使用慢開始算法而改用擁塞避免算法
  • 當 cwnd = ssthresh 時,既可使用慢開始算法,也可使用擁塞避免算法
  • 擁塞窗口 cwnd 控制方法:在每收到一個對新的報文段的確認後,可以把擁塞窗口增加最多一個 SMSS 的數值,擁塞窗口 cwnd 每次的增加量 = min (N, SMSS),即在N和SMSS之中取一個最小值,其中 N 是原先未被確認的、但現在被剛收到的確認報文段所確認的字節數,不難看出,當 N < SMSS 時,擁塞窗口每次的增加量要小於 SMSS。用這樣的方法逐步增大發送方的擁塞窗口 cwnd,可以使分組注入到網絡的速率更加合理
    在這裏插入圖片描述

傳輸輪次

  • 使用慢開始算法後,每經過一個傳輸輪次 (transmission round),擁塞窗口 cwnd 就加倍
  • 一個傳輸輪次所經歷的時間其實就是往返時間 RTT
  • “傳輸輪次”更加強調:把擁塞窗口 cwnd 所允許發送的報文段都連續發送出去,並收到了對已發送的最後一個字節的確認
  • 例如,擁塞窗口 cwnd = 4,這時的往返時間 RTT 就是發送方連續發送 4 個報文段,並收到這 4 個報文段的確認,總共經歷的時間

3.2 擁塞避免算法

首先要提出一點,擁塞避免算法並不是完全避免擁塞,而是讓擁塞來的更慢一些

  • 思路:讓擁塞窗口cwnd緩慢地增大,即毎經過一個往返時間RTT就把發送方的擁塞窗口cwnd加1,而不是加倍,使擁塞窗口cwnd按線性規律緩慢增長
  • 因此在擁塞避免階段就有“加法增大”( Additive Increase)的特點。這表明在擁塞避免階段,擁塞窗口cwnd按線性規律緩慢增長,比慢開始算法的擁基窗口增長速率緩饅得多

當網絡出現擁塞時:

  • 無論在慢開始階段還是在擁塞避免階段,只要發送方判斷網絡出現擁塞(重傳定時器超時
  • ssthresh = max (cwnd/2,2)
  • cwnd = 1
  • 執行慢開始算法,也就是說當進入了擁塞狀態,會重新調整ssthresh和cwnd 大小並重新進入慢開始階段
  • 目的:迅速減少主機發送到網絡中的分組數,使得發生擁塞的路由器有足夠時間把隊列中積壓的分組處理完畢

慢開始和擁塞避免算法的實現舉例:
在這裏插入圖片描述

  1. 在執行慢開始算法時,擁塞窗口 cwnd=1,發送第一個報文段
  2. 發送方每收到一個對新報文段的確認 ACK,就把擁塞窗口值加 1,然後開始下一輪的傳輸(請注意,橫座標是傳輸輪次,不是時間)。因此擁塞窗口 cwnd 隨着傳輸輪次按指數規律增長
  3. 當擁塞窗口 cwnd 增長到慢開始門限值 ssthresh 時(圖中的點❶ ,此時擁塞窗口 cwnd = 16),就改爲執行擁塞避免算法,擁塞窗口按線性規律增長
  4. 當擁塞窗口 cwnd = 24 時,網絡出現了超時(圖中的點❷ ),發送方判斷爲網絡擁塞。於是調整門限值 ssthresh = cwnd / 2 = 12,同時設置擁塞窗口 cwnd = 1,進入慢開始階段
  5. 按照慢開始算法,發送方每收到一個對新報文段的確認 ACK,就把擁塞窗口值加 1 當擁塞窗口 cwnd = ssthresh = 12 時(圖中的點❸,這是新的 ssthresh 值),改爲執行擁塞避免算法,擁塞窗口按線性規律增大
  6. 當擁塞窗口 cwnd = 16 時(圖中的點❹),出現了一個新的情況,就是發送方一連收到 3 個對同一個報文段的重複確認(圖中記爲 3-ACK)。發送方改爲執行快重傳快恢復算法

注意:

  • “擁塞避免”並非指完全能夠避免了擁塞。利用以上的措施要完全避免網絡擁塞還是不可能的
  • “擁塞避免”是說在擁塞避免階段把擁塞窗口控制爲按線性規律增長,使網絡比較不容易出現擁塞

3.3 快重傳算法

  • 快重傳和快恢復的目的,是爲了防止因爲報文段丟失重新進入到慢啓動的過程,通過收到3-ACK(接收3次對同一報文的確認)判斷
  • 發送方只要一連收到三個重複確認,就知道接收方確實沒有收到報文段,因而應當立即進行重傳(即“快重傳”),這樣就不會出現超時,發送方也不就會誤認爲出現了網絡擁塞
  • 採用快重傳 FR (Fast Retransmission) 算法可以讓發送方儘早知道發生了個別報文段的丟失
  • 快重傳 算法首先要求接收方不要等待自己發送數據時才進行捎帶確認,而是要立即發送確認,即使收到了失序的報文段也要立即發出對已收到的報文段的重複確認

快重傳舉例
在這裏插入圖片描述

  • 發送方發送M3時傳輸過程中M3丟失,但是接收方接收到了M4報文段,那麼接收方必須對M2進行重複的確認
  • 當發送方接收到連續3個對M2的確認後,發送方就知道了接收方沒有接收到M3,應當立即重傳M3,這也就是快重傳的由來
  • 這樣也不會出現超時,發送方也不會認爲這是網絡擁塞

3.4 快恢復算法

當發送端收到連續三個重複的確認時,由於發送方現在認爲網絡很可能沒有發生擁塞,因此現在不執行慢開始算法,而是執行快恢復算法 FR (Fast Recovery) 算法:

  • 慢開始門限 ssthresh = 當前擁塞窗口 cwnd / 2
  • 新擁塞窗口 cwnd = 慢開始門限 ssthresh
  • 開始執行擁塞避免算法,使擁塞窗口緩慢地線性增大
    在這裏插入圖片描述

3.5 加法增大,乘法減小 (AIMD)

  • 可以看出,在擁塞避免階段,擁塞窗口是按照線性規律增大的。這常稱爲“加法增大” AI (Additive Increase)
  • 當出現超時或3個重複的確認時,就要把門限值設置爲當前擁塞窗口值的一半,並大大減小擁塞窗口的數值。這常稱爲“乘法減小”MD (Multiplicative Decrease)
  • 二者合在一起就是所謂的 AIMD 算法

3.6 擁塞控制流程圖

在這裏插入圖片描述

3.7 發送窗口的上限值

  • 發送方的發送窗口的上限值應當取爲接收方窗口 rwnd 和擁塞窗口 cwnd 這兩個變量中較小的一個,即應按以下公式確定:發送窗口的上限值 = Min [rwnd, cwnd]
  • 當 rwnd < cwnd 時,是接收方的接收能力限制發送窗口的最大值
  • 當 cwnd < rwnd 時,則是網絡的擁塞限制發送窗口的最大值
  • 也就是說,rwnd 和 cwnd 中數值較小的一個,控制了發送方發送數據的速率
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章