擁塞避免算法和慢啓動算法的共同作用



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


擁塞避免算法和慢啓動算法是兩個目的不同、獨立的算法。但是當擁塞發生時,我們希望降低分組進入網絡的傳輸速率,於是可以調用慢啓動來作到這一點。在實際中這兩個算法通常在一起實現。


擁塞避免算法和慢啓動算法需要對每個連接維持兩個變量:一個擁塞窗口 cwnd和一個慢啓動門限ssthresh。這樣得到的算法的工作過程如下:
1) 對一個給定的連接,初始化cwnd爲1個報文段,ssthresh爲65535個字節。


2) TCP輸出例程的輸出不能超過 cwnd和接收方通告窗口的大小。擁塞避免是發送方使用的流量控制,而通告窗口則是接收方進行的流量控制。前者是發送方感受到的網絡擁塞的估計,而後者則與接收方在該連接上的可用緩存大小有關。


3) 當擁塞發生時(超時或收到重複確認),ssthresh被設置爲當前窗口大小的一半( c w n d和接收方通告窗口大小的最小值,但最少爲 2個報文段)。此外,如果是超時引起了擁塞,則cwnd被設置爲1個報文段(這就是慢啓動)。


4) 當新的數據被對方確認時,就增加cwnd,但增加的方法依賴於我們是否正在進行慢啓動或擁塞避免。如果 cwnd小於或等於ssthresh,則正在進行慢啓動,否則正在進行擁塞避免。慢啓動一直持續到我們回到當擁塞發生時所處位置的半時候才停止(因爲我們記錄了在步驟 2中給我們製造麻煩的窗口大小的一半),然後轉爲執行擁塞避免。
慢啓動算法初始設置 cwnd爲1個報文段,此後每收到一個確認就加 1。這會使窗口按指數方式增長:發送 1個報文段,然後是2個,接着是4個⋯⋯。
擁塞避免算法要求每次收到一個確認時將 cwnd增加1 /cwnd。與慢啓動的指數增加比起來,這是一種加性增長(additive increase)。我們希望在一個往返時間內最多爲cwnd增加1個報文段(不管在這個RT T中收到了多少個ACK),然而慢啓動將根據這個往返時間中所收到的確認的個數增加cwnd。


下圖是慢啓動和擁塞避免的一個可視化描述。我們以段爲單位來顯示cwnd和ssthresh,但它們實際上都是以字節爲單位進行維護的。

在該圖中,假定當cwnd爲32個報文段時就會發生擁塞。於是設置 ssthresh爲16個報文段,而cwnd爲1個報文段。在時刻 0發送了一個報文段,並假定在時刻 1接收到它的 ACK,此時cwnd增加爲2。接着發送了2個報文段,並假定在時刻2接收到它們的ACK,於是cwnd增加爲4(對每個ACK增加1次)。這種指數增加算法一直進行到在時刻 3和4之間收到8個ACK後cwnd等於ssthresh時才停止,從該時刻起, cwnd以線性方式增加,在每個往返時間內最多增加 1個報文段。

正如我們在這個圖中看到的那樣,術語“慢啓動”並不完全正確。它只是採用了比引起擁塞更慢些的分組傳輸速率,但在慢啓動期間進入網絡的分組數增加的速率仍然是在增加的。只有在達到ssthresh擁塞避免算法起作用時,這種增加的速率纔會慢下來。

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