一.相关内容介绍:
“隐藏节点”(hidden terminal)和“暴露节点”(exposed terminal)是无线网络冲突避免中的经典问题。本实验用NS2网络模拟器对隐藏节点问题进行测试和分析。
隐藏结点问题
1.隐藏节点
隐藏节点指处于接收节点的覆盖范围内而在发送节点的覆盖范围外的节点。由于监听不到发送节点的数据传输,隐藏节点不受限制的发送分组到相同的接收节点,导致分组在接收节点处冲突。隐藏节点可以分为隐发送节点和隐接收节点。
节点 A 和 C 同时想发送数据给中间节点 B,但 A 和 C 都不在彼此传输范围内。所以当 A 发送数据给 B 时, C 并未检测到 A 正在传输数据,会认为目前网络中无数据传输,会将数据传输给 B。即 A 和 C 同时将数据传输给 B,使得数据在 B处产生冲突,导致数据不可用。这种因传送距离而发生误判的问题称为隐藏节点问题。
2.解决方案
采用“请求发送”(Request to Send,RTS)和“清楚发送”(Clear to Send,CTS)机制进行信道预约,减少冲突。
①发送方在发出数据前,先发送一个RTS分组,告知分组途径节点(及其传输范围内节点)整个通信过程将要占用信道的时间长度。
②若接收方空闲,则响应一个CTS分组,告知分组途径节点(及其传输范围内节点)将要占用信道的时间长度。在虚拟载波监听机制下,这些接收到RTS和(或)CTS分组的节点将获知信道忙状态,从而调整自己的操作,以降低整个网络中的冲突概率。
③发送方发送数据分组。
④接收方发送ACK分组。
二.实验步骤
解释仿真代码(Hidden_Terminal.tcl),描述仿真设置
仿真所需模块的安装过程如下:
1.获取 mUDP, mUdpSink 的模块文件,具体有下列几个文件,在百度网盘中获得,主要文件如下所示:mudp.cc mudp.h mudpsink.cc mudpsink.h
下载地址:https://pan.baidu.com/s/1-TE8xrwABEUfmDwc8gRozw
提取码:7777
2.在/ns-allinone-2.35/ns-2.35/下新建 measure 文件夹,把这四个文件放入其中:
3.修改/ns-allinone-2.35/ns-2.35/common/下的 packet.h 文件,将如下程序添加到 struct hdr_cmn{}中
int frametype_;
double sendtime_;
unsigned int pkt_id_;
unsigned int frame_pkt_id_;
在vim命令模式下,输入/struct hdr回车,可更快找到如图所示的位置
4.修改/ns-allinone-2.35/ns-2.35/下的 Makefile 文件, 将如下程序添加到文件的指定位置
注意Makefile对于语法要求很高,不能有空行或多余的空格
measure/mudp.o measure/mudpsink.o \
在vim命令模式下,输入/pbc.o回车,可更快找到如图所示的位置
注意:可能会由于权限不够而无法保存,用下述命令更改权限
sudo chattr -i Makefile
sudo chmod 777 Makefile
然后再进行此步上述操作
否则在进行到第七步时,会报以下错误:
5.修改/ns-allinone-2.35/ns-2.35/tcl/lib/下的 ns-default.tcl,将如下程序添加到文件的最后一行
Agent/mUDP set packetSize_ 1000
在vim命令模式下,输入G,可更快找到如图所示的位置
6.修改mudp.cc源代码,否则无法编译通过
修改后的代码如下:
mUdpAgent::mUdpAgent() : UdpAgent(), id_(0), openfile(0)
{
bind("packetSize_", &size_);
//UdpAgent::UdpAgent();
}
7.在/ns-allinone-2.35/ns-2.35 目录下执行以下命令,执行完成即可
sudo make clean
sudo make
三.仿真过程
在/ns-allinone-2.35/ns-2.35中新建本次实验专用文件夹,将ns2脚本Hidden_Terminal.tcl放进去,用以下命令执行即可:
ns Hidden_Terminal.tcl
仿真遇到的问题汇总:
问题1:
解决:
当某个文件没有权限时,执行如下命令授予该文件权限即可
sudo vim 文件名
sudo chmod 777 文件名
问题2:
经过上述解决方案后发现出现了问题2,引发了段错误(段错误是指程序访问了不属于自己的内存地址空间,或者向没有写权限的内存地址存储数据时产生的运行时错误)
引发原因为:问题1报错原因说不能打开相应文件,因为没有权限,我们在解决过程中使用sudo vim 文件名新建了空的相应文件,并sudo chmod 777 文件名给予它权限,但我们所建的文件为空文件,原先产生的相应文件中,文件本身可能有内容,产生该问题的本质原因是所在文件夹权限不够,无法生成我们所需要的对应文件,故我们应该采用以下方法来解决
解决:
授予当前文件夹权限
cd ..到上级目录,ll发现tmp文件夹的权限为:
cd ..
ll
故更改权限:
sudo chmod 777 tmp
更改后再次进入tmp文件夹:
cd tmp
ns hidden_terminal.tcl
四.运行结果
命令执行完会出现以下图像:
调试过后(仿真过程中的一个图像):