TCP擁塞控制
基本概念
在講擁塞控制之前,先眼熟幾個概念rwnd(接收視窗) 、cwnd(擁塞視窗) 、ssthresh(慢啟動門限)
我們都知道,TCP是通過每次在首部設定接收視窗的大小來控制流量傳輸而不導致接收快取溢位的。
而擁塞控制則是加了個擁塞視窗來維護,擁塞視窗只是個狀態量,並沒有在TCP首部。而TCP的傳送視窗
取決與擁塞視窗和接收視窗的。傳送視窗就是擁塞視窗和接收視窗的最小值。即min(rwnd,cwnd) 。瞭解了
這麼些概念後我們接著往下看。
網路擁塞的定義
當發生了超時重傳或者冗餘ACK的時候我們就可以認定發生了網路擁塞,這時候就需要進行擁塞控制。而正常
的收發報文段即傳送端傳送分組,接收方傳送確定ACK分組則認為網路流程。不需要擁塞控制。
擁塞控制演算法
當連線建立的時候cwnd預設值為一個報文段,ssthresh預設為65535個位元組。
慢啟動演算法
慢啟動演算法的執行條件是cwnd<=ssthresh。連線剛建立cwnd = 1,進入慢啟動演算法。慢啟動演算法是當網路流通時,
即沒有發生超時重傳和冗餘ACK重傳客戶端TCP每接收到一個接收段的ACK就將 cwnd x 2,就是將擁塞視窗翻倍。
當發生超時重傳後將ssthresh設定為當前視窗大小的一般,即 min(cwnd,rwnd)/ 2,然後將cwnd設定為1,重新
進入慢啟動。當發生冗餘ACK重傳報文段的時候則進入快重傳快恢復階段,快重傳快恢復下面會將。還有一種情況
就是當cwnd > ssthresh的時候就認為當前網路很有可能發生擁塞,不能在那麼快的提高擁塞視窗的大小了,這時候
就進入擁塞避免階段,擁塞避免階段也會將。
因此我們可以總結出進入慢啟動演算法的條件是擁塞視窗小於等於慢啟動門限 。而退出慢啟動演算法進入其他演算法則是有
三種情況:1、出現了超時重傳;2、出現了冗餘ack;3、擁塞視窗大於慢啟動門限。
擁塞控制演算法
當擁塞視窗大於慢啟動門限的時候就會進入擁塞控制,這時候擁塞視窗就不再採用指數增長而是進行線性增長,即每次
cwnd + 1。當出現超時重傳的處理方法和慢啟動出現超時重傳的處理方法相同,即ssthresh = min(cwnd,rwnd) / 2
cwnd = 1。然後進入慢啟動演算法。當出現冗餘ack的時候則進入快重傳,快恢復演算法。
因此進入擁塞控制的前提是:擁塞視窗大於慢啟動門限。而退出擁塞控制的條件是擁塞視窗小於慢啟動門限 。
快重傳、快恢復演算法
當出現冗餘ack的時候我們就可以認為ack確認的報文段的下一個報文段丟失了,我們這時候需要快速將該報文段傳送給接收方,
然後將慢啟動門限設定為當前視窗的一半,即ssthresh = min(cwnd,rwnd)/2,並且cwnd = ssthresh。直接進入擁塞避免。
為什麼後面不將cwnd設為1進入慢啟動呢,我們認為當出現冗餘ack而重傳下一個報文段的時候嚴格上不算是擁塞導致的。所以
直接進入擁塞避免。
總結
經過上述的描述我們可以對整個擁塞避免流程做個小總結
當出現超時重傳和冗餘ack的時候慢啟動門限都要設定為當前傳送視窗的一半,不同的就是超時重傳還得將擁塞視窗大小設為1,重新
進入慢啟動,而冗餘ack則是將擁塞視窗設為慢啟動門限大小並且進入擁塞避免。