截断二进制退避算法实现
具体内容:
- 确定基本退避时间,它就是争用期。以太网把争用期定为51.2us。对于10Mb/s以太网,在争用期内可发送512bit,即64字节。
- 从离散的整数集合[0,1,…,]中随机取出一个数,记为r。重传应推后的时间就是r倍的争用期。上面的参数k按下面的公式计算:k=Min[重传次数,10]可见当重传次数不超过10时,参数k等于重传次数;但当重传次数超过10时,k就不在增大而一直等于10。
- 当重传达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;
}
知识点:
- 头文件:<windows.h> 是当你要使用与窗口相关的函数的时候, 如messagebox( ), FindWindow( ), SendMessage( ) 等等,例如本次中的sleep()函数 ;<time.h> 是C标准函数库中一种获取时间与日期、对时间与日期数据操作以及格式化的头文件;<math.h> 头文件中声明了常用的一些数学运算,比如乘方,开方运算等等
- srand((int)time(0)) srand函数是初始化随机数的种子,为接下来的rand函数调用做准备。time(0)函数返回某一特定时间的小数值。这条语句的意思就是初始化随机数种子,time函数是为了提高随机的质量(也就是减少重复)而使用的。
- 获取随机数的函数为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