Get!Linux系统上进行网络模拟(NS3快速上手)

目标任务:模拟在两个节点间创建一个简单的点到点的连接,并且在这两个节点之间传送一个数据包。

这是一次全新的网络模拟实验,对于初学者来说,如何正确快速的完成任务呢?我们只有找到正确的指导,初学接触时,按部就班地跟着实践,之后加上自己的学习研究之后,就相当于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目录。

解压完成结果如图:说明成功了!
ns3解压成功
(4)编译安装

这里我使用的方法是对解压后的文件,名为build.py进行编译安装。第一次编译ns3软件包常用的方法,build.py是一个python脚本,如上图解压目录中可以找到。

编译命令:

./build.py --enable-examples --enable-tests

编译如下:
ns3成功编译
这一步真正在Linux安装ns3软件,需要耐心等待,这个过程会看到大量编译输出信息。

正在编译:
正在编译
编译成功输出信息:
编译成功
最后输出几个模块未安装,这不影响ns3之后的运行使用。

自此,我们实现了关键步骤,环境准备完毕!可谓工欲善其事,必先利其器

3、测试安装

(1)使用官方test.py脚本测试
我们来检验一下是否安装成功,ns3软件的开发确实是很完善、样样周全,它给我们提供了测试脚本test.py,测试发行版本的ns3是否正确编译。

这时候进入编译后的ns-3.25目录下,找到test.py脚本
执行命令:

./test.py -c core

测试结果:
测试1
看到下图,说明编译正确,ns3可以使用。
测试成功
(2)运行脚本测试
再次验证ns3正确安装与否,双重保险!
测试命令:

./waf --run hello-simulator

终端显示: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、总结

在学习新的知识,初次接触需要查看许多资料,而并不是自己所看到的资料和教程就可以直接复现,也正是因此,这个过程促进者自己去探索、学习和研究,自己才能够产生更深刻的理解。这一篇也是记录着我在这个过程学习的成果,我感觉步骤比较清晰,比起我看过的资料目标更明确,希望能够帮助到大家,也欢迎一起交流!

猜你喜欢

转载自blog.csdn.net/Charzous/article/details/106760534