NS 802.11函数分析(一)
recv函数有两个作用,不仅是接收其他节点发送的包,而且当节点接收到其他包的时候也会调用recv()
首先给出NS2中recv的源码,和一些注释:
void
Mac802_11::recv(Packet *p, Handler *h)
{
struct hdr_cmn *hdr = HDR_CMN(p);
/*
* Sanity Check
*/
assert(initialized()); /*
* Handle outgoing packets.
*/
if(hdr->direction() == hdr_cmn::DOWN) {//向下传输,也就是节点要向外发送,故调用recv()
send(p, h);
return;
}
/*
* Handle incoming packets.
*
* We just received the 1st bit of a packet on the network
* interface.
*
*/ /*
* If the interface is currently in transmit mode, then
* it probably won't even see this packet. However, the
* "air" around me is BUSY so I need to let the packet
* proceed. Just set the error flag in the common header
* to that the packet gets thrown away.
*/
if(tx_active_ && hdr->error() == ) {//如果当前正在发送的话则标记为错误,这个数据包会在后面的函数中被处理掉
hdr->error() = ;
} if(rx_state_ == MAC_IDLE) {//如果当前空闲则设置为接收态
setRxState(MAC_RECV);
pktRx_ = p;
/*
* Schedule the reception of this packet, in
* txtime seconds.
*/
if (mhProbe_.busy() && OnMinChannelTime) {
Recv_Busy_ = ; // Receiver busy indication for Probe Timer
} mhRecv_.start(txtime(p));
} else {
/*
* If the power of the incoming packet is smaller than the
* power of the packet currently being received by at least
* the capture threshold, then we ignore the new packet.
*/
if(pktRx_->txinfo_.RxPr / p->txinfo_.RxPr >= p->txinfo_.CPThresh) {//有冲突发生时,如果新到的包功率比较小,信噪比在阀值以下的时候调用capture函数,主要作用是
capture(p);
} else {//冲突比较大的时候需要调用冲突函数
collision(p);
}
}
总结一下recv函数的工作流程主要是以下一些阶段:
1、判断这个包是要发出去的还是收到的,发出去的直接调用send函数就行;
2、判断MAC的状态,如果是发送态就直接将这个包标记为错误(这个错误会在后面处理),如果是空闲状态,则这个时候可以正常接收数据包,将MAC状态转换成MAC_RECV状态然后保存定时器(定时器的作用是NS2模拟发包过程,当定时器为零才发送完成)
3、如果MAC不是空闲,我们正在接收其他的包,那么我们需要判断这时新到的包是否会影响到原来正在接收的,也就是计算信噪比与阀值比较,当在阀值以下的时候我们忽略这个包(调用capture),否则产生冲突。
但是这两个函数也不是十分简单的。首先看capture:
void
Mac802_11::capture(Packet *p)
{
/*
* Update the NAV so that this does not screw
* up carrier sense.
*/
set_nav(usec(phymib_.getEIFS() + txtime(p)));
Packet::free(p);
}
这段代码的作用是当新到达的包不会对原来的接收造成影响的时候,将这个包作为一个多余的信息丢掉,即free。但是还有一个设置NAV的值为EIFS+这个数据包传输时间,关于这一点我的理解是:假设这个节点顺利完成了当前的接收任务,如果说干扰包的发送还是没有完成的话,必然会再次收到它的信号,但是这个信号必然是无效的,所以直接设置NAV可以避开这个问题。
再看collision:
void
Mac802_11::collision(Packet *p)
{
switch(rx_state_) {
case MAC_RECV:
setRxState(MAC_COLL);
/* fall through */
case MAC_COLL:
assert(pktRx_);
assert(mhRecv_.busy());
/*
* Since a collision has occurred, figure out
* which packet that caused the collision will
* "last" the longest. Make this packet,
* pktRx_ and reset the Recv Timer if necessary.
*/
if(txtime(p) > mhRecv_.expire()) {
mhRecv_.stop();
discard(pktRx_, DROP_MAC_COLLISION);
pktRx_ = p;
mhRecv_.start(txtime(pktRx_));
}
else {
discard(p, DROP_MAC_COLLISION);
}
break;
default:
assert();
}
}
这一段代码主要是完成冲突的处理:
1、判断如果是正常接收状态,到这应该应经是冲突发生了,所以我们要改变MAC的状态。
2、在冲突状态下,他这采取了选择接收结束时间按比较晚的那个包(但是这个包最终也会因为冲突发生被丢弃),至于原因感觉跟上面差不多既然冲突发生了,即使后来可以接收到一部分正确的包,但是意义也不大,所以直接用接收一个时间较长的把这段跳过去。
这就是recv的大概过程了,牵涉的其他细节由于暂时没有用到就没有深究了。我理解不对的地方欢迎指正。
NS 802.11函数分析(一)的更多相关文章
- Ubuntu下用wireshark抓取802.11封包并进行过滤分析
要用wireshark抓802.11的包 需要在linux下进行. 要在linux下抓802.11的包 需要在linux下安装无线网卡驱动. 所以 在正式抓取之前先把这两样东西搞起来. *没有特殊说明 ...
- Linux-0.11内核源代码分析系列:内存管理get_free_page()函数分析
Linux-0.11内存管理模块是源码中比較难以理解的部分,如今把笔者个人的理解发表 先发Linux-0.11内核内存管理get_free_page()函数分析 有时间再写其它函数或者文件的:) /* ...
- IEEE 802.11 无限局域网
(1)无线通讯的两个重要特征 ——Hidden node problem 双方虽然听不到对方的讯号,但同时传送给相同的对象导致了碰撞(这个时候双方都不知道发生了碰撞) ——Exposed node p ...
- 802.11协议帧格式、Wi-Fi连接交互过程、无线破解入门研究
相关学习资料 Linux黑客大曝光: 第8章 无线网络 无线网络安全攻防实战进阶 无线网络安全 黑客大曝光 第2版 http://zh.wikipedia.org/wiki/IEEE_802.11 h ...
- string函数分析
string函数分析string函数包含在string.c文件中,经常被C文件使用.1. strcpy函数原型: char* strcpy(char* str1,char* str2);函数功能: 把 ...
- start_amboot()函数分析
一.整体流程 start_amboot()函数是执行完start.S汇编文件后第一个C语言函数,完成的功能自然还是初始化的工作 . 1.全局变量指针r8设定,以及全局变量区清零 2.执行一些类初始化函 ...
- 802.11(wifi)的MAC层功能
MAC层是802.11的主要功能部分.上层应用通过调用MAC层提供的接口原语调用MAC层的功能. MAC一共向上提供了2大类接口原语,共30种.数据(1)和管理(29).数据部分就是提供普通数据包的收 ...
- TCP/IP协议栈与数据报封装 (802.3 Ethernet 以太网 802.11 WLAN 无线网 )
http://blog.csdn.net/jnu_simba/article/details/8957242 一.ISO/OSI参考模型 OSI(open system interconnection ...
- WiFi(802.11)基础
参考: 1. Wireshark数据包分析实战(第2版) 2. wifi技术从了解到熟悉1----概念.802.11协议简述及四种主要物理组件.wifi适配层.wap_supplicant和wap_c ...
随机推荐
- ubuntu安装LAMP环境
1. LAMP 的安装 sudo apt-get install apache2 mysql-server mysql-client php5 php5-gd php5-mysql 由于LAMP大部分 ...
- ORM框架Entity Framework
博客园在推广ORM方面的确做了很大的贡献,很多的程序员开始使用ORM,不用写SQL的喜悦让他们激动不已,可是好景不长,他们很快发现众多的烦恼一个接一个的出现了. 很遗憾,我并不打算在这篇文章中解决这些 ...
- adb 服务端口2037被占,导致adb和appium无法工作
症状1: 命令行运行 adb 相关命令,提示如下: adb server is out of date. killing...ADB server didn't ACK* failed to star ...
- C++构造函数初始化顺序
[本文链接] http://www.cnblogs.com/hellogiser/p/constructor-order.html 1.构造函数.析构函数与拷贝构造函数介绍 构造函数 构造函数不能有返 ...
- iOS coredata 级联删除
应用场景如下,每个用户可以设定多个提醒,当删除一个用户时,应当把相关的提醒都删除,而删除一个提醒时,应当把提醒从用户信息中删除. 那么 Profile 应该建立一个如下图的relationship 而 ...
- 19. javacript高级程序设计-E4X
1. E4X E4X是对ECMAScript的一个扩展, l 与DOM不同,E4X只用一个类型节点来表示XML中的各个节点 l XML对象中封装了对所有节点都有用的数据和行为.为了表示多个节点的集合, ...
- 关于TxQBService报的错,腾讯你真牛B啊
腾讯你真牛B啊,浏览器都7了,还特么的报这么低级的错误,还每10秒写一条windows日志,让人有什么心情用你的浏览器,滚.
- java wait()和notify()、notifyAll()
图见<JAVA并发编程的艺术>P98-101 这三个方法都是java.lang.Object的方法,用于协调多个线程对共享数据的存取,必须在synchronized语句块中使用!这三个方法 ...
- winrt 页面进入动画
private async void DoAnimistion(){Storyboard storyboard = new Storyboard(); using (IEnumerator<De ...
- DB2 SQLCODE 大全
DB2错误信息sqlcode sqlstate 说明 000 00000 SQL语句成功完成 01xxx SQL语句成功完成,但是有警告 +012 01545 未限定的列名被解释为一个有相互关系的引用 ...