第8章 傳輸層(6)_擁塞控制
6. 擁塞控制
6.1 擁塞控制的原理
(1)理想狀態下:路由器R1和R2向R3提供負載不超過1000Mb/s,都能從R3發送到R4。當提供的負載超過1000Mb/s後,不能再提高了,多余的數據包將被丟棄。
(2)實際情況:網絡系統的吞吐量與輸入負載之間的關系不是線性的。隨著提供的負載增大,網絡的吞吐量增長速率逐漸減小。在網絡未達到飽和時就有一部分輸入分組被丟棄,當網絡的吞吐量明顯小於理想吞吐量就開始出現輕度擁塞現象。當負載達到某一數值時,網絡的網絡的吞吐量反而隨提供負載的增大而下降,這時網絡進入擁塞狀態。直至網絡吞吐量下降到零,就產生所謂的死鎖。
6.2 擁塞控制方法:慢開始和擁塞避免
(1)慢開始(Slow-start)
①A和B建立TCP連接,協商參數(最大報文MSS=100字節,接收窗口rwnd=3000),假設假設B發送的每個分組100字節。為了避免網絡擁堵時出現大量丟包,TCP會先感知一下網絡狀態,再調整發送速度。如果發送一個分組,不丟包,就可以進一步提高發送速度,這就是慢開始。等丟包以後就可以斷定出現堵塞(現代通信質量很高,出錯而造成重傳的概念很小(遠小於1%)),再放慢增速,這就是慢開始。
②剛開始發送方將擁塞窗口(cwnd)初始為100字節(由MSS有關),先發送一個分組M1,接收方收到後確認M1,然後發送收到對M1的確認。
③發送方每收到一個新報文段的確認(重傳的不算)就調整發送方的cwnd為原來的2倍
④發送方繼續將cwnd從200提高到400,並發送M4~M7共4個分組。因此慢開始算法就是每經過一輪次,擁塞窗口cwnd就加倍。
(2)擁塞避免(Congestion Avoidance)
①當TCP連接初始化時,把擁塞窗口cwnd=100字節(即MSS的值),慢開始門限ssthresh初始值為1600。當cwnd<ssthresh時,使用慢開始算法。即發送方每收到一個對新報文段的確認ACK,就把擁塞窗口值加倍(指數規律增長),來增大發送分組的速率。
②當cwnd增加到超過ssthresh時。就改為擁塞避免算法
③但擁塞窗口增加到2400時,網絡出現擁塞。就將sstresh值變1200(即發生擁塞時cwnd的1/2)。然後cwnd重新設置為100,並執行慢開始算法。
④慢開始算法的擁塞避免存在一個問題:網絡一旦出現丟包(不一定是擁塞引起的),就會馬上將ssthresh降低一半,同時cwnd減小為1個MSS,並重新執行慢開始算法。這代價很大,現在一般普遍使用的是快重傳和快恢復算法。
6.3 擁塞控制方法:快重傳和快恢復
(1)快重傳(Fast Restransmit)
①快重傳算法要求接收方每收到一個失序的分組後,發送方都能及早地發現。於是就要求接收方立即重復確認(如圖中M3丟棄後,會連續發送3個重復確認包M2),而不要等發送方對M3超時重傳時才發現丟包。
②由於接收方收到了M1、M2並進行了確認,但不能確認M4,因為M4是收到的失序失組。於是根據快重傳的規定,這時接收方會連續發出3個對M2的重復確認,以告訴發送方M3到達,要求重傳。發送方接收到三個連續的對M2的重復確認,就會立即重傳M3而不必等到M3的重傳計時器到期。(該算法會使整個網絡的吞吐量增加約20%,加大了網絡的負擔)。
(2)快恢復(Fast Recovery)
①當發送方連續收到三個重復確認時,就執行“乘法減小”算法。即把慢開始門限減半(為1200)。但請註意,接下來不執行慢開始算法,而是執行快恢復算法。
②發送方認為現在網絡很可能沒有發生擁塞,可能只是網絡一些小故障。(因為如果網絡發生了嚴重擁塞,就不會一連有好幾個報文段連續到達接收方,就不會連續發送重復確認)。因此,與慢開始不同,現在它不執行慢開始算法而是執行快恢復,即cwnd不設為MSS,而是讓cwnd=ssthresh=1200(即為2400的一半),然後加法線性增大。
6.4 發送窗口的上限
(1)發送方的發送窗口受擁塞控制(cwnd)和接收方的接收窗口(rwnd)大小的影響。從接收方對發送方的流量控制的角度考慮,發送方的發送窗口一定不能超過對方給出的接收窗口值。
(2)發送方窗口的上限值=min(rwnd, cwnd)。
第8章 傳輸層(6)_擁塞控制