NS 802.11函数分析(一)

 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/294656.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android之怎么隐藏EditText光标和自动显示键盘

不废话,先爆照 让EditText不现实光标 关键代码: android:focusable="true" android:focusableInTouchMode="true" 写这个父视图里面 下面是全部代码: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"…

0408~送给小伙伴的汉堡包

经过一番的结对编程&#xff0c;同学院们对Ta有什么想法呢&#xff1f; 用汉堡包的方式评价一下自己的合作伙伴。 开始囉~~~~~~~~ 第一片面包&#xff1a;解决问题的能力还是蛮强的&#xff0c;在编程的过程中精力集中&#xff0c;遇到不懂的问题积极查找相关资料&#xff0c;而…

基于事件驱动架构构建微服务第14部分:查询API

原文链接&#xff1a;https://logcorner.com/building-micro-services-through-event-driven-architecture-part14-query-api/在本教程中&#xff0c;我将展示如何构建一个查询API&#xff0c;使用命令查询职责分离(CQRS)模式在微服务架构中实现查询。读取模型的目标是构建一个…

Win32窗体实现接受拖拽文件,检测鼠标拖拽操作,检测鼠标滚轮操作

使窗体能够接受文件拖拽 DragAcceptFiles(hwnd, TRUE);文件拖拽在win32窗体过程函数中对WM_DROPFILES消息进行处理 LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {switch (uMsg){case WM_DESTROY:PostQuitMessage(0);return 0;case WM_D…

python序列元素的编号称为_Python序列

序列是一块用于存放多个值的连续内存空间,并且按照一定顺序排列,没一个值(称为元素)都分配一个数字,称为索引或位置.通过该索引可以去除相应的值在Python中,序列结构主要有列表 元组 集合 字典和字符串,对于这些序列结构有以下几个通用的操作.其中,集合和字典不支持索引 切片 相…

​“北斗女神”徐颖,32岁成为中科院最年轻的博导!

全世界只有3.14 % 的人关注了爆炸吧知识来源&#xff1a;学术志被誉为“北斗女神”的徐颖研究员在32岁就成为了中科院最年轻的博士生导师&#xff0c;真是羡煞旁人。一分耕耘一分收获&#xff0c;我们要向为国家做出巨大贡献的科学家学习。徐颖、颜值、气质、才华、幽默集于一身…

通过jQuery源码学习javascript(三)

序承接上两篇继续写下去。我尽量把我明白的地方给大家说清楚。有些大家的提问我也有点搞不明白&#xff0c;如果有人能解答&#xff0c;再好不过了。疑问第一篇中有位博友提出了以下的问题&#xff0c;我也不太明白&#xff0c;如果有明白的&#xff0c;能否告知一、二。var st…

mysql复习

mysql复习 一:复习前的准备 1:确认你已安装wamp 2:确认你已安装ecshop,并且ecshop的数据库名为shop二 基础知识: 1.数据库的连接 mysql -u -p -h -u 用户名 -p 密码 -h host主机2:库级知识 2.1 显示数据库: show databases; 2.2 选择数据库: use dbname; 2.3 创建数据库: creat…

链表之单链表的反转总结

单链表的反转是常见的面试题目。本文总结了2种方法。 1 定义 单链表node的数据结构定义如下&#xff1a; class ListNode {int val;ListNode next;ListNode(int x) {val x;next null;} }2 方法1&#xff1a;就地反转法 2.1 思路 把当前链表的下一个节点pCur插入到头结点dummy…

封神!Win11内置杀软被评为免费最佳

微软 Windows Defender 预装在 Windows 10 和 Windows 11 操作系统上。根据最新报告显示&#xff1a;Windows Defender 是 2021 年最好的防病毒软件&#xff08;杀毒软件&#xff09;之一。近日&#xff0c;位于德国的 IT 安全研究机构 AV-TEST 发布了针对 Windows 10 操作系统…

剑指OFFER的跳台阶问题

一只青蛙一次可以跳上1级台阶&#xff0c;也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 &#xff08;斐波那契数列的变形&#xff09; F(1)1;F(2)2; F(n)F(n-1)F(n-2); class Solution { public:int jumpFloor(int number) {if(number<0) return 0;if(numbe…

Mysql修改字段名和长度_mysql中修改表字段名/字段长度/字段类型详解

先来看看常用的方法MySql的简单语法&#xff0c;常用&#xff0c;却不容易记住。当然&#xff0c;这些Sql语法在各数据库中基本通用。下面列出&#xff1a;1.增加一个字段&#xff1a;alter table user add COLUMN new1 VARCHAR(20) DEFAULT NULL; //增加一个字段&#xff0c;默…

redis协议

为什么80%的码农都做不了架构师&#xff1f;>>> 利用gdb调试redis-server 在客户端redsi-cli&#xff0c;输入 gdb在下面函数处打入断点&#xff1a; 执行read函数后&#xff0c;查看buf中的内容&#xff0c;如下&#xff1a; 可见&#xff0c;客户端发送的指令&am…

佛门重地,不适合搞这种事!!

1 快教教我&#xff01;▼2 佛门重地&#xff0c;不适合搞这种事&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 来自中国的圣诞老人&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 有被内涵到&#xff0c;谢谢▼5 江山代有才人出&#xff08;素材来…

Git之如何解决sourceTree已经pull全部下来但是本地没有更新的问题

今天用sourceTree好奇怪&#xff0c;我pull下来了同事的代码&#xff0c;但是本地项目没有&#xff0c;如下图 日志上面是显示已提交了同事的代码。 然后下面是本地的UserDao.java文件 死活也找不到 解决方法&#xff1a; 我先是从git 上面clone一份代码下来&#xff0c; 发现这…

WPF关键帧动画

动画与关键帧的区别本章介绍关键帧动画之前, 首先需要讲解一下关于WPF当中基础动画与本章所讲的关键帧动画的区别。视频地址: WPF扩展合集_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili普通动画WPF基础动画当中, 我们熟悉的From/To/By驱动的动画, 主要在两个值之间创建过渡效果, 如下图…

ESD

ESD模型和测试标准&#xff1a; http://wenku.baidu.com/view/fa5e70d96f1aff00bed51e4b.html 三种ESD模型及其防护设计&#xff1a; http://wenku.baidu.com/view/487dcbbd960590c69ec37655.html 静电放电防护设计导则 http://wenku.baidu.com/link?url4DCV0D0v6iX0GC8jfrqGO…

Mac怎么不能拷贝文件到U盘

2019独角兽企业重金招聘Python工程师标准>>> 在日常生活中&#xff0c;我们常常需要把一些文件拷贝的U盘保存。但是一些使用MAC的用户&#xff0c;有时会遇到无法拷贝的情况。今天我们就来给大家介绍介绍MAC怎么不能拷贝文件到U盘&#xff0c;以及面对这种情况我们应…

最漂亮的女生

转载于:https://blog.51cto.com/6254695/1071754

dockerfile文件名_Linux云计算教程全套视频合集:Dockerfile详解(一)

我们可以把刚才的对容器的所有操作命令都记录到一个文件里&#xff0c;就像写更脚本程序。之后用 docker build 命令以此文件为基础制作一个镜像&#xff0c;并会自动提交到本地仓库。这样的话镜像的构建会变的透明化&#xff0c;对镜像的维护起来也更加简单&#xff0c;只修改…