截断二进制退避算法实现

截断二进制退避算法实现

具体内容:

  1. 确定基本退避时间,它就是争用期。以太网把争用期定为51.2us。对于10Mb/s以太网,在争用期内可发送512bit,即64字节。
  2. 从离散的整数集合[0,1,…,]中随机取出一个数,记为r。重传应推后的时间就是r倍的争用期。上面的参数k按下面的公式计算:k=Min[重传次数,10]可见当重传次数不超过10时,参数k等于重传次数;但当重传次数超过10时,k就不在增大而一直等于10。
  3. 当重传达16次仍不能成功时(这表明同时打算发送的数据站太多,以致连续发生冲突),则丢弃该,并向高层报告。

具体代码:

#include<iostream>
#include<time.h>
#include<windows.h>
#include <math.h>
using namespace std;
 
const int Basic_Back_Off_Time=51.2;  //基本退避时间 51.2us (模拟10M比特网)
int p;//碰撞概率(自己输入确定)
int k;//重传次数
int r;//重传时延51.2*r
int sumK;//重传总次数
 
//产生[m,n]之间的随机数 
int Rand(int m,int n){
	return m+rand()%(n-m+1);
}
 
//模拟重传
void Retransmission(){
	sumK++;
	k++;//重传次数+1 也即是碰撞次数+1
	printf("\n第%d次发生碰撞\n",sumK);
	k=min(10,sumK);
	printf("重传次数k=%d\n",k);
	printf("从整数集合[0,%d]中随机地取出一个数\n",int(pow(2,k)-1));
	r=Rand(0,pow(2,k)-1);//取出随机数r 
	printf("本次r=%d\n",r);
	printf("重传所需的时延为%d*51.2us=%fus\n",r,51.2*r);
	Sleep(51.2*r/1000);
	printf("开始重传.....\n");
	Sleep(500);//还是让它停半秒 模拟传输时延
}
 
int main(){
	srand((int)time(0));//设置随机数种子srand((int)time(0))表示以当前时间对应的int值为随机序列起点,
	//这样每次运行程序,由于起点不同才可以得到不同的随机数
	printf("截断二进制指数退避模拟\n");
	printf("请输入碰撞概率:");
    int flag=1;
	while(flag){//可接受多次输入模拟 输入0结束
	    scanf("%d",&p);
	if(p>0){
		k=sumK=0;//初始化重传次数
		printf("碰撞概率已设置为%d\n",p);
		printf("开始传送.....\n");
		Sleep(500);//停半秒
		while(true){
			if(Rand(1,100)<=p){//1~100之间的随机数 若小于p则设定为发生了碰撞
				if(sumK==16){
					printf("重传次数达到16次仍然未成功!丢弃该帧,向高层报告!\n");
					break;
				}
				Retransmission();
			}else{//未发生碰撞
			    printf("\n第%d次未发生碰撞,传送成功!\n",sumK+1);
				break;
			}
		}
		printf("请输入碰撞概率(输入0结束):");
    } 
	else{
	  	flag=0;
	  	printf("已结束测试!\n");
	  } 
	}
	return 0;
}

知识点:

  1. 头文件:<windows.h> 是当你要使用与窗口相关的函数的时候, 如messagebox( ), FindWindow( ), SendMessage( ) 等等,例如本次中的sleep()函数 ;<time.h> 是C标准函数库中一种获取时间与日期、对时间与日期数据操作以及格式化的头文件;<math.h> 头文件中声明了常用的一些数学运算,比如乘方,开方运算等等
  2. srand((int)time(0)) srand函数是初始化随机数的种子,为接下来的rand函数调用做准备。time(0)函数返回某一特定时间的小数值。这条语句的意思就是初始化随机数种子,time函数是为了提高随机的质量(也就是减少重复)而使用的。
  3. 获取随机数的函数为rand(), 可以获得一个非负整数的随机数。要调用rand需要引用头文件stdlib.h。
    要让随机数限定在一个范围,可以采用模除加加法的方式。
    要产生随机数r, 其范围为 m<=r<=n,可以使用如下公式:
    rand()%(n-m+1)+m

    其原理为,对于任意数,
    0<=rand()%(n-m+1)<=n-m
    于是
    0+m<=rand()%(n-m+1)+m<=n-m+m

    m<=rand()%(n-m+1)+m<=n
  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hello&&world

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值