1. 慢启动(slow Start)
亚当隔着山头扔玉米棒子给夏娃,亚当不知道夏娃能接多快,于是一次扔1个,编号为1.
夏娃喊2,意思是老娘1号棒子收到了,准备迎接2号玉米棒子。
亚当一次扔2个,编号为2,3
夏娃喊4,准备迎接更多的玉米棒子。
亚当一次扔4个,编号为4、5、6、7
夏娃喊8,意识是让玉米棒子来得更猛烈些吧!
亚当一次扔8个,编号为8、9、……15
夏娃嘴里一直重复喊号12,次数为3次,这里传达了以下信息:
8-11号玉米棒子已经安全到达
12号玉米棒子肯定丢了
13、14、15号玉米棒子也应该安全到达,否则夏娃只会喊一次12,是13、14、15号玉米触发了夏娃重复的叫喊
亚当意识到自己扔太快了,需要降速,降到多少合适呢?降一半,一次扔4个没有问题
if(dupacks >=3){
ssthresh = max(2,cwmd/2);
}
//这里cwnd = 8,所以ssthresh=4
注释:ssthresh(Slow Start Threshold:慢启动阈值),慢启动的峰值线,一旦超过该峰值线,则进入拥塞避免。
但外面至少还有3个发出的玉米棒子还没有确认(Outstanding Packet),如果将
cwnd = ssthresh = 4
则意味着亚当最多一次可以扔4个玉米,但3个发出却还没确认的玉米棒子占了3个名额,所以亚当最多一次只能扔一次玉米棒子,发送速率急剧下降,这不合理
2. 快速重传
既然收到夏娃三次重复的确认,说明丢的玉米棒子(12)后的3个已经成功接收,不在空中飞(Fight),这三个虽然还没有明确的确认,但已经隐含地确认,所以这3个玉米棒子不应该占据在空中飞玉米的数量,在空中飞的玉米应该是4个,再加上到达夏娃的3个,所以亚当的cwnd(Congestion Windows:发送方的 Window 大小 )应该为7个
cwnd = ssthresh + 3 * SMSS = 4+3 = 7
亚当的快速重传
- 重传12号玉米
- 扔16、17、18、19号玉米
快读重传结束信号
- 一旦亚当接到16号玉米或者之后的确认,快速重传/快速修复完成
3. 拥塞避免
- 亚当意识到一次扔4个安全,于是选择
cwnd = ssthresh = 4
为基准线,如果一次扔4个没问题,那就一次扔5、6、7,线性增长到夏娃的接收极限
·
网友评论