ns2无线局域网隐藏节点仿真实验

ns2无线局域网隐藏节点仿真实验

实验内容

无线网络与移动技术第二次实验,用ns2完成无线局域网隐藏节点仿真实验。

实验原理

隐藏节点指在接收节点的覆盖范围内而在发送节点的覆盖范围外的节点。 由于听不到 发送节点的发送,隐藏节点可能向相同的接收节点发送分组,导致分组在接收节点处冲突。 隐藏节点可以分为隐发送节点和隐接收节点。 如教材第 80 页的图 3.17 所示,节点 A 和 C 同时想发送数据给节点 B,但 A 和 C 都不在对方的传送范围内。所以当 A 发送数据给 B 时,C 并未检测到 A 也在发送数据, 会认为目前网络中无数据传送,会将数据发送给 B。这样, A 和 C 同时将数据发送给 B, 使得数据在 B 处产生冲突,最终导致发送的数据不可用。这种因传送距离而发生误判的问 题称为隐藏节点问题。 为了解决隐藏节点问题,可以使用请求发送(Request to Send,RTS)和清除发送(Clear to Send, CTS)的控制信息来避免冲突。当发送方发出数据前,先送出一个 RTS 包,告知在 传送范围内的所有节点不要有任何发送操作。如果接收方目前空闲,则响应一个 CTS 包, 告诉发送方可开始发送数据,此 CTS 包也会告知所有在接收方信号传输范围内的其它节点 不要进行任何传输操作。

实验过程

相关模块安装

1.下载 mUDP, mUdpSink 的模块文件,具体有下列几个文件主要文件; mudp.cc mudp.h mudpsink.cc mudpsink.h

下载ns2脚本:Hidden_Terminal.tcl

资源链接:https://pan.baidu.com/s/1whtWkV7MW097hBLkPP7XkQ?pwd=8888

提取码:8888

2.在/ns-allinone-2.35/ns-2.35/下新建 measure 文件夹,把mUDP, mUdpSink 模块中的四个文件放入其中

3.修改/ns-allinone-2.35/ns-2.35/common/下的 packet.h 文件,将下面代码添加到对应位置中

· 复制代码
int frametype_;
double sendtime_;
unsigned int pkt_id_;
unsigned int frame_pkt_id_;

4.修改/ns-allinone-2.35/ns-2.35/下的 Makefile 文件, 将以下代码添加到文件中的指定位置

· 复制代码
measure/mudp.o measure/mudpsink.o \

5.修改/ns-allinone-2.35/ns-2.35/tcl/lib/下的 ns-default.tcl,将以下代码添加到文件的最后 一行

· 复制代码
Agent/mUDP set packetSize_ 1000

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

这里sudo make命令过程中可能会遇到一些问题,见问题总结

仿真模块

在/ns-allinone-2.35/ns-2.35中新建文件夹tmp,再新建本次实验专用文件夹,将ns2脚本Hidden_Terminal.tcl放进去,用以下命令执行即可:

· 复制代码
ns Hidden_Terminal.tcl

执行过程中可能会遇到问题,见问题总结

命令执行完会出现以下图像

调试过后(仿真过程中的一个图像):

问题总结

问题一

sudo make命令执行过程中出现以下问题:

这里是由于定义了两个函数名hash,此时只需要将./mdart/mdart_function.h中第230的hash改个名,在将mdart/mdart_adp.cc中第108行和第396行中的hash改成前面改后的函数名即可(文件和要改的行数在报错处标记出了)

问题二

make过程中还有可能会遇到这种问题

· 复制代码
In file included from common/tkAppInit.cc:57:0:
./bitmap/play.xbm:5:74: error: narrowing conversion of '252' from 'int' to 'char' inside

我将其总结为一类问题:

· 复制代码
common/tkAppInit.cc:57:0
error: narrowing conversion of '252' from 'a' to 'b' inside

在当前文件common/tkAppInit.cc的第57行

在将数据类型a转化成数据类型b时出了问题,此时我们可以将该处涉及到的数据强制转换成b这种类型即可

本题修改示例

本次是因为数据类型转换时超出范围,所以还有一种改法是在char前面加上unsigned

问题三

执行ns Hidden_Terminal.tcl过程中可能会遇到以下问题:

这里是因为权限问题,将当前目录下的对应文件权限修改为777即可,考虑到当前目录下其他文件权限也不够,直接修改当前目录下所有文件的权限即可

· 复制代码
chmod 777 *
相关推荐
倔强的石头10610 分钟前
【Linux指南】进程通信系列(四):命名管道 FIFO —— 让陌生进程按名字见面
linux·服务器·网络
段一凡-华北理工大学22 分钟前
高炉能源系统智能化:热风炉、煤气与极致能效~系列文章03:热风炉烧炉与风温的决定因素
大数据·linux·人工智能·能源·热风炉·高炉能源优化
_小许_22 分钟前
Linux 常用命令速查:CentOS 与 Ubuntu 双线对照
linux·ubuntu·centos
码农客栈1 小时前
mt7601u移植
linux·运维·服务器
2601_949847751 小时前
io-ts 跨端三方库仓颉适配全流程
linux·运维·ubuntu
readhere11 小时前
从ZYNQ7000开发板,学会启动嵌入式Linux系统——入门学习:EBAZ4205篇目录
linux·启动·嵌入式linux·zynq7000·ebaz4205
打工仔折腾 AI13 小时前
在 Ubuntu ARM64 部署 Q1 V3.0 MuJoCo 模型:加载、单步推理与执行器响应解析
linux·运维·人工智能·python·深度学习·ubuntu·性能优化
‎ദ്ദിᵔ.˛.ᵔ₎13 小时前
关于Linux 线程局部存储的认识
linux·运维
小小de风呀15 小时前
de风——【从零开始学习Linux】(九):进程基础 —— 从冯诺依曼体系到 fork 创建进程
linux·学习