TCP的慢啟動和擁塞避免


TCP為了保證數據的完整性采用了許許多多的方法,像啟用重傳定時器、堅持定時器,通過最大路徑發現獲取到鏈路中允許通過的最大數據包大小,還有一些其它的如慢啟動、擁塞避免、快速重傳等等。

慢啟動:

一般通信時,發送方一開始便向網絡發送多個報文段,直至達到接收方通告的窗口大小為止。當發送方和接收方處於同一個局域網時,這種方式是可以的。但是如果在發送方和接收方之間存在多個路由器和速率較慢的鏈路時,就有可能出現一些問題。一些中間路由器必須緩存分組,並有可能耗盡存儲器的空間。 
慢啟動算法通過觀察到新分組進入網絡的速率應該與另一端返回確認的速率相同而進行工作 。
慢啟動為發送方的T C P增加了另一個窗口:擁塞窗口 (congestion window),記為c w n d。當 與另一個網絡的主機建立 T C P連接時,擁塞窗口被初始化為 1個報文段(即另一端通告的報文段大小) 。每收到一個 A C K,擁塞窗口就增加一個報文段( c w n d以字節為單位,但是慢啟動以報文段大小為單位進行增加)。發送方取擁塞窗口與通告窗口中的最小值作為發送上限。擁塞窗口是發送方使用的流量控制,而通告窗口則是接收方使用的流量控制。

 

 

在時間0,發送方發送了一個報文段。由於發送方處於慢啟動中(其擁塞窗口為 1個報文段),因此在繼續發送以前它必須等待該數據段的確認。
在時間1, 23,報文段從左向右移動一個時間單元。在時間 4接收方讀取這個報文段並產生確認。經過時間 567A C K移動到左邊的發送方。我們有了一個 8個時間單元的往返時間RT TR o u n d - Trip Ti m e)。我們有意把 A C K報文段畫得比數據報文段小,這是因為它通常只有一個 I P首部和一個T C P首部。這里顯示僅僅是一個單向的數據流動,並且假定 A C K的移動速率與數據報文段的移動速率相等。實際上並不總是這樣。
當發送方收到A C K后,在時間89發送兩個報文段(我們標記為23)。此時它的擁塞窗口為2個報文段。這兩個報文段向右傳送到接收方,在時間1 21 3接收方產生兩個A C K。這兩個返回到發送方的A C K之間的間隔與報文段之間的間隔一致,被稱為 T C P的自計時( s e l f - c l o c k i n g )行為。由於接收方只有在數據到達時才產生A C K,因此發送方接收到的A C K之間的間隔與數據到達接收方的間隔是一致的(然而在實際中,返回路徑上的排隊會改變ACK的到達率)。

 

 

 2A C K的到達使得擁塞窗口從 2個報文段增加為 4個,而這4個報文段在時間 1 6 ~ 1 9時被發送。第 1A C K在時間2 3到達。 4A C K的到達使得擁塞窗口從4個報文段增加為8個,並在時間2 4 ~ 3 1發送8個報文段。
在時間3 1及其后續時間,發送方和接收方之間的管道 ( p i p e )被填滿。此時不論擁塞窗口和通告窗口是多少,它都不能再容納更多的數據。每當接收方在某一個時間單位從網絡上移去一個報文段,發送方就再發送一個報文段到網絡上。但是不管有多少報文段填充了這個管道,返回路徑上總是具有相同數目的 A C K

 

擁塞避免:

擁塞避免算法是一種處理丟失分組的方法。該算法假定由於分組受到損壞引起的丟失是非常少的(遠小於 1 %),因此分組丟失就意味着在源主機和目的主機之間的某處網絡上發生了擁塞。有兩種分組丟失的指示:發生超時和接收到重復的確認。

擁塞避免算法和慢啟動算法是兩個目的不同、獨立的算法。但是當擁塞發生時,我們希望降低分組進入網絡的傳輸速率,於是可以調用慢啟動來作到這一點。在實際中這兩個算法通常在一起實現。 擁塞避免算法和慢啟動算法需要對每個連接維持兩個變量:一個擁塞窗口 c w n d和一個慢啟動門限s s t h re s h。這樣得到的算法的工作過程如下:
1) 對一個給定的連接,初始化 c w n d1個報文段, s s t h re s h6 5 5 3 5個字節。
2) TCP輸出例程的輸出不能超過 c w n d和接收方通告窗口的大小。擁塞避免是發送方使用的流量控制,而通告窗口則是接收方進行的流量控制。前者是發送方感受到的網絡擁塞的估計,而后者則與接收方在該連接上的可用緩存大小有關。
3) 當擁塞發生時(超時或收到重復確認) , s s t h re s h被設置為當前窗口大小的一半( c w n d和接收方通告窗口大小的最小值,但最少為 2個報文段) 。此外,如果是超時引起了擁塞,則c w n d被設置為1個報文段(這就是慢啟動)。
4) 當新的數據被對方確認時,就增加 c w n d,但增加的方法依賴於我們是否正在進行慢啟動或擁塞避免。如果 c w n d小於或等於 s s t h re s h,則正在進行慢啟動,否則正在進行擁塞避免。慢啟動一直持續到我們回到當擁塞發生時所處位置的半時候才停止(因為我們記錄了在步驟 2中給我們制造麻煩的窗口大小的一半),然后轉為執行擁塞避免。
慢啟動算法初始設置 c w n d1個報文段,此后每收到一個確認就加 1,呈一種指數形態增長。擁塞避免算法要求每次收到一個確認時將 c w n d增加1 /c w n d。與慢啟動的指數增加比起來,這是一種加性增長 (additive increase)。我們希望在一個往返時間內最多為 c w n d增加1個報文段(不管在這個 RT T中收到了多少個 A C K),然而慢啟動將根據這個往返時間中所收到的確認的個數增加c w n d

 

 


在該圖中,假定當 c w n d3 2個報文段時就會發生擁塞。於是設置 s s t h re s h1 6個報文段,而c w n d1個報文段。在時刻 0發送了一個報文段,並假定在時刻 1接收到它的 A C K,此時c w n d增加為2。接着發送了2個報文段,並假定在時刻 2接收到它們的 A C K,於是c w n d增加為4(對每個A C K增加1次) 。這種指數增加算法一直進行到在時刻 34之間收到8A C Kc w n d等於s s t h re s h時才停止,從該時刻起, c w n d以線性方式增加,在每個往返時間內最多增加 1個報文段。

可以理解為 c w n d小於等於16時,采用慢啟動算法,大於16時,采用擁塞避免算法。至於慢啟動門限的這個取值16,是初始化為最大擁塞窗口的一半。
慢啟動只是采用了比引起擁塞更慢些的分組傳輸速率,但在慢啟動期間進入網絡的分組數增加的速率仍然是在增加的。
只有在達到s s t h re s h擁塞避免算法起作用時,這種增加的速率才會慢下來。

 

當流動報文段數量增加到超過最大擁塞窗口數量時,會引起報文丟失,此時,會有快速重傳、快速回復等算法來進行一系列的修復操作,如:修改s s t h re s h為當前擁塞窗口的一半並重傳丟失報文等等。





免責聲明!

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



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