TCP的擁塞控制 (二)

TCP Reno

TCP  Reno引入了ssthresh(Slow Start threshold)變量,做爲TCPSlow StartCongestion Avoidance兩個階段的分界線。算法

cwnd < ssthresh時,TCP保持在Slow Start階段;網絡

cwnd >= ssthresh時,TCP進入Congestion Avoidance階段。性能

ssthresh實際上影響着TCP的性能,但其初始值在RFC中沒有明肯定義,能夠爲任意大的值,在實現時通常初始化爲rwndspa

 

TCP Reno擁塞控制算法繼承了「數據包守恆準則」,保證處於網絡中的packet的總量是守恆的。它經過4個算法保證這一點:繼承

 

1. Slow Startit

TCP鏈接創建以後,因爲不知道實際可用的網絡帶寬,所以採用Slow Start算法,當心翼翼地對網絡狀況進行探測。io

進入Slow Start階段,首先設置cwnd=1,接着cwnd會隨着時間的推動呈指數級增長(所以,其過程並不slow)。具體作法是每收到一個ACK,就對cwnd+1,這樣至關於每通過一個RTTcwnd就翻一番。ast

在遇到兩種狀況時,Slow Start階段會截止:class

(1)當cwnd達到ssthresh時,此時TCP會進入Congestion Avoidance階段。效率

(2)當擁塞發生時,此時又分兩種狀況:

(2.1)若是是超時,會重傳未被響應的packet,並將ssthresh設置爲cwnd/2,並將cwnd重置爲1,而後從新進入Slow Start階段。

(2.2)若是是3個重複ACK,會先進行Fast Retransmit,而後進入Fast Recovery階段。

 

2. Congestion Avoidance

在該階段,cwnd再也不像Slow Start那樣指數級增加,而是線性增加。具體作法是每收到一個ACK,就對cwnd+1/cwnd,這樣至關於每過一個RTTcwnd都加1

當擁塞發生時,Congestion Avoidance階段即截止,接下來的過程與Slow Start處理擁塞的方式相同:

(1)若是是超時,會重傳未被響應的packet,並將ssthresh設置爲cwnd/2,並將cwnd重置爲1,而後進入Slow Start階段。

(2)若是是3個重複ACK,會先進行Fast Retransmit,最後進入Fast Recovery階段。

 

3. Fast Retransmit

當檢測是否丟包時,每次都要等待超時的發生,會浪費很長時間,所以引入了Fast Retransmit機制。

經過TCP的機制可知,sender只要收到3個重複ACK,即認爲丟包發生,此時會當即重傳丟失的包,而再也不等待超時的出現。

 

4. Fast Recovery

爲了解決丟包後進入Slow Start引發的效率下降,在Fast Retransmit的基礎上,又引入了Fast Recovery機制。

該階段首先將ssthresh設置爲cwnd/2,而後重傳丟失的包,再對cwnd進行充氣(而不是SlowStart那樣將cwnd重置爲1),具體作法是在cwnd=ssthresh+3(用以反映3packet正常離開了network)

以後,每當再次收到一個重複ACK時,sender都會對cwnd+1,這是爲了反映一個packet正常離開了network

這裏可能有兩個疑問:

(1)怎麼得知一個packet正常離開了network呢?這是由於receiver只有在收到packet以後,纔會回覆ACK,既然sender收到了ACK,說明有一個packetreceiver接收,即正常離開了network

(2)那麼,爲何須要對cwnd+1呢?這是由於一個packet離開了network,使得network再也不飽和,爲了使network從新平衡,須要發送新的packetnetwork中,這就必須經過增大cwnd來實現。

隨着cwnd的增大,會將新進入窗口的packet發送出去。這個過程稱爲inflating

直到收到新的ACK以後,inflating截止,進入deflating過程。所謂deflating,即將cwnd設置爲ssthresh

爲何收到新的ACK後,須要進行deflating呢?這是由於,新的ACK意味着,剛進入Fast Recovery時重傳的packet已經被接收,該ACK便是receiver對重傳packet的迴應。能夠認爲lost packet已經恢復了,能夠結束Fast Recovery階段。

值得注意的是,該ACK可能一次性響應了多個連續的packet。這是由於,從lost packet發生時起,到lost packet恢復爲止,期間sender發送了多個後續packet,所以在receiver回覆ACK時,會指明已接收到的最末端的packetsequence number

相關文章
相關標籤/搜索