天天看點

TCP-IP學習筆記回顧-4.7 TCP的流量控制-4.8 TCP的擁塞控制【重點】

4.7 TCP的流量控制

流量控制(flow control)就是讓發送方的發送率不要太快,要讓接受方來得及接收。利用滑動視窗機制可以很友善地在TCP連接配接上實作對發送方的流量控制。發送方的發送視窗不能超過接收方給出的接收視窗的數值。TCP的視窗機關是位元組,不是封包段。

4.8 TCP的擁塞控制【重點】

在計算機網絡中的鍊路容量(即帶框),交換節點中的緩存和處理機的速度等,都是網絡的資源。在某段時間,若對網絡中某資源的需求超過了該資源所能提供的可用部分,網絡的性能就要變壞——産生擁塞(congestion)。

增加資源不能解決擁塞。因為網絡擁塞是一個非常複雜的問題。簡單地采用上述做法,在許多情況下,不但不能解決擁塞問題,而且還可能使網絡的性能更壞。

網絡擁塞往往是由許多因素引起的。如:

(1)增大緩存,但未提高輸對外連結路的容量和處理機的速度,排隊等待時間将會大大增加,引起大量逾時重傳,解決不了網絡擁塞;

(2)提高處理機處理的速率會會将瓶頸轉移到其他地方;

擁塞引起的重傳并不會緩解網絡的擁塞,反而會加劇網絡的擁塞。

擁塞控制就是防止過多的資料注入到網絡中,這樣可以使網絡中的路由器或鍊路器不緻過載。擁塞控制所要做的都有一個前提,就是網絡能夠承受現有的網絡負荷。擁塞控制是一個全局性的過程,涉及到所有的主機、所有的路由器,以及與降低網絡傳輸性能有關的所有因素。相反,流量控制往往指點對點通信量的控制,是個端到端的問題。流量控制所要做的就是抑制發送端發送資料的速率,以便使接收端來得及接收。

TCP-IP學習筆記回顧-4.7 TCP的流量控制-4.8 TCP的擁塞控制【重點】

圖中橫坐标是提供的負載(offered load),代表機關時間内輸入給網絡的分組數目。是以提供的負載也稱為輸入負載或網絡負載。縱坐标是吞吐量(throughput),代表機關時間從網絡輸出的分組數目。

• 擁塞控制是很難設計的,因為它是一個動态的(而不是靜态的)問題。

• 目前網絡正朝着高速化的方向發展,這很容易出現緩存不夠大而造成分組的丢失。但分組的丢失是網絡發生擁塞的征兆而不是原因。

• 在許多情況下,甚至正是擁塞控制本身成為引起網絡性能惡化甚至發生死鎖的原因。這點應特别引起重視。

**擁塞控制可分為開環控制和閉環控制兩種方法。**開環控制方法就是在涉及網絡時實作将有關發生擁塞的因素考慮周到,力求網絡在工作時不産生擁塞。

閉環控制是基于回報環路的概念。以下是閉環控制的具體措施:

(1)檢測網絡系統以便檢測到擁塞在何時、何處發生。

(2)把擁塞發生的資訊傳送到可采取行動的地方。

(3)調整網絡系統的運作以解決出現的問題。

幾種擁塞控制方法(算法):

慢開始(slow-start)、擁塞避免(congestion avoidance)、快重傳(fast retransmit)和快恢複(fast recovery)。

1.慢開始和擁塞避免

發送方維持一個叫做**擁塞視窗cwnd(congestion window)**的狀态變量。擁塞視窗的大小取決于網絡的擁塞程度,并且動态地在變化。發送方讓自己的發送視窗等于擁塞視窗。

慢開始算法的思路就是,不要一開始就發送大量的資料,先探測一下網絡的擁塞程度,也就是說由小到大逐漸增加擁塞視窗的大小。

這裡用封包段的個數的擁塞視窗大小舉例說明慢開始算法,實時擁塞視窗大小是以位元組為機關的。如下圖:

TCP-IP學習筆記回顧-4.7 TCP的流量控制-4.8 TCP的擁塞控制【重點】

當然收到單個确認但此确認多個資料報的時候就加相應的數值。是以一次傳輸輪次之後擁塞視窗就加倍。這就是乘法增長,和後面的擁塞避免算法的加法增長比較。

為了防止cwnd增長過大引起網絡擁塞,還需設定一個**慢開始門限(ssthresh)**狀态變量。ssthresh的用法如下:

當cwnd<ssthresh時,使用慢開始算法。

當cwnd>ssthresh時,改用擁塞避免算法。

當cwnd=ssthresh時,慢開始與擁塞避免算法任意。

擁塞避免算法讓擁塞視窗緩慢增長,即每經過一個往返時間RTT就把發送方的擁塞視窗cwnd加1,而不是加倍。這樣擁塞視窗按線性規律緩慢增長。

無論是在慢開始階段還是在擁塞避免階段,隻要發送方判斷網絡出現擁塞(其根據就是沒有收到确認,雖然沒有收到确認可能是其他原因的分組丢失,但是因為無法判定,是以都當做擁塞來處理),就把慢開始門限設定為出現擁塞時的發送視窗大小的一半。(個人覺得書上說得不完全,自己加的–>)慢開始階段出現擁塞時,擁塞視窗大小為慢開始門限值。當為擁塞避免階段時,把擁塞視窗設定為1,執行慢開始算法。如下圖:

TCP-IP學習筆記回顧-4.7 TCP的流量控制-4.8 TCP的擁塞控制【重點】

再次提醒這裡隻是為了讨論友善而将擁塞視窗大小的機關改為資料報的個數,實際上應當是位元組。

乘法減小:出現逾時,慢開始門限值為擁塞視窗值乘以 0.5

“乘法減小“是指不論在慢開始階段還是擁塞避免階段,隻要出現一次逾時(即出現一次網絡擁塞),就把慢開始門限值 ssthresh 設定為目前的擁塞視窗值乘以 0.5。

網絡頻繁出現擁塞時,ssthresh 值就下降得很快,以大大減少注入到網絡中的分組數。

加法增大:擁塞避免階段,擁塞視窗+1

“加法增大”是指執行擁塞避免算法後,在收到對所有封包段的确認後(即經過一個往返時間),就把擁塞視窗 cwnd增加一個 MSS 大小,使擁塞視窗緩慢增大,以防止網絡過早出現擁塞。

2.快重傳和快恢複

快重傳我了解的意思就是:還沒等到重傳計時器到期就開始重傳封包段。

快重傳要求接收方在收到一個失序的封包段後就立即發出重複确認(為的是使發送方及早知道有封包段沒有到達對方)而不要等到自己發送資料時捎帶确認。快重傳算法規定,發送方隻要一連收到三個重複确認就應當立即重傳對方尚未收到的封包段,而不必繼續等待設定的重傳計時器時間到期。如下圖:

TCP-IP學習筆記回顧-4.7 TCP的流量控制-4.8 TCP的擁塞控制【重點】

快重傳配合使用的還有快恢複算法,有以下兩個要點:

①當發送方連續收到三個重複确認時,就執行“乘法減小”算法,把ssthresh門限減半。但是接下去并不執行慢開始算法。

②考慮到如果網絡出現擁塞的話就不會收到好幾個重複的确認,是以發送方現在認為網絡可能沒有出現擁塞。是以此時不執行慢開始算法,而是将cwnd設定為ssthresh的大小(快恢複),然後執行擁塞避免算法。如下圖:

TCP-IP學習筆記回顧-4.7 TCP的流量控制-4.8 TCP的擁塞控制【重點】

自己對TCP擁塞控制這個過程的了解:由于最開始不知道網絡的負荷情況,(階段1)采用慢開始算法,擁塞視窗cwdn從1開始,每經過一個傳輸輪次,cwnd就加倍。當cwnd增加到32時,網絡出現逾時(假設超過24有可能網絡發生了擁塞)。前面慢開始和擁塞避免中提到,無論是在慢開始階段還是在擁塞避免階段,隻要發送方判斷網絡出現擁塞,就把慢開始門限ssthresh設定為出現擁塞時的發送視窗大小的一半(“乘法減小”),即ssthresh=cwnd/2=32/2=16。(階段2)當擁塞視窗cwnd增大超過慢開始門限ssthresh時,就改為執行擁塞避免算法,每經過一個傳輸輪次,cwnd就加1(“加法增大”)。直到擁塞視窗的值增大到24時,(階段3)網絡再次出現逾時,當發送方連續收到三個重複确認,這時就會采用“快重傳快回複算法”,新的cwnd=新的ssthresh=舊cwnd/2=24/2=12(cwnd就不像之前那樣采用慢開始算法設為1了)。然後開始執行擁塞避免算法(“加法增大”),使擁塞視窗線性的增大。

在采用快回複算法時,慢開始算法隻是在TCP連接配接建立時(試探網絡的負載情況)和網絡出現逾時時才能使用。

接收方根據自己的接收能力設定了接收視窗rwnd,并把這個視窗值寫入TCP首部中的視窗字段,傳送給發送方。是以,接收視窗又稱為通知視窗。是以,從接收方對發送方的流量控制的角度考慮,發送方的發送視窗一定不能超過對方給出的接收視窗rwnd 。

發送方視窗的上限值 = Min [ rwnd, cwnd ]

當rwnd < cwnd 時,是接收方的接收能力限制發送方視窗的最大值。

當cwnd < rwnd 時,則是網絡的擁塞限制發送方視窗的最大值。

繼續閱讀