#include<iostream>
#include<ctime>
#include<windows.h>
using namespace std;
const int RTT = 1;
int ssthresh = 20; //门限初始值
int mild, severt; //轻度、重度拥塞时窗口大小
int TranRound(int cwnd){
if(cwnd <= ssthresh) cwnd *= 2; //①慢启动
else cwnd++;//②拥塞避免
if(cwnd >= severt){ //④重度拥塞下慢启动
cout<<"严重拥塞窗口="<<severt<<" cwnd="<<cwnd<<endl;
cout << "重传计时器超时,严重拥塞,重新慢启动!" << endl;
ssthresh=cwnd;
cwnd=1;
}
else if(cwnd >= mild){ //③轻度拥塞下快速恢复
cout<<"轻度拥塞窗口="<<mild<<" cwnd="<<cwnd<<endl;
cout << "收到连续三个ACK,轻度拥塞,快速恢复!" << endl;
ssthresh = cwnd / 2;
cwnd = ssthresh;
}
Sleep(RTT * 1000); //传输等待时间1s
return cwnd;
}
void Rand(){//随机生成轻度和重度拥塞窗口大小;
srand(time(0));
for (int i = 0; i < 100; i++){
mild=20+rand() % 25;
severt=mild+rand()%10+5;
}
}
int main(){
while(true){
int cwnd;
cout << "请输入1-开始算法 0-退出程序:" << endl;
cin>>cwnd;
if(!cwnd) break;
cout<<"开始慢启动:"<<endl;
for(int time = 0; time <= 20; time+=RTT){
Rand();
cout<<"time="<<time<<" cwnd="<<cwnd<<" ssthresh="<<ssthresh<<endl;
cwnd = TranRound(cwnd);//拥塞控制
}
}
}