我是靠谱客的博主 强健美女,最近开发中收集的这篇文章主要介绍TCP拥塞控制算法实现(c++),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

TCP的拥塞控制策略,从慢开始到拥塞避免,出现征兆后做快恢复再做拥塞避免的过程。

模拟样例:

算法实现:

#include<iostream>
#include<cmath>
#include<ctime>
#include<cstdlib>
#include<windows.h>
using namespace std;

//避免使用魔法字符串
#define NORMAL 0  			//正常
#define TIME_OUT 1			//超时
#define THREE_DUP_ACK 2		//3个重复ACK


//全局参数
const int MSS=100;//单个报文段长度 规定为100B   这个是由TCP报文段首部的选项字段MSS定死的,一般可以1KB此处设置100B, 
int ssthresh=16*MSS;//慢启动门限 初值为16
int cwnd=1*MSS;//拥塞窗口,以MSS为单位。初值为1  
int index=0;//传播轮次
int transData=0;//防止程序无休止的死循环 设置总传递的字节  且策略简单定为每次只计算成功传送的,一旦拥塞就假设全部丢失
int sumData;//本次要传递的 总数据量大小 单位字节

/**随机概率产生拥塞
	返回值:
		0:未丢包,网络正常
		1:重传计时器超时   				对应策略:慢启动
		2:3个重复ACK 也即是快速重传		对应策略:快速恢复
*/
int isCrowd(int cwnd){
	int p=cwnd/MSS*2;//产生拥塞概率为p% 也即是 窗口大小/50*100%
	if(rand()%101<p){//p%的概率发生拥塞
		if(rand()%101<50){//50%概率超时
			return TIME_OUT;
		}else{//50%概率返回3个重复ACK 也即是快速重传
			return THREE_DUP_ACK;
		}
	}else{
		return NORMAL;
	}
}


//开始传输
void StartTrans(){
	bool isSlowStart=true;

	//传输数据
	transData+=cwnd;
	if(cwnd<ssthresh){//慢启动
		cout<<"***********************第"<<index++<<"轮传输***********************"<<endl;
		cout<<"慢启动:拥塞窗口cwnd="<<cwnd/MSS<<",慢启动门限ssthresh="<<ssthresh/MSS<<endl;
	}else{//cwnd>ssthresh  拥塞避免
		cout<<"***********************第"<<index++<<"轮传输***********************"<<endl;
		cout<<"拥塞避免:拥塞窗口cwnd="<<cwnd/MSS<<",慢启动门限ssthresh="<<ssthresh/MSS<<endl;
		isSlowStart=false;
	}

	//本轮数据传输完毕,开始判断是否拥塞
	int crow=isCrowd(cwnd);
	if(!crow){//没有拥塞
		if(isSlowStart){//慢启动
			cout<<"检测到网络正常,将窗口加倍!"<<endl;
			cwnd*=2;//窗口加倍
		}else{//拥塞避免
			cout<<"检测到网络正常,将窗口线性增加!"<<endl;
			cwnd+=MSS*(1.0*MSS/cwnd)*cwnd/MSS;
		}
	}else if(crow==TIME_OUT){//超时 (不论此时慢启动还是拥塞避免 策略一样!)
		transData-=cwnd;
		//慢启动
		cout<<"重传计时器超时,回退慢启动!门限置当前窗口减半,窗口置1!"<<endl;
		ssthresh=cwnd/2;
		cwnd=1*MSS;
	}else if(crow==THREE_DUP_ACK){//3个重复ACK
		cout<<"收到3个重复ACK,采取快恢复策略!门限置当前窗口减半,窗口置新门限!"<<endl;
		ssthresh=cwnd/2;
		cwnd=ssthresh;
	}else{
		cout<<"判断拥塞异常!异常返回值:"<<crow<<endl;
		exit(1);
	}

	if(transData<sumData)
		cout<<"已经传输"<<transData<<"B,还剩"<<sumData-transData<<"B"<<endl;
	else{
		cout<<"传输完毕!"<<endl;
		return;
	}
	cout<<endl;
	Sleep(1000*(cwnd%3)+1);//随机停1~3秒
	StartTrans();//不断递归循环 直到发送完毕
}


int main(){
	srand(time(0));
	// freopen("in.txt","r",stdin);
	// freopen("运行结果.txt","w",stdout);
	cout<<"输入本次传送数据量的大小(单位字节B):";
	cin>>sumData;
	cout<<"*********************************开始传输**********************************n"<<endl;
	StartTrans();
	return 0;
}

运行结果:

运行结果1:
输入本次传送数据量的大小(单位字节B):10000
*********************************开始传输**************************

***********************第0轮传输***********************
慢启动:拥塞窗口cwnd=1,慢启动门限ssthresh=16
检测到网络正常,将窗口加倍!
已经传输100B,还剩9900B

***********************第1轮传输***********************
慢启动:拥塞窗口cwnd=2,慢启动门限ssthresh=16
检测到网络正常,将窗口加倍!
已经传输300B,还剩9700B

***********************第2轮传输***********************
慢启动:拥塞窗口cwnd=4,慢启动门限ssthresh=16
检测到网络正常,将窗口加倍!
已经传输700B,还剩9300B

***********************第3轮传输***********************
慢启动:拥塞窗口cwnd=8,慢启动门限ssthresh=16
检测到网络正常,将窗口加倍!
已经传输1500B,还剩8500B

***********************第4轮传输***********************
拥塞避免:拥塞窗口cwnd=16,慢启动门限ssthresh=16
检测到网络正常,将窗口线性增加!
已经传输3100B,还剩6900B

***********************第5轮传输***********************
拥塞避免:拥塞窗口cwnd=17,慢启动门限ssthresh=16
检测到网络正常,将窗口线性增加!
已经传输4800B,还剩5200B

***********************第6轮传输***********************
拥塞避免:拥塞窗口cwnd=18,慢启动门限ssthresh=16
检测到网络正常,将窗口线性增加!
已经传输6600B,还剩3400B

***********************第7轮传输***********************
拥塞避免:拥塞窗口cwnd=19,慢启动门限ssthresh=16
检测到网络正常,将窗口线性增加!
已经传输8500B,还剩1500B

***********************第8轮传输***********************
拥塞避免:拥塞窗口cwnd=20,慢启动门限ssthresh=16
重传计时器超时,回退慢启动!门限置当前窗口减半,窗口置1!
已经传输8500B,还剩1500B

***********************第9轮传输***********************
慢启动:拥塞窗口cwnd=1,慢启动门限ssthresh=10
检测到网络正常,将窗口加倍!
已经传输8600B,还剩1400B

***********************第10轮传输***********************
慢启动:拥塞窗口cwnd=2,慢启动门限ssthresh=10
检测到网络正常,将窗口加倍!
已经传输8800B,还剩1200B

***********************第11轮传输***********************
慢启动:拥塞窗口cwnd=4,慢启动门限ssthresh=10
检测到网络正常,将窗口加倍!
已经传输9200B,还剩800B

***********************第12轮传输***********************
慢启动:拥塞窗口cwnd=8,慢启动门限ssthresh=10
检测到网络正常,将窗口加倍!
传输完毕!
请按任意键继续. . .










运行结果2:
输入本次传送数据量的大小(单位字节B):40000
*********************************开始传输**********************************

***********************第0轮传输***********************
慢启动:拥塞窗口cwnd=1,慢启动门限ssthresh=16
检测到网络正常,将窗口加倍!
已经传输100B,还剩39900B

***********************第1轮传输***********************
慢启动:拥塞窗口cwnd=2,慢启动门限ssthresh=16
检测到网络正常,将窗口加倍!
已经传输300B,还剩39700B

***********************第2轮传输***********************
慢启动:拥塞窗口cwnd=4,慢启动门限ssthresh=16
检测到网络正常,将窗口加倍!
已经传输700B,还剩39300B

***********************第3轮传输***********************
慢启动:拥塞窗口cwnd=8,慢启动门限ssthresh=16
检测到网络正常,将窗口加倍!
已经传输1500B,还剩38500B

***********************第4轮传输***********************
拥塞避免:拥塞窗口cwnd=16,慢启动门限ssthresh=16
重传计时器超时,回退慢启动!门限置当前窗口减半,窗口置1!
已经传输1500B,还剩38500B

***********************第5轮传输***********************
慢启动:拥塞窗口cwnd=1,慢启动门限ssthresh=8
检测到网络正常,将窗口加倍!
已经传输1600B,还剩38400B

***********************第6轮传输***********************
慢启动:拥塞窗口cwnd=2,慢启动门限ssthresh=8
收到3个重复ACK,采取快恢复策略!门限置当前窗口减半,窗口置新门限!
已经传输1800B,还剩38200B

***********************第7轮传输***********************
拥塞避免:拥塞窗口cwnd=1,慢启动门限ssthresh=1
检测到网络正常,将窗口线性增加!
已经传输1900B,还剩38100B

***********************第8轮传输***********************
拥塞避免:拥塞窗口cwnd=2,慢启动门限ssthresh=1
检测到网络正常,将窗口线性增加!
已经传输2100B,还剩37900B

***********************第9轮传输***********************
拥塞避免:拥塞窗口cwnd=3,慢启动门限ssthresh=1
检测到网络正常,将窗口线性增加!
已经传输2400B,还剩37600B

***********************第10轮传输***********************
拥塞避免:拥塞窗口cwnd=4,慢启动门限ssthresh=1
收到3个重复ACK,采取快恢复策略!门限置当前窗口减半,窗口置新门限!
已经传输2800B,还剩37200B

***********************第11轮传输***********************
拥塞避免:拥塞窗口cwnd=2,慢启动门限ssthresh=2
检测到网络正常,将窗口线性增加!
已经传输3000B,还剩37000B

***********************第12轮传输***********************
拥塞避免:拥塞窗口cwnd=3,慢启动门限ssthresh=2
检测到网络正常,将窗口线性增加!
已经传输3300B,还剩36700B

***********************第13轮传输***********************
拥塞避免:拥塞窗口cwnd=4,慢启动门限ssthresh=2
检测到网络正常,将窗口线性增加!
已经传输3700B,还剩36300B

***********************第14轮传输***********************
拥塞避免:拥塞窗口cwnd=5,慢启动门限ssthresh=2
检测到网络正常,将窗口线性增加!
已经传输4200B,还剩35800B

***********************第15轮传输***********************
拥塞避免:拥塞窗口cwnd=6,慢启动门限ssthresh=2
检测到网络正常,将窗口线性增加!
已经传输4800B,还剩35200B

***********************第16轮传输***********************
拥塞避免:拥塞窗口cwnd=7,慢启动门限ssthresh=2
检测到网络正常,将窗口线性增加!
已经传输5500B,还剩34500B

***********************第17轮传输***********************
拥塞避免:拥塞窗口cwnd=8,慢启动门限ssthresh=2
检测到网络正常,将窗口线性增加!
已经传输6300B,还剩33700B

***********************第18轮传输***********************
拥塞避免:拥塞窗口cwnd=9,慢启动门限ssthresh=2
检测到网络正常,将窗口线性增加!
已经传输7200B,还剩32800B

***********************第19轮传输***********************
拥塞避免:拥塞窗口cwnd=10,慢启动门限ssthresh=2
检测到网络正常,将窗口线性增加!
已经传输8200B,还剩31800B

***********************第20轮传输***********************
拥塞避免:拥塞窗口cwnd=11,慢启动门限ssthresh=2
检测到网络正常,将窗口线性增加!
已经传输9300B,还剩30700B

***********************第21轮传输***********************
拥塞避免:拥塞窗口cwnd=12,慢启动门限ssthresh=2
收到3个重复ACK,采取快恢复策略!门限置当前窗口减半,窗口置新门限!
已经传输10500B,还剩29500B

***********************第22轮传输***********************
拥塞避免:拥塞窗口cwnd=6,慢启动门限ssthresh=6
检测到网络正常,将窗口线性增加!
已经传输11100B,还剩28900B

***********************第23轮传输***********************
拥塞避免:拥塞窗口cwnd=7,慢启动门限ssthresh=6
检测到网络正常,将窗口线性增加!
已经传输11800B,还剩28200B

***********************第24轮传输***********************
拥塞避免:拥塞窗口cwnd=8,慢启动门限ssthresh=6
重传计时器超时,回退慢启动!门限置当前窗口减半,窗口置1!
已经传输11800B,还剩28200B

***********************第25轮传输***********************
慢启动:拥塞窗口cwnd=1,慢启动门限ssthresh=4
检测到网络正常,将窗口加倍!
已经传输11900B,还剩28100B

***********************第26轮传输***********************
慢启动:拥塞窗口cwnd=2,慢启动门限ssthresh=4
检测到网络正常,将窗口加倍!
已经传输12100B,还剩27900B

***********************第27轮传输***********************
拥塞避免:拥塞窗口cwnd=4,慢启动门限ssthresh=4
检测到网络正常,将窗口线性增加!
已经传输12500B,还剩27500B

***********************第28轮传输***********************
拥塞避免:拥塞窗口cwnd=5,慢启动门限ssthresh=4
检测到网络正常,将窗口线性增加!
已经传输13000B,还剩27000B

***********************第29轮传输***********************
拥塞避免:拥塞窗口cwnd=6,慢启动门限ssthresh=4
检测到网络正常,将窗口线性增加!
已经传输13600B,还剩26400B

***********************第30轮传输***********************
拥塞避免:拥塞窗口cwnd=7,慢启动门限ssthresh=4
重传计时器超时,回退慢启动!门限置当前窗口减半,窗口置1!
已经传输13600B,还剩26400B

***********************第31轮传输***********************
慢启动:拥塞窗口cwnd=1,慢启动门限ssthresh=3
检测到网络正常,将窗口加倍!
已经传输13700B,还剩26300B

***********************第32轮传输***********************
慢启动:拥塞窗口cwnd=2,慢启动门限ssthresh=3
检测到网络正常,将窗口加倍!
已经传输13900B,还剩26100B

***********************第33轮传输***********************
拥塞避免:拥塞窗口cwnd=4,慢启动门限ssthresh=3
检测到网络正常,将窗口线性增加!
已经传输14300B,还剩25700B

***********************第34轮传输***********************
拥塞避免:拥塞窗口cwnd=5,慢启动门限ssthresh=3
重传计时器超时,回退慢启动!门限置当前窗口减半,窗口置1!
已经传输14300B,还剩25700B

***********************第35轮传输***********************
慢启动:拥塞窗口cwnd=1,慢启动门限ssthresh=2
检测到网络正常,将窗口加倍!
已经传输14400B,还剩25600B

***********************第36轮传输***********************
慢启动:拥塞窗口cwnd=2,慢启动门限ssthresh=2
检测到网络正常,将窗口加倍!
已经传输14600B,还剩25400B

***********************第37轮传输***********************
拥塞避免:拥塞窗口cwnd=4,慢启动门限ssthresh=2
检测到网络正常,将窗口线性增加!
已经传输15000B,还剩25000B

***********************第38轮传输***********************
拥塞避免:拥塞窗口cwnd=5,慢启动门限ssthresh=2
检测到网络正常,将窗口线性增加!
已经传输15500B,还剩24500B

***********************第39轮传输***********************
拥塞避免:拥塞窗口cwnd=6,慢启动门限ssthresh=2
检测到网络正常,将窗口线性增加!
已经传输16100B,还剩23900B

***********************第40轮传输***********************
拥塞避免:拥塞窗口cwnd=7,慢启动门限ssthresh=2
检测到网络正常,将窗口线性增加!
已经传输16800B,还剩23200B

***********************第41轮传输***********************
拥塞避免:拥塞窗口cwnd=8,慢启动门限ssthresh=2
检测到网络正常,将窗口线性增加!
已经传输17600B,还剩22400B

***********************第42轮传输***********************
拥塞避免:拥塞窗口cwnd=9,慢启动门限ssthresh=2
检测到网络正常,将窗口线性增加!
已经传输18500B,还剩21500B

***********************第43轮传输***********************
拥塞避免:拥塞窗口cwnd=10,慢启动门限ssthresh=2
检测到网络正常,将窗口线性增加!
已经传输19500B,还剩20500B

***********************第44轮传输***********************
拥塞避免:拥塞窗口cwnd=11,慢启动门限ssthresh=2
检测到网络正常,将窗口线性增加!
已经传输20600B,还剩19400B

***********************第45轮传输***********************
拥塞避免:拥塞窗口cwnd=12,慢启动门限ssthresh=2
检测到网络正常,将窗口线性增加!
已经传输21800B,还剩18200B

***********************第46轮传输***********************
拥塞避免:拥塞窗口cwnd=13,慢启动门限ssthresh=2
检测到网络正常,将窗口线性增加!
已经传输23100B,还剩16900B

***********************第47轮传输***********************
拥塞避免:拥塞窗口cwnd=14,慢启动门限ssthresh=2
检测到网络正常,将窗口线性增加!
已经传输24500B,还剩15500B

***********************第48轮传输***********************
拥塞避免:拥塞窗口cwnd=15,慢启动门限ssthresh=2
检测到网络正常,将窗口线性增加!
已经传输26000B,还剩14000B

***********************第49轮传输***********************
拥塞避免:拥塞窗口cwnd=16,慢启动门限ssthresh=2
重传计时器超时,回退慢启动!门限置当前窗口减半,窗口置1!
已经传输26000B,还剩14000B

***********************第50轮传输***********************
慢启动:拥塞窗口cwnd=1,慢启动门限ssthresh=8
检测到网络正常,将窗口加倍!
已经传输26100B,还剩13900B

***********************第51轮传输***********************
慢启动:拥塞窗口cwnd=2,慢启动门限ssthresh=8
检测到网络正常,将窗口加倍!
已经传输26300B,还剩13700B

***********************第52轮传输***********************
慢启动:拥塞窗口cwnd=4,慢启动门限ssthresh=8
检测到网络正常,将窗口加倍!
已经传输26700B,还剩13300B

***********************第53轮传输***********************
拥塞避免:拥塞窗口cwnd=8,慢启动门限ssthresh=8
检测到网络正常,将窗口线性增加!
已经传输27500B,还剩12500B

***********************第54轮传输***********************
拥塞避免:拥塞窗口cwnd=9,慢启动门限ssthresh=8
重传计时器超时,回退慢启动!门限置当前窗口减半,窗口置1!
已经传输27500B,还剩12500B

***********************第55轮传输***********************
慢启动:拥塞窗口cwnd=1,慢启动门限ssthresh=4
检测到网络正常,将窗口加倍!
已经传输27600B,还剩12400B

***********************第56轮传输***********************
慢启动:拥塞窗口cwnd=2,慢启动门限ssthresh=4
检测到网络正常,将窗口加倍!
已经传输27800B,还剩12200B

***********************第57轮传输***********************
慢启动:拥塞窗口cwnd=4,慢启动门限ssthresh=4
检测到网络正常,将窗口加倍!
已经传输28200B,还剩11800B

***********************第58轮传输***********************
拥塞避免:拥塞窗口cwnd=8,慢启动门限ssthresh=4
收到3个重复ACK,采取快恢复策略!门限置当前窗口减半,窗口置新门限!
已经传输29000B,还剩11000B

***********************第59轮传输***********************
拥塞避免:拥塞窗口cwnd=4,慢启动门限ssthresh=4
重传计时器超时,回退慢启动!门限置当前窗口减半,窗口置1!
已经传输29000B,还剩11000B

***********************第60轮传输***********************
慢启动:拥塞窗口cwnd=1,慢启动门限ssthresh=2
检测到网络正常,将窗口加倍!
已经传输29100B,还剩10900B

***********************第61轮传输***********************
拥塞避免:拥塞窗口cwnd=2,慢启动门限ssthresh=2
重传计时器超时,回退慢启动!门限置当前窗口减半,窗口置1!
已经传输29100B,还剩10900B

***********************第62轮传输***********************
拥塞避免:拥塞窗口cwnd=1,慢启动门限ssthresh=1
检测到网络正常,将窗口线性增加!
已经传输29200B,还剩10800B

***********************第63轮传输***********************
拥塞避免:拥塞窗口cwnd=2,慢启动门限ssthresh=1
检测到网络正常,将窗口线性增加!
已经传输29400B,还剩10600B

***********************第64轮传输***********************
拥塞避免:拥塞窗口cwnd=3,慢启动门限ssthresh=1
检测到网络正常,将窗口线性增加!
已经传输29700B,还剩10300B

***********************第65轮传输***********************
拥塞避免:拥塞窗口cwnd=4,慢启动门限ssthresh=1
检测到网络正常,将窗口线性增加!
已经传输30100B,还剩9900B

***********************第66轮传输***********************
拥塞避免:拥塞窗口cwnd=5,慢启动门限ssthresh=1
检测到网络正常,将窗口线性增加!
已经传输30600B,还剩9400B

***********************第67轮传输***********************
拥塞避免:拥塞窗口cwnd=6,慢启动门限ssthresh=1
检测到网络正常,将窗口线性增加!
已经传输31200B,还剩8800B

***********************第68轮传输***********************
拥塞避免:拥塞窗口cwnd=7,慢启动门限ssthresh=1
检测到网络正常,将窗口线性增加!
已经传输31900B,还剩8100B

***********************第69轮传输***********************
拥塞避免:拥塞窗口cwnd=8,慢启动门限ssthresh=1
检测到网络正常,将窗口线性增加!
已经传输32700B,还剩7300B

***********************第70轮传输***********************
拥塞避免:拥塞窗口cwnd=9,慢启动门限ssthresh=1
检测到网络正常,将窗口线性增加!
已经传输33600B,还剩6400B

***********************第71轮传输***********************
拥塞避免:拥塞窗口cwnd=10,慢启动门限ssthresh=1
收到3个重复ACK,采取快恢复策略!门限置当前窗口减半,窗口置新门限!
已经传输34600B,还剩5400B

***********************第72轮传输***********************
拥塞避免:拥塞窗口cwnd=5,慢启动门限ssthresh=5
检测到网络正常,将窗口线性增加!
已经传输35100B,还剩4900B

***********************第73轮传输***********************
拥塞避免:拥塞窗口cwnd=6,慢启动门限ssthresh=5
重传计时器超时,回退慢启动!门限置当前窗口减半,窗口置1!
已经传输35100B,还剩4900B

***********************第74轮传输***********************
慢启动:拥塞窗口cwnd=1,慢启动门限ssthresh=3
检测到网络正常,将窗口加倍!
已经传输35200B,还剩4800B

***********************第75轮传输***********************
慢启动:拥塞窗口cwnd=2,慢启动门限ssthresh=3
检测到网络正常,将窗口加倍!
已经传输35400B,还剩4600B

***********************第76轮传输***********************
拥塞避免:拥塞窗口cwnd=4,慢启动门限ssthresh=3
检测到网络正常,将窗口线性增加!
已经传输35800B,还剩4200B

***********************第77轮传输***********************
拥塞避免:拥塞窗口cwnd=5,慢启动门限ssthresh=3
检测到网络正常,将窗口线性增加!
已经传输36300B,还剩3700B

***********************第78轮传输***********************
拥塞避免:拥塞窗口cwnd=6,慢启动门限ssthresh=3
检测到网络正常,将窗口线性增加!
已经传输36900B,还剩3100B

***********************第79轮传输***********************
拥塞避免:拥塞窗口cwnd=7,慢启动门限ssthresh=3
收到3个重复ACK,采取快恢复策略!门限置当前窗口减半,窗口置新门限!
已经传输37600B,还剩2400B

***********************第80轮传输***********************
拥塞避免:拥塞窗口cwnd=3,慢启动门限ssthresh=3
检测到网络正常,将窗口线性增加!
已经传输37950B,还剩2050B

***********************第81轮传输***********************
拥塞避免:拥塞窗口cwnd=4,慢启动门限ssthresh=3
检测到网络正常,将窗口线性增加!
已经传输38400B,还剩1600B

***********************第82轮传输***********************
拥塞避免:拥塞窗口cwnd=5,慢启动门限ssthresh=3
检测到网络正常,将窗口线性增加!
已经传输38950B,还剩1050B

***********************第83轮传输***********************
拥塞避免:拥塞窗口cwnd=6,慢启动门限ssthresh=3
检测到网络正常,将窗口线性增加!
已经传输39600B,还剩400B

***********************第84轮传输***********************
拥塞避免:拥塞窗口cwnd=7,慢启动门限ssthresh=3
检测到网络正常,将窗口线性增加!
传输完毕!

最后

以上就是强健美女为你收集整理的TCP拥塞控制算法实现(c++)的全部内容,希望文章能够帮你解决TCP拥塞控制算法实现(c++)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部