TCP/IP阻塞控制機制

慢啓動SS,加性增AIMD算法
當出現丟包時,減少擁塞窗口CWin長度降低發送速率,在一般情況下謹慎增加CWin長度。

閾值:幫助TCP判斷何時進入阻塞避免區域,表示從慢啓動階段進入阻塞階段的閾值。

void slow_start(void){
    CWin=1MSS;
    n=0;
    while(沒有丟包){
                if(在RTT期間接受到了ACK){
                        CWin=CWin*2的n次方;
                        n++;
                        if(CWin>=ssthresh){  //若窗口大於閾值
                                    //去執行加性增算法
                                    break;
                        }
                }else{
                    CWin=1MSS;
                }
    }
}

void additive_increase(void){
    ssthresh=CWin/2;
    while(收到ACK){
            if(CWin>=ssthresh){
                    CWin=CWin+MSS*(MSS/CWin);
                    if(收到三個冗餘的ACK){
                            ssthresh=CWin/2;
                            CWin=CWin/2;
                            break;
                    }
                    if(檢測到超時事件){
                            ssthresh=CWin/2;
                            CWin=1MSS;
                            if(CWin<ssthresh){
                                //執行slow_start算法
                                break;
                            }
                    }
            }
    }
}

案例:現在閾值ssthresh=8MSS,一旦CWin=12MSS時就會發生超時事件。 當T=15時,CWin的走勢。
分析,首先慢啓動,一直到閾值跳轉到加性增直到超時閾值減半,重新執行慢啓動。
執行慢啓動算法
T=1   CWin=1   ssthresh=8MSS
T=2   CWin=2   ssthresh=8MSS
T=3   CWin=4   ssthresh=8MSS
T=4   CWin=8   ssthresh=8MSS     //達到閾值,跳轉到加性增,閾值爲CWin/2
T=5   CWin=9   ssthresh=4MSS
T=6   CWin=10 ssthresh=4MSS
T=7   CWin=11 ssthresh=4MSS
T=8   CWin=12 ssthresh=4MSS    //超時則CWin爲1閾值爲CWin/2,跳轉到加性增
T=9   CWin=1   ssthresh=6MSS
T=10 CWin=2   ssthresh=6MSS
T=11 CWin=4   ssthresh=6MSS
T=12 CWin=6   ssthresh=6MSS    //當CWin=8時超過了閾值則爲6,跳轉到加性增
T=13 CWin=7   ssthresh=3MSS
T=14 CWin=8   ssthresh=3MSS
T=15 CWin=9   ssthresh=3MSS

參考:《計算機網絡:原理與實踐》陳鳴

我是菜鳥,我在路上。 

發佈了78 篇原創文章 · 獲贊 17 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章