【轉】運輸層:TCP 擁塞控制

 

原文:https://www.cnblogs.com/linfangnan/p/13369615.html

-----------------------------------------------------------------------------------------------------

 

禁止碼迷,布布扣,豌豆代理,碼農教程,愛碼網等第三方爬蟲網站爬取!

 

TCP 擁塞控制#

TCP 採用基於窗口的方法進行擁塞控制,該方法屬於閉環控制方法。TCP發送方維持一個擁塞窗口 CWND (Congestion Window),擁塞窗口的大小取決於網絡的擁塞程度,並且動態地在變化。發送端利用擁塞窗口根據網絡的擁塞情況,調整發送的數據量。所以發送窗口大小不僅取決於接收方公告的接收窗口,還取決於網絡的擁塞狀況。只要網絡沒有出現擁塞,擁塞窗口就可以再增大一些,以便把更多的分組發送出去,這樣就可以提高網絡的利用率。但只要網絡出現擁塞或有可能出現擁塞,就必須把擁塞窗口減小一些,以減少注入到網絡中的分組數,以便緩解網絡出現的擁塞。判斷擁塞主要通過 2 種情況:

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

擁塞控制應該如何進行?有 3 個關鍵點:

  1. 一個丟失的報文段意味着擁塞,因此當丟失報文段時應當降低 TCP 發送方的速率;
  2. 一個 ACK 報文段指示該網絡正在向接收方交付報文段,因此當未確認報文段的 ACK 到達時,能夠增加發送方的速率;
  3. 爲探測擁塞開始時的傳輸速率,TCP 發送方從速率往後退進而再次檢測,看看擁塞開始時速率是否改變。

慢啓動(慢開始)#

擁塞窗口 cwnd#

當主機開始發送數據時,由於網絡的擁塞情況並不明確,要是盲目地把大量數據注入網絡中,可能會引發擁塞。因此需要先探測網絡的負載能力。慢開始的思路就是,由小到大逐漸增大擁塞窗口數值。
初始擁塞窗口 cwnd 設置,在舊的規定中在剛剛開始發送報文段時,先把初始擁塞窗口cwnd 設置爲 1 至 2 個發送方的最大報文段 SMSS (Sender Maximum Segment Size)的數值。新的 RFC 5681 把初始擁塞窗口 cwnd 設置爲不超過 2 至 4 個 SMSS 的數值。
擁塞窗口 cwnd 控制方法爲:在每收到一個對新的報文段的確認後,把擁塞窗口增加最多一個 SMSS 的數值。

其中 N 是原先未被確認的、但現在被剛收到的確認報文段所確認的字節數。不難看出,當 N < SMSS 時,擁塞窗口每次的增加量要小於 SMSS。用這樣的方法逐步增大發送方的擁塞窗口 cwnd,可以使分組注入到網絡的速率更加合理。

傳輸輪次#

使用慢開始算法後,每經過一個傳輸輪次(transmission round),擁塞窗口 cwnd 就加倍,一個傳輸輪次所經歷的時間其實就是往返時間 RTT。因此 TCP 的發送速率雖然其實很慢,但是在慢啓動階段能夠以指數型增長實現速率的快速攀升。
“傳輸輪次”更加強調:把擁塞窗口 cwnd 所允許發送的報文段都連續發送出去,並收到了對已發送的最後一個字節的確認。例如,擁塞窗口 cwnd = 4,這時的往返時間 RTT 就是發送方連續發送 4 個報文段,並收到這 4 個報文段的確認,總共經歷的時間。

擁塞避免#

慢開始門限 ssthresh#

指數型增長可以持續進行嗎?答案是否定的,網絡中的任何傳輸連接若無限制地提高發送速率,很容易導致網絡擁塞。什麼時候停止呢?通過維護變量 ssthresh 實現。設置慢開始門限 ssthresh(狀態變量)的目的是,防止擁塞窗口 cwnd 增長過大引起網絡擁塞。慢開始門限 ssthresh 的用法如下:

  • 當 cwnd < ssthresh 時,使用慢開始算法。
  • 當 cwnd > ssthresh 時,停止使用慢開始算法而改用擁塞避免算法。
  • 當 cwnd = ssthresh 時,既可使用慢開始算法,也可使用擁塞避免算法。

擁塞避免狀態#

當 TCP 偵測到網絡擁塞時,肯定是不能繼續讓擁塞窗口按照指數型增大了。擁塞避免狀態讓擁塞窗口 cwnd 緩慢地增大,即每經過一個往返時間 RTT 就把發送方的擁塞窗口 cwnd 加 1,而不是加倍,使擁塞窗口 cwnd 按線性規律緩慢增長。進入擁塞避免狀態時,ssthresh 將會被更新爲 cwnd 值的一半。因此在擁塞避免階段就有“加法增大” (Additive Increase) 的特點。這表明在擁塞避免階段,擁塞窗口 cwnd 按線性規律緩慢增長,比慢開始算法的擁塞窗口增長速率緩慢得多。
需要注意的是,丟包事件也可以被 3 個連續的 ACK 觸發,但是這種丟包行爲不能代表網絡及其擁塞,而是還能夠傳輸報文段。因此對於此情況 TCP 的反應不會那麼劇烈,首先將 cwnd 減半,將 ssthresh 的值記錄爲 cwnd 的一半,進入快速恢復的階段。
需要指出,“擁塞避免”並非指完全能夠避免了擁塞,利用以上的措施要完全避免網絡擁塞還是不可能的。“擁塞避免”是說在擁塞避免階段把擁塞窗口控制爲按線性規律增長,使網絡比較不容易出現擁塞。

快速恢復#

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

  1. 慢開始門限 ssthresh = 當前擁塞窗口 cwnd / 2 ;
  2. 新擁塞窗口 cwnd = 慢開始門限 ssthresh ;
  3. 開始執行擁塞避免算法,使擁塞窗口緩慢地線性增大。

使用快速恢復發送方就不會誤認爲出現了網絡擁塞,使用快重傳可以使整個網絡的吞吐量提高約 20%。

實例分析#


當 TCP 連接進行初始化時,將擁塞窗口置爲 1,圖中的窗口單位不使用字節而使用報文段。慢開始門限的初始值設置爲 16 個報文段,即 ssthresh = 16,發送端的發送窗口不能超過擁塞窗口 cwnd 和接收端窗口 rwnd 中的最小值。我們假定接收端窗口足夠大,因此現在發送窗口的數值等於擁塞窗口的數值。
在執行慢開始算法時,擁塞窗口 cwnd=1,發送第一個報文段。發送方每收到一個對新報文段的確認 ACK,就把擁塞窗口值加 1,然後開始下一輪的傳輸(請注意,橫座標是傳輸輪次,不是時間)。因此擁塞窗口 cwnd 隨着傳輸輪次按指數規律增長。
當擁塞窗口 cwnd 增長到慢開始門限值 ssthresh 時(圖中的點 2,此時擁塞窗口cwnd = 16),就改爲執行擁塞避免算法,擁塞窗口按線性規律增長。當擁塞窗口 cwnd = 24 時,網絡出現了超時,發送方判斷爲網絡擁塞。於是調整門限值 ssthresh = cwnd / 2 = 12,同時設置擁塞窗口 cwnd = 1,進入慢開始階段。按照慢開始算法,發送方每收到一個對新報文段的確認 ACK,就把擁塞窗口值加 1。當擁塞窗口 cwnd = ssthresh = 12 時(圖中的點 3,此時擁塞窗口 cwnd = 16),改爲執行擁塞避免算法,擁塞窗口按線性規律增大。
當擁塞窗口 cwnd = 16時,出現了一個新的情況,就是發送方一連收到 3 個對同一個報文段的重複確認(圖中記爲3-ACK)。發送方改爲執行快重傳和快恢復算法。因此在圖的點 4,發送方知道現在只是丟失了個別的報文段,於是不啓動慢開始,而是執行快恢復算法。這時,發送方調整門限值 ssthresh = cwnd / 2 = 8,同時設置擁塞窗口cwnd = ssthresh = 8(見圖中的點5),並開始執行擁塞避免算法。

AIMD 算法#

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

該算法最鮮明的特點,就是 cwnd 的數值會呈現鋸齒狀的變化趨勢。設窗口長度爲 w,根據上述流程當速率增長至 w/RTT 時,網絡丟棄來自連接的分組。發送速率減半,進而每過一個 RTT 發送速率增加 MSS/RTT,直到 w/RTT 爲止不斷重複。

發送窗口的上限#

結合流量控制來考慮,發送方的發送窗口也一定不能超過接收方的接收窗口大小。發送方的發送窗口的上限值應當取爲接收方窗口 rwnd 和擁塞窗口 cwnd 這兩個變量中較小的一個,即應按以下公式確定:

當 rwnd < cwnd 時,是接收方的接收能力限制發送窗口的最大值。當 cwnd < rwnd 時,則是網絡的擁塞限制發送窗口的最大值。也就是說 rwnd 和 cwnd 中數值較小的一個,控制了發送方發送數據的速率。

擁塞控制的公平性#

UDP 協議#

對於多媒體應用經常會在 UDP 協議上運行,因爲他們不想要傳輸速率被限制,因爲 UDP 是沒有擁塞控制的。運行在 UDP 上的多媒體應用是很不公平的,它們將不會與其他連接合作,也不會適時調整傳輸速率。當 TCP 擁塞控制面臨丟包事件時,會降低其傳輸速率,但是 UDP 源不會減低速率,TCP 流量可能被其壓制。

並行 TCP 連接#

WEB 流量在因特網中非常普遍,因此多條並行的 TCP 連接並非不常見。例如 WEB 瀏覽器通常使用多個並行的 TCP 連接來傳輸一個 WEB 頁中的多個對象。當一個應用使用多條並行連接時,就會佔用一條擁塞鏈路中較大比例的帶寬。

參考資料#

《計算機網絡(第七版)》 謝希仁 著,電子工業出版社
《計算機網絡 自頂向下方法》 [美] James F.Kurose,Keith W.Ross 著,陳鳴 譯,機械工業出版社

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章