TCP擁塞控制:慢啟動,擁塞避免,快速重傳,快速恢復
擁塞控制的目的:為了提高網路利用率,降低丟包率,並保證網路資源對每條資料流的公平性
擁塞控制最終是控制了什麼?:傳送端向網路一次連續寫入的資料量,即SWND(傳送視窗)。
慢啟動:
當主機開始傳送資料時,如果立即將大量資料注入網路,就容易引起網路擁塞。而慢啟動演算法就是先給定一個較小的cwnd(擁塞視窗)作為“試探”。此後每收到一個確認報文段,CWND按照方式增長。
當如果不施加其他手段,慢啟動會呈指數增長,(可見慢啟動其實不慢),並最終導致網路擁塞。因此TCP中定義了另一個重要的狀態變數:慢啟動門限(ssthresh)。當CWND超過該值時進入擁塞避免階段。
擁塞避免:
擁塞避免演算法使得CWND按照線性方式增加,從而減緩其擴大。擁塞避免演算法有兩種方式:
1、每個RTT時間內按照上式計算新的CWND,無論該RTT時間內收到多少個確認。
2、按照更新CWND。
當 cwnd < ssthresh 時,使用上述的慢開始演算法,當 cwnd > ssthresh 時,停止使用慢開始演算法而改用擁塞避免演算法,當 cwnd = ssthresh 時,既可使用慢開始演算法,也可使用擁塞控制避免演算法。
以上是討論了在未發生網路擁塞情況下的積極避免擁塞的方法。如果網路出現以下兩種情況擁塞時:
1、傳輸超時
2、接收到重複的確認報文段(在發生擁塞時)
如果發生第一種情況,就重新調整慢啟動門限的值ssthresh,故而擁塞控制再次進入慢啟動階段。
如果為第二種情況,則啟用快速重傳和快速恢復(如果發生在重傳定時器溢位後當作第一種情況處理)。
快速重傳
如果發生上述第二種情況,擁塞控制演算法要怎麼判斷此時是真的發生了擁塞呢?具體做法:快重傳演算法要求首先接收方收到一個失序的報文段後就立刻發出重複確認,傳送端如果連續收到了3個重複的確認報文段,就認為擁塞發生了。當收到第3個重複的確認報文時,然後立即重傳丟失的報文段。
快速恢復
1、當收到第3個重複的確認報文段時,按照上式的方法計算ssthresh,並按照設定CWND。
2、每收到一個重複的確認報文,設定CWND=CWND+SMSS。此時傳送端可以傳送新的TCP報文段(如果新的CWND允許)。
3、當收到新資料的確認時,設定CWND=ssthresh(第一步得到)。
此時不執行慢啟動,而是擁塞避免演算法。