recv函数有两个作用,不仅是接收其他节点发送的包,而且当节点接收到其他包的时候也会调用recv()

首先给出NS2中recv的源码,和一些注释:

 1 void
 2 Mac802_11::recv(Packet *p, Handler *h)
 3 {
 4     struct hdr_cmn *hdr = HDR_CMN(p);
 5     /*
 6      * Sanity Check
 7      */
 8     assert(initialized());
 9
10     /*
11      *  Handle outgoing packets.
12      */
13     if(hdr->direction() == hdr_cmn::DOWN) {//向下传输,也就是节点要向外发送,故调用recv()
14                 send(p, h);
15         16                 return;
17         }
18     /*
19      *  Handle incoming packets.
20      *
21      *  We just received the 1st bit of a packet on the network
22      *  interface.
23      *
24      */
25
26     /*
27      *  If the interface is currently in transmit mode, then
28      *  it probably won't even see this packet.  However, the
29      *  "air" around me is BUSY so I need to let the packet
30      *  proceed.  Just set the error flag in the common header
31      *  to that the packet gets thrown away.
32      */
33     if(tx_active_ && hdr->error() == 0) {//如果当前正在发送的话则标记为错误,这个数据包会在后面的函数中被处理掉
34         hdr->error() = 1;
35     }
36
37     if(rx_state_ == MAC_IDLE) {//如果当前空闲则设置为接收态
38         setRxState(MAC_RECV);
39         pktRx_ = p;
40         /*
41          * Schedule the reception of this packet, in
42          * txtime seconds.
43          */
44         if (mhProbe_.busy() && OnMinChannelTime) {
45             Recv_Busy_ = 1;  // Receiver busy indication for Probe Timer
46         }
47
48    49         mhRecv_.start(txtime(p));
50     } else {
51         /*
52          *  If the power of the incoming packet is smaller than the
53          *  power of the packet currently being received by at least
54                  *  the capture threshold, then we ignore the new packet.
55          */
56         if(pktRx_->txinfo_.RxPr / p->txinfo_.RxPr >= p->txinfo_.CPThresh) {//有冲突发生时,如果新到的包功率比较小,信噪比在阀值以下的时候调用capture函数,主要作用是
57             capture(p);
58         } else {//冲突比较大的时候需要调用冲突函数
59             collision(p);
60         }
61     }

  总结一下recv函数的工作流程主要是以下一些阶段:

  1、判断这个包是要发出去的还是收到的,发出去的直接调用send函数就行;

  2、判断MAC的状态,如果是发送态就直接将这个包标记为错误(这个错误会在后面处理),如果是空闲状态,则这个时候可以正常接收数据包,将MAC状态转换成MAC_RECV状态然后保存定时器(定时器的作用是NS2模拟发包过程,当定时器为零才发送完成)

  3、如果MAC不是空闲,我们正在接收其他的包,那么我们需要判断这时新到的包是否会影响到原来正在接收的,也就是计算信噪比与阀值比较,当在阀值以下的时候我们忽略这个包(调用capture),否则产生冲突。

但是这两个函数也不是十分简单的。首先看capture:

 1 void
 2 Mac802_11::capture(Packet *p)
 3 {
 4     /*
 5      * Update the NAV so that this does not screw
 6      * up carrier sense.
 7      */
 8     set_nav(usec(phymib_.getEIFS() + txtime(p)));
 9     Packet::free(p);
10 }

   这段代码的作用是当新到达的包不会对原来的接收造成影响的时候,将这个包作为一个多余的信息丢掉,即free。但是还有一个设置NAV的值为EIFS+这个数据包传输时间,关于这一点我的理解是:假设这个节点顺利完成了当前的接收任务,如果说干扰包的发送还是没有完成的话,必然会再次收到它的信号,但是这个信号必然是无效的,所以直接设置NAV可以避开这个问题。

再看collision:

 1 void
 2 Mac802_11::collision(Packet *p)
 3 {
 4     switch(rx_state_) {
 5     case MAC_RECV:
 6         setRxState(MAC_COLL);
 7         /* fall through */
 8     case MAC_COLL:
 9         assert(pktRx_);
10         assert(mhRecv_.busy());
11         /*
12          *  Since a collision has occurred, figure out
13          *  which packet that caused the collision will
14          *  "last" the longest.  Make this packet,
15          *  pktRx_ and reset the Recv Timer if necessary.
16          */
17         if(txtime(p) > mhRecv_.expire()) {
18             mhRecv_.stop();
19             discard(pktRx_, DROP_MAC_COLLISION);
20             pktRx_ = p;
21             mhRecv_.start(txtime(pktRx_));
22         }
23         else {
24             discard(p, DROP_MAC_COLLISION);
25         }
26         break;
27     default:
28         assert(0);
29     }
30 }

这一段代码主要是完成冲突的处理:

1、判断如果是正常接收状态,到这应该应经是冲突发生了,所以我们要改变MAC的状态。

2、在冲突状态下,他这采取了选择接收结束时间按比较晚的那个包(但是这个包最终也会因为冲突发生被丢弃),至于原因感觉跟上面差不多既然冲突发生了,即使后来可以接收到一部分正确的包,但是意义也不大,所以直接用接收一个时间较长的把这段跳过去。

  这就是recv的大概过程了,牵涉的其他细节由于暂时没有用到就没有深究了。我理解不对的地方欢迎指正。

转载于:https://www.cnblogs.com/MrLJC/p/3423645.html

NS 802.11函数分析(一)相关推荐

  1. 针对WPA3认证的802.11协议分析

    i        一.对管理帧的关键参数分析 AP的认证方式,可通过802.11管理帧(Beacon帧.Probe Response帧)中的相关参数进行判断,以WPA/WPA2-Persoanl类型的 ...

  2. 802.11无线网络部署方案对比分析

    802.11无线网络部署方案对比分析 目前随着802.11无线网络的快速发展,较大规模的项目,无数AP数量将会比较多,配置.管理及维护问题将会日益突出,另外,像WiFi电话等对无线漫游.信号强度.传输 ...

  3. wireshark 802.11 WLAN无线报文分析常用技巧总结

    概述 本文介绍如何使用开源wireshark软件来分析802.11 WLAN报文. 涉及通信,网络行业的工程师对wireshark都不陌生.它可以轻易的抓取和分析以太网报文. 但是对于使用wiresh ...

  4. 无线射频专题《IEEE 802.11协议讲解2@WiFi抓包分析之MAC_Header》

    前言: IEEE 802.11是IEEE最初制定的一个无线局域网标准,主要用于解决办公室局域网和校园网中,用户与用户终端的无线接入,业务主要限于数据存取,速率最高只能达到2Mbps.由于802.11在 ...

  5. 无线知识、802.11及头帧理解分析简介

    无线知识及802.11: 能否连接到无线网,取决于芯片,如同无限的信号频道是802.11b,要是芯片不支持802.11b的话,是接收不到信号的. 无线主802.11: 802.11标准: IEEE(i ...

  6. Wi-Fi:802.11 物理层和发射机测量概述

    引言 Wi-Fi 是一种允许多台电子装置使用无线电波以无线方式交换数据或连接互联网的技术.IEEE 802.11 设备的主要优势是它们能够以更低的成本部署局域网(LANs). 本文从整体上概括介绍了每 ...

  7. 802.11 - (1)

    一.概论 1.1.简介 IEEE802家族是由一系列局域网络(Local Area Network,LAN)技术规格所组成,802.11属于其中一员. 载波检测多重访问/碰撞检测(Carrier Se ...

  8. 802.11的仿真(1)

    p { margin-bottom: 0.08in; }a:link { } 过几天,项目组老师要求对 NS做一个简单的介绍,可是到现在对 NS的研究还很肤浅,实在不知道,如何是好.手边的资料是不少, ...

  9. 802.11的物理层-CS/CCA过程

    参考文献 [1] 802.11 Wireless Networks: The Definitive Guide, Mattbew S. Gast [2] Overhaul of IEEE 802.11 ...

最新文章

  1. UVa 10051 Tower of Cubes(类似LIS)
  2. archlinux cn源
  3. case when判断大于某值_Python 代码判断逻辑太复杂?这里有几条最佳实践和技巧...
  4. 高通8x12平台开机画面制作工具
  5. 价值上亿元的IT机房,都有哪些设备?
  6. java ee io_JAVAEE细细看 进阶 14 - IO总结-Go语言中文社区
  7. win7一直显示正在启动_win7系统中提高启动速度并且禁用某些软件启动的操作小技巧...
  8. keil5 仿真usart窗口没有限制_多体仿真:DS SIMULIA Simpack 2021
  9. linux 编译java文件 执行class文件
  10. IDEA好看的主题(自用)
  11. 电子词典系统vc++_MFC 电子词典
  12. png图片怎么转换成jpg?png转jpg批量
  13. PID参数整定口诀与经验法整定PID参数
  14. 马科维兹+matlab,“马科维茨”投资组合模型实践——第三章 投资组合优化:最小方差与最大夏普比率...
  15. 电脑重装系统经验总结
  16. 一天学完SQLite数据库与其注入方式
  17. linux安装ati工具,安装ATIforlinux显卡驱动
  18. Python打印九九乘法表---左上三角、左下三角、右上三角、右下三角形格式
  19. win7电脑运行速度慢如何解决【系统天地】
  20. virsh存储池,存储卷的管理

热门文章

  1. java jdk 类加载机制_JDK源码阅读之类加载
  2. 开发工具:VSCode 摸鱼神器,确定不试一下?
  3. 收集常用电路基础公式换算
  4. 真相了!敲代码时,程序员戴耳机究竟在听什么?
  5. 推荐 9 个爱不释手的 JSON 工具
  6. 电脑技巧:这样检查电脑后终于知道为什么越用越卡
  7. 收集53个程序员励志名言
  8. python图表可视化工具_比Excel制图更强大,Python可视化工具Altair入门教程
  9. Java做一个动画效果音量调节_设计与实现一个 ISoundable 接口,该接口具有发声功能、还能调节音量大小...
  10. timed_waiting线程是否占用cpu_程序CPU占用率飙升,如何定位线程的堆栈信息?超详细,值得收藏看不懂还有配套视频 第319篇...