本節(jié)我們看具體tcp場景下,擁塞算法如何計算cwnd和ssthresh。 一個擁塞算法的模型對于一個tcp連接,如果mss=256,那么cwnd和ssthresh的初始值分別為 Cwnd=256 Ssthresh=65535 每次收到一個ack,cwnd增加一個mss,即增加256,那么cwnd的變化值分別為: 256、768、1024、1280等等。 假如不會發(fā)生擁塞,那么cwnd會繼續(xù)增加,最終cwnd會大于window size,那么發(fā)送的流量就按照window size大小為準。 Syn報文丟失情景的擁塞算法1、初始化 Cwnd=256 Ssthresh=65535 2、syn丟失,超時重傳syn Ssthresh=2*mss(ssthresh的最小值就是兩倍的mss,不能再小了) Cwnd維持不變,cwnd保持初始化的256 3、收到syn ack Cwnd和ssthresh維持不變,因為沒有發(fā)送任何數(shù)據(jù),這個ack不是數(shù)據(jù)的ack,不會更新算法參數(shù) Cwnd=256 Ssthresh=512 數(shù)據(jù)傳送階段擁塞算法1、發(fā)送第一個數(shù)據(jù)報文,即發(fā)送報文1的時候, Cwnd=256 Ssthresh=512 Cwnd<ssthresh,這個狀態(tài)處于“慢啟動” 2、客戶端收到第一個ack(報文2),慢啟動cwnd++ Cwnd=512 Ssthresh=512 3、客戶端收到第二個ack(報文5),當前仍然處于慢啟動狀態(tài),cwnd++ Cwnd=768 Ssthresh=512 不再是慢啟動狀態(tài)了。 由于SYN報文丟失,sstrhesh發(fā)生了變化(設(shè)置為最小值2*mss = 512),所以,這一步就進入了擁塞避免。 而cwnd也不會出現(xiàn)下面所列的遞增關(guān)系 256、768、1024、1280 4、客戶端收到第三個ack(報文8),這個時候已經(jīng)不在慢啟動狀態(tài),cwnd按照擁塞避免算法變化 Cwnd = cwnd + (segsize * segsize)/cwnd + segsize/8 Cwnd = 768 + (256*256)/768 + 256/8 = 885 5、客戶端收到第四個ack(報文10),擁塞避免 Cwnd = 885 + (256*256)/885 + 256/8 = 991 6、客戶端收到第五個ack(報文12),擁塞避免 Cwnd = 991 + (256*256)/991 + 256/8 = 1089 |
|