昨天遗留的问题,之所以出现浮点数错误是因为从node中获取到的信息:node->CX_,node->CY_,node->CZ_为0,而传进来的p1是通过vbh获得的,而奇怪的是这些都为零。

这些数据说明了,节点位置未正确设置。
(1)脚本设置不成功,正常情况下讲,节点位置是在u脚本中设置的。
(2)在中途修改了,昨天修改了node和god。

替换node.cc、node.h、god.cc、god.h等文件就好了,说明昨天修改底层修改坏了哈,最好不能手贱乱改了。

泊松分布随机丢包,如果在node4丢包的话,那么后边肯定会接收不到了
更加奇怪的现象是:直接ns 1_aloha.tcl和调试的情况下,差别很大。

还有个问题一直未解决:
(1)一旦丢包不回复ACK时貌似并未重传。
实验中的确doBackoff了,但是并未发生重传,甚至没进入processPassive函数内。
目前所有检测到的doBackoff实质是主动的backoff,而非因为没等到的backoff,ack超时的处理函数是:
UWALOHA_WaitACKTimer::expire(Event *e)
发送数据是在processPassive做的,但是因为状态原因,UWALOHA_Status == PASSIVE,而未能进入到sendDataPkt(),换言之并没有重发。
(2)解决UWALOHA_Status == PASSIVE

弄清楚什么条件会重发,并重现重发的原理,搞懂算法:

一、RecvProcess
区分接收到的包是ACK还是DATA包,分别处理,如果是DATA包则交给上层处理。
(1)如果是包类型是ACK,自身是该包的DA,且UWALOHA_Status为Wait_ACK,进行如下操作:
WaitACKTimer.cancel(),收到ACK就不在继续等待
bo_counter=0,已经回退的次数重置为0
free(PktQ_.front()),PktQ_.pop(),释放队列首包
UWALOHA_Status = PASSIVE
processPassive()
(2)如果来的是数据包
如果recver是自身或者recver是Mac_Broadcast,则进行以下步骤:
cmh->size() -= hdr_UWALOHA.size(),从cmh的size减去hdr_uwaloha.size();
sendUp(pkt->copy()),向上发送交由vbf来处理;
如果ACKon(启用ACK机制),并且recver不为Mac_Broadcast,则回复ACK,否则调用processPassive()
释放Pkt。

二、replyACK
nsaddr_t Data_Sender = hdr_UWALOHA::access(pkt)->SA,提取发送该包的源节点;
sendPkt(makeACK(Data_Sender)),制作ACK包并且发送之,和普通包的发送过程是一样的;
bo_counter = 0,回退次数重置为0。

三、processPassive:处理被动的状态
如果UWALOHA_Status为Passive并且blocked为false,并且PktQ_.empty()不为空,则发送数据。这种Passive的状态意味着什么?blocked为Passive有意味着什么?

四、StatusProcess(bool is_ack),mac层状态处理函数
UnderwaterSensorNode* n=(UnderwaterSensorNode*) node_,这里node_在underwatermac.h中定义,原型为node_,将其强制转化为UnderwaterSensorNode;
if(blocked==true),阻塞在这,等待ACK
    blocked = fasle,解阻塞
    processPassive,处理被动
if(ackon == false)
    Uwaloha_status = passive
    processPassive
else if(ACKon ==1 && is_ack==false),sendPkt会修改is_ack的值
    Uwaloha_status = WAIT_ACK

五、TxProcess,发送包
cmh = HDR_CMN(pkt)
uwalohah = hdr_UWALOHA::access(pkt)
cmh->size() += hdr_UWALOHA::size(),为公共包头加上uwaloha的size
cmh->txtime() = getTxTime(cmh->size()),传输时间
cmh->error() = 0,错误率
cmh->direction() = hdr_cmn::DOWN,设置向下传输
UWALOHAh->SA = index_
UWALOHAh->packet_type = DATA
UWALOHAh->DA = cmh->next_hop,uwalohah的DA为公共头的下一跳
PktQ_.push(pkt),将pkt压到队列中,mac对象根据此队列判断包是否已经发完
if(UWALOHA_status == PASSIVE && PktQ_.size()==1 && !blocked),当mac状态为Passive且PktQ_长度为1,blocked为false才会sendDataPkt。

六、sendDataPkt,发送数据包
首先产生随机数P,修改UWALOHA_Status为Send_Data,比较p和Persistent值,小则发送当前PktQ_.front()包,大则bo_counter--(不是回退次数么,怎么会减1呢?),然后回退(这里并不对PktQ_做任何操作)。

七、sendPkt,真正的发送数据包
cmh,UWALOHAh包,
uwsn *node = (uwsn*) node_;强转
txtime = cmh->txtime();在TxProcess中设置了cmh->txtime()值,这里取出来
根据节点当前的传输状态(并非UWALOHA_status),来处理
case sleep:    poweron()
case idle:
设置节点传输状态为SEND
cmh->timestamp() = NOW
cmh->direction() = DOWN
如果是数据包:
    如果DA不是MAC_bcst,且 ACKon==1
        将UWALOHA_Status = WAIT_ACK
        重新调度WaitACKTimer,将expire时间设置为WaitACKTimer + txtime(传输时间)
    否则
        free掉当前包
        从队列PktQ_.pop()弹出
        Uwaloha_Status设置为Passive(passive应该是可以进行下一次传输吧?)
    status_handler.is_ack() = false(貌似又不是等待ACK的意思,这个is_ack有什么作用)
否则
    status_handler.is_ack() = true    
sendDown();由底层的phy层来处理了
blocked = true(阻塞为true有什么作用)
s.schedule(&status_handler,&status_event,txtime+0.01),这里调度status_handler将在txtime+0.01的事件响应status_event事件
break
case RECV:
    当前正在接收,而却要腾出空来发送数据包,会造成冲突(话说没有缓冲机制么?)
    如果是ACK的话
        采取retryACK的手段
    否则
        free掉pkt
    Uwaloha_Status设置为Passive
    break
default(SEND状态):
    send too fast
    如果是ACK
        retryACK(pkt)
    否则
        free(pkt)
    Uwaloha_Status设置为Passive

八、retryACK,重发ACK,但是应用场景是在sendPkt中节点传输状态为RECV或者SEND,并且接收到的包为ACK,既然无法处理包为啥还要retryACK呢?
Uwaloha_ACK_RetryTimer * timer = new UWALOHA_ACK_RetryTimer(this,ack),如果是ACK的话就必须要发送,创建一个定时器
timer->resched(MAXACKRetryInterval*Random::uniform()),随机设置一个定时时间
RetryTimerMap_[timer->id()] = timer,将timer加到RetryTimerMap中去,按id索引,应该是个hash表,有必要加到这个表吗?

这里不得不提Uwaloha_ACK_RetryTimer了,当它到点时调用

九、UWALOHA_ACK_RetryTimer::expire
mac_->processRetryTimer(this);

十、processRetryTimer(UWALOHA_ACK_RetryTimer* timer)函数
Packet* pkt = timer->pkt(),在sendPkt中无法立即发送包则延迟发送,有retryACK(pkt)
从RetryTimerMap_找到该timer,通过timer->id,如果count不为0,则erase之,如果没找到就算了,最后delete timer,然后重新发送pkt(此时pkt是ACK):
sendPkt(pkt)

十一、 UWALOHA_WaitACKTimer::expire(Event *e)
    printf("Time out: waitACK\n");
    mac_->doBackoff();    
所定义变量,WaitACKTimer在sendPkt中有用到,发送完数据包后会调度WaitACKTimer在WaitACKTime + txtime时间后到点调用该函数,但是在此时间之前的时间内都是有可能接收到ACK包的,因此还在RecvProcess()中有用到,当接收到的数据包为ACK类型时,WaitACKTimer.cacel会被调用,于是该定时器被提前终结。换言之如果该定时器一直挺到expire说明一直没来ACK,因此要backoff一个随机时间继续等待。

十二、doBackoff()函数
如果要doBackoff(),那显然状态不能为Passive,而应该为Backoff
计算随机backoff的时间
bo_counter++,backoff数加1,我记得这个数在某个地方是要被置零的(RecvProcess接收到ACK包取消timer时重置,replyACK时置零,此时刚回复了ACK)
如果bo_counter小于MaximumCounter
    修改UWALOHA_Status = BACKOFF
    BackoffTimer.resched(BackoffTime);
否则
    重置bo_counter为0
    按理说backoff是为了重发,事实上在sendDataPkt中从PktQ_中取出front项,但是并不pop,就是为了重发,事实上只有在接收到ACK之后,WaitACKTimer.cancel后,才将其pop掉,还没重发就pop掉显得很不合理阿(这里需要测试)。

这块的确是有问题哈,程序会通过多种渠道进入到sendDataPkt中,主要包括:
(1)sendDataPkt()策略调用doBackoff(),如果还没有达到最大回退数,调用BackoffTimer继续等待;
(2)uwaloha_waitacktimer::expire调用doBackoff调用processPassive调用sendDataPkt调用doBackoff
BackoffTimer和WaitACKTimer两者的基本作用搞清楚了,但是CallBack_handler和status_handler还没有,继续。

十三、CallBack_handler
在TxProcess中用到了,    Scheduler::instance().schedule(&CallBack_handler, &callback_event, CALLBACK_DELAY);

十四、status_handler
在sendPkt中用到,
如果发送的包是DATA
    status_handler.is_ack() = false
否则
    status_handler.is_ack() = true
然后
s.schedule(&status_handler,&status_event,txtime+0.01);

至今,对于schedule是啥意思还是不太清楚,研究下吧:

仿真器是时间驱动的,4种,linked-list,heap,calendar queue,"real-time",调度器通过选择next earliest event,执行直到完成,返回执行下一个事件等完成。调度器用的时间单位是second,单线程,给定时间只能执行一个线程,同一时间多个事件执行,根据first scheduled-first dispatched原则,所有计划的调度对于相同的输入应该给出相同的输出。

整合UWALOHA和VBF相关推荐

  1. Spring Boot整合Spring Data JPA操作数据

    一. Sping Data JPA 简介 Spring Data JPA 是 Spring 基于 ORM 框架.JPA 规范的基础上封装的一套 JPA 应用框架,底层使用了 Hibernate 的 J ...

  2. ssh(Struts+spring+Hibernate)三大框架整合-简述

    ssh(Struts+spring+Hibernate)三大框架配合使用来开发项目,是目前javaee最流行的开发方式,必须掌握: 注意: 为了稳健起见,每加入一个框架,我们就需要测试一下,必须通过才 ...

  3. struts2 与 sping 整合 控制器中 service注入的问题

    以个人见解认为struts1 与spring整合的时候按照习惯,我们会把 action 控制器直接配置到sping中去: eg : 这里以使用元注解方式实现Service注入进行讲解: 控制器关键代码 ...

  4. Strutsw2与Spring整合流程-简述

    1.      新建WEB工程: 2.      导入struts2开发包,和资源配置文件 ① globalMessages.properties ② struts.properties 3.     ...

  5. 【牛腩新闻发布系统】整合前台04

    前言: 后台,前台完成后,整合界面会变得非常简单 整理前台的问题总结: 1. 数据绑定 2. html语言问题 3. 莫名错误,重试解决 4. 整合收缩页 5. 整合新闻内容页 6. 整个前台页面出错 ...

  6. SSM框架整合(Spring+SpringMVC+MyBatis)

    输出结果 1.Maven Web项目创建 之前有写过Eclipse+Maven创建web项目的帖子,如果需要,请参考这里写链接内容 创建好项目之后因为入下图: 2.SSM整合 2.1 引入需要的JAR ...

  7. SpringBoot整合Shiro安全框架完整实现

    目录 一.环境搭建 1. 导入shiro-spring依赖 2. 编写首页及其controller 3. 编写shiro配置类 二.Shiro实现登录拦截 1. 编写页面及其controller 2. ...

  8. SpringBoot整合MyBatis详细教程~

    目录 1. 导入依赖 2. 连接数据库 3. 编写数据库配置信息 4. 编写pojo实体类 5. 编写mapper接口 6. 编写mapper.xml 7. 编写controller 8. 测试 1. ...

  9. SpringBoot整合JDBC、整合Druid数据源详解教程

    目录 一.整合JDBC 1. 环境准备 1. 创建数据库 2. 创建SpringBoot项目 3. IDEA连接数据库 2. 编写数据库配置信息 3. 编写测试类测试 4. CRUD操作数据库 1. ...

  10. SSM框架整合教程(2020最新版)

    目录 一.搭建数据库环境 二.基本环境搭建 1.创建maven项目,添加web支持 2.导入依赖 3.建立项目基本结构 三.MyBatis层编写 1.编写数据库配置文件 2.IDEA关联数据库 3.编 ...

最新文章

  1. Oracle 11g R2 常见问题处理
  2. urllib2 python3错误?用from urllib import request来代替!
  3. [XSY4170] 妹子(线段树上二分)
  4. iis7.5 php伪静态,Windows Server 2008 下WordPress IIS7.5伪静态规则设置(最新)
  5. Yum (yellow dog update manager)
  6. VGA接口一根针折了
  7. Longest Valid Parentheses leetcode java
  8. border-radius导致overflow:auto 或者 overflow:hidden失效,溢出问题解决方法
  9. rtl8812au linux驱动下载,Ubuntu 16.04 安装 rtl8812au系列 (DWA-182) wireless adapter driver
  10. 高通联手商汤科技共推终端人工智能
  11. 近世代数课后习题作业 1
  12. 计算机常用的采样频率,采样频率
  13. sendip linux发包工具
  14. 安全视角下的CAN协议分析
  15. android rtsp传输,android-ndk – 使用FFMpeg在Android客户端上进行RTSP流式传输
  16. oracle可恢复的等待,【案例】Oracle RAC恢复报错RMAN-06004 RMAN-20003解决办法笔记
  17. 《科尼龙作曲家》——简单易用又功能丰富的五线谱编辑和作曲软件
  18. 获取元素的 CSS 样式
  19. 2019秋-走的太久忘记了为什么出发
  20. jsp免费虚拟空间 jhost邀请码

热门文章

  1. android 字体设置为中等粗细
  2. 高效建站(华为云服务器建站IIS篇)
  3. word文档分栏怎么设置
  4. 晨光文具去年赚5亿,连2000元都拿来理财
  5. 如何发布个人网站(入门全套,小白专用,Linux服务器)
  6. Burp Suite代理和火狐浏览器的设置(超详细)
  7. 利用tp5中的图像处理功能完成海报的图片合成
  8. 深度学习大神都推荐入门必须读完
  9. 怎么用html5动画效果,教你如何在网页上用H5实现动画效果
  10. 练习绕口令快速提高语言表达能力(收藏)