近年来,随着计算机和网络通信技术的迅速发展,研究人员不断开发新的网络协议、算法和应用,以适应日益增长的网络通信需要。因此,网络仿真日益成为分析、研究、设计和改善网络性能的强大工具,它通过在计算机上建立一个虚拟的网络平台,来实现真实的网络环境的仿真。网络技术研究人员在仿真环境中不仅能对网络通信、网络设备、协议以及网络应用进行设计研究,还能对网络的性能进行分析和评估。目的是在网络项目实施的过程前期和实施过程中提供指导。
相对于其它的网络模拟软件而言,NS3是比较年轻的网络工具。NS3避免了一些其它网络模拟软件的缺点,尽量吸收其他模拟软件的优点。NS3是应用现代软件工程技术和网络仿真技术而设计开发的新一代网络模拟工具。
本文介绍了在Fedora20环境下,安装NS3.20模拟软件的具体方法,并在此基础上开发了一套无线自组网的仿真程序,对从事这方面的科研人员及教学人员具有一定的指导作用。
1 Fedora20及NS3.20环境的安装
1.1 Fedora20的下载与环境安装
首先在WINDOWS下安装虚拟机VMware8.0版本,然后到网站http://fedoraproject.org/get-fedora下面免费下载镜像Fedora-20-i386-DVD.iso,在虚拟机VMware8.0中安装此镜像,将fedora系统安装好。
NS3内核是是使用C++语言开发的,并提供Python接口,因此,安装NS3之前需要安装许多安装包,安装软件包一定要将自己的系统与外网连接,有些依赖软件包系统直接从外网下载并安装。使用下列命令安装软件包:
yum install gcc gcc-c++ python python-devel
yum install mercurial
yum install bzr
yum install gsl gsl-devel
yum install gtk2 gtk2-devel
yum install gdb valgrind
yum install doxygen graphviz ImageMagick
yum install python-sphinx dia texlive texlive-latex
yum install flex bison
yum install tcpdump
yum install sqlite sqlite-devel
yum install libxml2 libxml2-devel
yum install uncrustify
yum install openmpi openmpi-devel
yum install boost-devel
yum install graphviz graphviz-devel python-setuptools-devel python-kiwi pygoocanvas
easy_install pygraphviz
yum install cmake glibc-devel.i686 glibc-devel.x86_64
在运行命令yum install graphviz graphviz-devel python-setuptools-devel python-kiwi pygoocanvas 时,系统提示有错误信息,与某些软件发生冲突;这时候,要先用下列命令删除冲突的软件:
rpm —e vim-minimal
rpm -e sudo
然后,再安装上述命令后,再完成后续命令的安装。
1.2 NS3.20网络模拟器的安装
在网站http://www.nsnam.org上免费下载软件包ns-allinone-3.20.tar.bz2,然后拷贝到虚拟机Fedora20的系统/root目录下,然后用命令:tar —jxvf ns-allinone-3.20.tar.bz2进行解压缩。解压缩完成后,用以下命令进入相关目录:
cd /root/ns-allinone-3.20/ns-3.20/
然后执行:
. /waf configure —enable-examples —enable-tests
最后执行命令:
./waf
执行完后,如果出现如图1的画面,即编译安装成功。
2 无线自组网IP地址的分配和拓扑结构设计
2.1 无线自组网的IP地址分配
我们将16个无线自组网都当成一个独立的节点,既可以充当路由器,又可以充当终端节点。它们的IP地址都位于同一个网络10.1.1.0中,如图1所示。
2.2 无线自组网拓扑结构图
无线自组网节点作为一个独立的无线节点,可以再空间中自由移动,同时,在一范围内可进行互相通信。其拓扑结构如图2所示。
无线自组网络可以互相之间通信,每个节点既充当路由器,又充当终端。我们假定节点n0与节点n15通信,来模拟数据在无线自组网中的通信过程。
3 用NS3仿真无线自组网
3.1 用NS3创建16个独立的无线节点
我们首先创建16个无线节点,并配置无线节点通信所需要的参数。最主要的代码如下:
NodeContainer wifiAdhocNodes;
wifiAdhocNodes.Create (16); //创建16无线自组网节点
WifiHelper wifi = WifiHelper::Default ();
NqosWifiMacHelper wifiMac = NqosWifiMacHelper::Default (); //配置Mac与Phy
wifiMac.SetType ("ns3::AdhocWifiMac");
YansWifiPhyHelper wifiPhy = YansWifiPhyHelper::Default ();
YansWifiChannelHelper wifiChannel = YansWifiChannelHelper::Default (); //创建无线节点互连通道
wifiPhy.SetChannel (wifiChannel.Create ());
NetDeviceContainer wifiAdhocDevices = wifi.Install (wifiPhy, wifiMac, wifiAdhocNodes); //创建节点的无线设备(无线网卡)
InternetStackHelper stack; //安装协议栈
stack.Install (wifiAdhocNodes);
Ipv4AddressHelper address; //设置无线节点的IP地址
address.SetBase ("10.1.1.0", "255.255.255.0");
Ipv4InterfaceContainer AdhocInterfaces;
AdhocInterfaces = address.Assign (wifiAdhocDevices);
3.2 应用层模拟
1) 服务端节点设置
16个节点创建并配置完后,我们在最后一个节点n15放置echo服务端程序,其主要代码为:
UdpEchoServerHelper echoServer (9); //设置服务器端口号9
ApplicationContainer serverApps = echoServer.Install (wifiAdhocNodes.Get (15)); //服务端程序安装在节点n15。
serverApps.Start (Seconds (1.0)); //服务端程序在1秒生效
serverApps.Stop (Seconds (10.0)); //服务端程序在10秒停止。
2) 客户端节点设置
我们将回显客户端放在节点n0上,其主要代码为:
UdpEchoClientHelper echoClient (AdhocInterfaces.GetAddress (15), 9);//让客户端与服务端及其端口关
联
echoClient.SetAttribute ("MaxPackets", UintegerValue (100)); //设置通信时参数
echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.0)));
echoClient.SetAttribute ("PacketSize", UintegerValue (1024));
ApplicationContainer clientApps =
echoClient.Install (wifiAdhocNodes.Get (0)); //客户端程序安装在节点n0
clientApps.Start (Seconds (2.0));//客户端在 2秒中生效
clientApps.Stop (Seconds (10.0)); //客户端在10秒钟停止
4 用NS3仿真无线自组网运行效果
4.1 节点之间数据流向显示
在 Fedora20操作系统中,运行:
./waf —run scratch/adhoctest
则可以看出,移动节点n0与n15节点,可正常通信;显示的数据流向如图4所示,客户端与服务端之间的数据传送和应答顺利。
4.2 节点之间通信效果显示:
用Pyviz工具,可以查看节点之间互相通信的效果图,运行以下命令:
./waf —run scratch/adhoctest —vis
则可以看出,刚开始,在路由选择阶段,数据流向多个节点,如图5所示。一旦两个节点之间明确了路由,数据流向比较稳定,如图6所示。
5 结束语
本文主要仿真了无线自组网传送数据的过程。在仿真过程中,设计了无线自组网络节点,并仿真了数据传送的过程。可在此基础上,进一步研究不同算法对不同环境下的数据传送效果。希望对从事这方面的研究者有所启发。
参考文献:
[1] ns-3 documentation[EB/OL]. http://www.nsnam.org/docs/doxygen/index.html.
[2] ns-3 developers[EB/OL].http://www.nsnam.org/developers/overview.
[3] 马春光,姚建盛.ns-3网络模拟器基础与应用[M].北京:人民邮电出版社,2014.