NS2中的802.11协议代码解析

发包数据包流程:

  1. 上层对象(如:数据队列)调用recv();
  2. recv()调用send();
  3. send()通过调用sendDATA(p)封装数据包并将p赋给pktTx_;由于在发送数据包之前需要发送RTS报文,所以send()还要通过调用sendRTS()为数据包p生成一个RTS报文,并将生成的RTS报文赋给pktRTS_。在回退定时器到期且信道空闲情况下,为防止和其它节点产生冲突,还要设置一个延迟定时器,延迟时常为DIFS+(0 ~ 拥塞窗口大小间的随机值)*每一时隙的长度。如果信道不空闲,需要启动新的回退定时器;
  4. 延迟定时器到期后会调用deferHandler(),该函数调用check_pktRTS(),在此函数里设置发送RTS报文的超时时间等于发送RTS报文的传输时延+单程传播时延+接收端从接收到发送状态的切换时延+发送CTS报文的传输时延+单程传播时延。check_pktRTS()调用transmit(pktRTS_,timeout),根据此超时值设置并启动发送超时定时器。transmit()函数还会将报文拷贝传给物理层的信道上,并启动时长为报文传输时间的接口超时定时器。
  5. 发送超时定时器到期后会调用sendHandler(),进而调用send_timer(),在该函数里有可能通过RetransmitRTS()重传RTS报文。
  6. 如果节点在发送超时定时器到期前接收到了CTS报文,表明刚刚发送的RTS报文被正确接收了,recvCTS()会删除pktRTS_,停止发送超时计时器,并调用tx_resume(),该函数会发送保存在pktTx_中的数据报文。

注:根据802.11协议,发送真正的数据包之前需要通过RTS,CTS,ACK进行双方及信道状态确认。

收包流程:

  1. 下层对象(如:网络接口:WirelessPhy)调用recv()。
  2. recv()将进来的包赋给pktRx_,设置并启动接收超时定时器,时常为报文的传输时间(报文处理时间)txtime(p)。
  3. 接收超时定时器到期后,会调用recvHandler(),进而调用recv_timer()。
  4. recv_timer()检查保存在pktRx_中接收到的包类型及子类型,并调用对应的函数。如控制报文:recvRTS(),recvCTS(),recvACK(),数据报文:recvData(),在NS2中没有对其它类型的包进行处理。
posted @ 2011-05-13 21:15  摇风清影  阅读(3255)  评论(0编辑  收藏  举报