目标任务:模拟在两个节点间创建一个简单的点到点的连接,并且在这两个节点之间传送一个数据包。
这是一次全新的网络模拟实验,对于初学者来说,如何正确快速的完成任务呢?我们只有找到正确的指导,初学接触时,按部就班地跟着实践,之后加上自己的学习研究之后,就相当于get一项技能啦!
下面开始介绍第一次在Linux上利用NS3软件完成目标任务的详细过程。这也算是我完成之后的记录,我想肯定对初学的大家有所帮助。
1、初识NS3
ns3是一种面相对象的、基于离散事件驱动网络仿真模拟器。简单理解就是,可以实现与真实环境下网络拓扑结构的模拟通信过程,支持网络协议包括:TCP、UDP、FTP等,实现了Dijkstra、动态路由、静态路由、多播路由等路由方法。五层协议基本涵盖其中,它是网络研究人员的一种常用的工具软件。
2、安装步骤
(1)平台选择:Linux
最推荐的方法就是提前安装虚拟机VMware,安装Linux系统进行实验。
(2)下载ns-3
我所采用的成功方法是下载tar压缩包到本地进行解压,操作简单方便,速度较快。文件为:ns-allinone-3.25.tar.bz2
提取码:syjr
下载之后放到Linux主机上,后续进行解压安装。
(3)解压ns-3
在ns-3目录下打开终端,解压命令:
tar -xjf ns-allinone-3.25.tar.bz2 -C ./ns3.25
此步骤解压到文件目录ns3.25下,需要自己提前创建ns3.25目录。
这里我使用的方法是对解压后的文件,名为build.py进行编译安装。第一次编译ns3软件包常用的方法,build.py是一个python脚本,如上图解压目录中可以找到。
编译命令:
./build.py --enable-examples --enable-tests
编译如下:
这一步真正在Linux安装ns3软件,需要耐心等待,这个过程会看到大量编译输出信息。
正在编译:
编译成功输出信息:
最后输出几个模块未安装,这不影响ns3之后的运行使用。
自此,我们实现了关键步骤,环境准备完毕!可谓工欲善其事,必先利其器。
3、测试安装
(1)使用官方test.py脚本测试
我们来检验一下是否安装成功,ns3软件的开发确实是很完善、样样周全,它给我们提供了测试脚本test.py,测试发行版本的ns3是否正确编译。
这时候进入编译后的ns-3.25目录下,找到test.py脚本
执行命令:
./test.py -c core
测试结果:
看到下图,说明编译正确,ns3可以使用。
(2)运行脚本测试
再次验证ns3正确安装与否,双重保险!
测试命令:
./waf --run hello-simulator
终端显示:Hello Simulator,表明一切很成功!
还记得我们的任务是什么了吗
诶,刚刚一直很顺利的在下载编译安装测试呀,好像有点忘了,没关系,再来回顾一下:
实验任务:模拟在两个节点间创建一个简单的点到点的连接,并且在这两个节点之间传送一个数据包。
我们来实验吧!
4、实验
这是一个经典的脚本实验,仿真场景十分简单,在2个节点间创建一个简单点对点的通信,但是麻雀虽小,五脏俱全。
进入ns-3.25/examples/tutorial目录。你会发现一个叫first.cc的文件。这一个脚本实现在两个节点间创建一个简单的点到点的连接,并且在这两个节点之间传送一个数据包。
阅读脚本代码之后,自行修改了一下,模拟实现主机192.1.1.1和192.1.1.2之间互相发送并接收1024bytes的数据。
#include "ns3/core-module.h"
#include "ns3/network-module.h"
#include "ns3/internet-module.h"
#include "ns3/point-to-point-module.h"
#include "ns3/applications-module.h"
using namespace ns3;
NS_LOG_COMPONENT_DEFINE ("FirstScriptExample");
int
main (int argc, char *argv[])
{
Time::SetResolution (Time::NS);
LogComponentEnable ("UdpEchoClientApplication", LOG_LEVEL_INFO);
LogComponentEnable ("UdpEchoServerApplication", LOG_LEVEL_INFO);
/*客户端与服务器端的日志组件生效*/
NodeContainer nodes;
nodes.Create (2);/*创建2个网络节点*/
PointToPointHelper pointToPoint;/*物理连接计算机*/
pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));/*数据速率*/
pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));/*点到点信道传输延时值*/
NetDeviceContainer devices;
devices = pointToPoint.Install (nodes);/*配置设备容器*/
InternetStackHelper stack;
stack.Install (nodes);/*安装协议栈,为每个节点安装网络协议,IP层*/
Ipv4AddressHelper address;/*分配IP地址*/
address.SetBase ("192.1.1.0", "255.255.255.0");
Ipv4InterfaceContainer interfaces = address.Assign (devices);/*IP地址与设备绑定*/
UdpEchoServerHelper echoServer (9);
ApplicationContainer serverApps = echoServer.Install (nodes.Get (1));
serverApps.Start (Seconds (1.0));
serverApps.Stop (Seconds (10.0));/*通信开始与停止时间*/
UdpEchoClientHelper echoClient (interfaces.GetAddress (1), 9);
echoClient.SetAttribute ("MaxPackets", UintegerValue (1));/*最大数据分组个数*/
echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.0)));/*2个分组需等待时间*/
echoClient.SetAttribute ("PacketSize", UintegerValue (1024));/*分组数据大小*/
ApplicationContainer clientApps = echoClient.Install (nodes.Get (0));
clientApps.Start (Seconds (2.0));
clientApps.Stop (Seconds (10.0));
Simulator::Run ();/*启动模拟器*/
Simulator::Destroy ();
return 0;
}
在关键部分做出了注释方便理解。
到此,我们可以需要将复制到ns-3.25目录下的scratch文件目录下,使用waf直接编译运行文件。
命令:
./waf --run scratch/myfirst
实验结果如下:
模拟实现主机192.1.1.1和192.1.1.2之间互相发送并接收1024bytes的数据。
5、总结
在学习新的知识,初次接触需要查看许多资料,而并不是自己所看到的资料和教程就可以直接复现,也正是因此,这个过程促进者自己去探索、学习和研究,自己才能够产生更深刻的理解。这一篇也是记录着我在这个过程学习的成果,我感觉步骤比较清晰,比起我看过的资料目标更明确,希望能够帮助到大家,也欢迎一起交流!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/11375.html