算法概述:

二进制指数类型退避算法 (truncated binary exponential type)(CSMA/CA检测到冲突,中止后随机重发使用的算法)
发生碰撞的站在停止发送数据后,要推迟(退避)一个随机时间才能再发送数据。

  • 确定基本退避时间,一般是取为争用期 2τ。
  • 定义重传次数k, k <= 10,即:k = Min[重传次数, 10]
  • 从整数集合[0,1,…, (2^k -1)]中随机地取出一个数,记为 r。重传所需的时延就是 r 倍的基本退避时间。
  • 当重传达 16 次仍不能成功时即丢弃该帧,并向高层报告(信道拥塞严重)。

算法实现:

#include<iostream>
#include<time.h>
#include<windows.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]之间的随机数 m<n
int Rand(int m,int n){return m+rand()%(n-m+1);
}//模拟重传
void Retransmission(){sumK++;k++;//重传次数+1 也即是碰撞次数+1cout<<"\n第"<<sumK<<"次发生碰撞"<<endl;k=min(10,sumK);cout<<"重传次数k="<<k<<endl;cout<<"从整数集合[0,"<<((2<<k-1)-1)<<"]中随机地取出一个数"<<endl;r=Rand(0,(2<<k-1)-1);cout<<"本次r="<<r<<endl;cout<<"重传所需的时延"<<r<<"*51.2us="<<51.2*r<<"us"<<endl;Sleep(51.2*r/1000);cout<<"开始重传.....\n";Sleep(500);//还是让它停半秒 模拟传输时延  也好观察输出结果
}int main(){srand((int)time(0));//设置随机数种子cout<<"截断二进制指数退避模拟";cout<<"请输入碰撞概率:";while(cin>>p){//可接受多次输入模拟 ctrl+z结束k=sumK=0;//初始化重传次数cout<<"碰撞概率已设置为"<<p<<"%"<<endl;cout<<"开始传送.....\n";Sleep(500);//停半秒while(true){if(Rand(1,100)<=p){//1~100之间的随机数 若小于p则设定为发生了碰撞(碰撞概率就是%p了)if(sumK==16){cout<<"\n重传次数达到16次仍然未成功!丢弃该帧,向高层报告!"<<endl;break;}Retransmission();}else{//未发生碰撞cout<<"\n第"<<sumK+1<<"次未发生碰撞,传送成功!"<<endl;break;}}cout<<"请输入碰撞概率:(结束按ctrl+z)";}return 0;
}

运行结果截图:

运行结果文本:

截断二进制指数退避模拟请输入碰撞概率:95
碰撞概率已设置为95%
开始传送.....第1次发生碰撞
重传次数k=1
从整数集合[0,1]中随机地取出一个数
本次r=0
重传所需的时延0*51.2us=0us
开始重传.....第2次发生碰撞
重传次数k=2
从整数集合[0,3]中随机地取出一个数
本次r=3
重传所需的时延3*51.2us=153.6us
开始重传.....第3次发生碰撞
重传次数k=3
从整数集合[0,7]中随机地取出一个数
本次r=7
重传所需的时延7*51.2us=358.4us
开始重传.....第4次发生碰撞
重传次数k=4
从整数集合[0,15]中随机地取出一个数
本次r=15
重传所需的时延15*51.2us=768us
开始重传.....第5次发生碰撞
重传次数k=5
从整数集合[0,31]中随机地取出一个数
本次r=3
重传所需的时延3*51.2us=153.6us
开始重传.....第6次发生碰撞
重传次数k=6
从整数集合[0,63]中随机地取出一个数
本次r=40
重传所需的时延40*51.2us=2048us
开始重传.....第7次发生碰撞
重传次数k=7
从整数集合[0,127]中随机地取出一个数
本次r=68
重传所需的时延68*51.2us=3481.6us
开始重传.....第8次发生碰撞
重传次数k=8
从整数集合[0,255]中随机地取出一个数
本次r=64
重传所需的时延64*51.2us=3276.8us
开始重传.....第9次发生碰撞
重传次数k=9
从整数集合[0,511]中随机地取出一个数
本次r=271
重传所需的时延271*51.2us=13875.2us
开始重传.....第10次发生碰撞
重传次数k=10
从整数集合[0,1023]中随机地取出一个数
本次r=101
重传所需的时延101*51.2us=5171.2us
开始重传.....第11次发生碰撞
重传次数k=10
从整数集合[0,1023]中随机地取出一个数
本次r=75
重传所需的时延75*51.2us=3840us
开始重传.....第12次发生碰撞
重传次数k=10
从整数集合[0,1023]中随机地取出一个数
本次r=782
重传所需的时延782*51.2us=40038.4us
开始重传.....第13次发生碰撞
重传次数k=10
从整数集合[0,1023]中随机地取出一个数
本次r=850
重传所需的时延850*51.2us=43520us
开始重传.....第14次发生碰撞
重传次数k=10
从整数集合[0,1023]中随机地取出一个数
本次r=787
重传所需的时延787*51.2us=40294.4us
开始重传.....第15次发生碰撞
重传次数k=10
从整数集合[0,1023]中随机地取出一个数
本次r=858
重传所需的时延858*51.2us=43929.6us
开始重传.....第16次发生碰撞
重传次数k=10
从整数集合[0,1023]中随机地取出一个数
本次r=752
重传所需的时延752*51.2us=38502.4us
开始重传.....重传次数达到16次仍然未成功!丢弃该帧,向高层报告!
请输入碰撞概率:(结束按ctrl+z)

截断二进制指数退避算法c++实现相关推荐

  1. 【计算机网络】数据链路层 : CSMA/CD 协议 ( 载波监听多点接入 / 碰撞检测 协议 | 单程端到端传播时延 | 截断二进制指数规避算法 | 计算示例 | 最小帧长问题 )★

    文章目录 一. CSMA/CD 协议 二. 传播时延对于 载波监听 的影响 三. 单程端到端传播时延 相关概念 四. 碰撞后重传时机 ( 截断二进制指数规避算法 ) 五.截断二进制指数规避算法 计算示 ...

  2. 【学习笔记】数据链路层——随机访问介质访问控制(ALOHA、CSMA、CSMA/CD、CSMA/CA),截断二进制指数规避算法

    文章目录 小前言 一. ALOHA协议 纯ALOHA协议 时隙ALOHA协议 ALOHA对比 CSMA协议 定义与分类 ① 1-坚持CSMA ② 非坚持CSMA ③ p-坚持CSMA 总结 CSMA/ ...

  3. Exponetial BackOff(指数退避算法)

    一:介绍 指数退避算法的定义和使用可以在网上搜搜.提供一下wiki的介绍部分定义:an algorithm that uses feedback to multiplicatively decreas ...

  4. python udp socket解决服务端响应时间长的指数退避算法

    UDP连接是一个不可靠的连接,也就是说,UDP通信过程中可能出现数据包丢失的情况,或者是服务端宕机后,客户端不知道服务端状态,仍然不停的访问服务端的情况.针对这一情况,UDP客户端必须选择一个等待时间 ...

  5. 通过Akka学习指数退避(Exponential Backoff)

    原文连接:https://mincong.io/cn/exponential-backoff-in-akka/ 前言 在软件开发中,我们免不了要跟各种错误异常打交道.比如说,当一个服务在调用另一个服务 ...

  6. flume之退避算法backoff algorithm

    flume之退避算法backoff algorithm 什么是退避算法: In a single channel contention based medium access control (MAC ...

  7. [Android Traffic] 调整定时更新的频率(C2DM与退避算法)

    转载自: http://blog.csdn.net/kesenhoo/article/details/7395253 Minimizing the Effect of Regular Updates[ ...

  8. flume backoff 退避算法

    原文链接: https://qiuqiang1985.iteye.com/blog/1513049 发生冲突时,每个节点等待一定的时间后重新发送,二进制退避算法中,等待时间以以2位底的指数级增长,失败 ...

  9. 时间序列挖掘-预测算法-三次指数平滑法(Holt-Winters)——三次指数平滑算法可以很好的保存时间序列数据的趋势和季节性信息...

    from:http://www.cnblogs.com/kemaswill/archive/2013/04/01/2993583.html 在时间序列中,我们需要基于该时间序列当前已有的数据来预测其在 ...

最新文章

  1. 【Win 10 应用开发】将墨迹保存到图像的两种方法
  2. LeetCode 454 4Sum II(哈希法)
  3. ITK:基于零交叉的边缘检测器
  4. Redis 实战之主从复制、高可用、分布式
  5. Java怎么去最高分最低分,深入java虚拟机:原子操作ParkEvent和Parker
  6. Android Studio Flutter 调试技巧 Flutter Inspector 提升你的维护开发效率 轻松定位复杂嵌套Widget代码位置
  7. NUC1013 阶乘结果末尾有多少零【分析思维】
  8. active set method(激活集方法)
  9. 杭电计算机2013年硕士研究生复试详解
  10. 救急的戴尔Latitude 10商用平板电脑
  11. Mac上制作Linux U盘启动盘
  12. 学习整理软测(八)-----数据库命令与操作
  13. 2.4.U-Boot配置和编译过程详解-U-Boot和系统移植第4部分视频课程笔记
  14. 看完之后终于明白了,要用5G网络必须要换成5G手机吗?
  15. 【计算机网络】时延、发送时延、传输时延、处理时延、排队时延、时延带宽积
  16. 推荐系统遇上深度学习(三十六)--Learning and Transferring IDs Representation in E-commerce...
  17. 运行日志Log文件c++实现
  18. 我们正处在大数据时代,浅谈大数据
  19. 老夫整理的1000行MySQL学习笔记传授有缘人
  20. KubeSphere 社区双周报 | 2022-08-19

热门文章

  1. java看片_java – 如何正确查看片段
  2. Pycharm一键选中多个东西(数据、函数等)进行修改、删除、替换等
  3. python arp_Python中的Scapy初探之三-ARP中毒
  4. 路由巧设置 局域网轻松限制BT下载
  5. 计算机的cpu不能用,CPU故障该怎么确定?解决办法?
  6. richfaces 经典记录
  7. linux下如何避免rsyslog系统日志不停打印到console
  8. Go字符串拼接方式深入比较
  9. Codeforces 484A - Bits (贪心)
  10. 有了java基础,迅速学完Python并做了一份笔记-全套Python,建议收藏