一、目录结构

waf:基于python开发的编译工具,不管是ns3系统本身自带的和我们自己写的仿真代码都是都是由waf负责编译的。

scratch:存放用户脚本文件,是ns-3默认的脚本存放目录。我们可以把要运行的脚本文件或者例子放到这个目录下,使用waf运行脚本文件时可以不用加目录scratch,当脚本文件在其他目录时需要在文件名称前加目录名称才能正常编译运行。

examples:里边包含关于如何使用ns-3的例子,包含许多模块的使用,如能量,路由,无线网络等,如果你和我一样是一个ns-3初学者的话,只是想利用ns-3现有模块编写脚本文件进行网络仿真,比如使用常规协议栈中的协议配置一个有线或者无线局域网络等,那么使用examples目录下的示例对我们很有帮助。examples目录下的文件都是我们一些常用到的例子:

wscript:wscript文件结构是固定的,用来注册模块中包含的源码和使用其他模块情况。

model:    model目录包含模块代码的.cc和.h文件。这里边的脚本一般不用我们修改,这个一般通过help类加到节点上,比如一个gpsr模块里的model里边的脚本使用help类加到某个节点上,用来研究gpsr协议。

如果你是一个ns-3的高级应用者的话,ns-3现有模块不能满足你的需求,比如新开发一个路由协议或者设计一个新的能量模型或者移动模型,那现有模块中的model目录下的内容很有参考价值。

helper:    helper目录存放的是模块对应的helper类代码的源文件。主要帮助用户创建节点,给节点添加协议栈,网络设备等等。

test:    

examples:examples目录存放的是应用该模块的实例代码。这里的代码我们可以参考并且修改,用来测试或仿真某一个协议,并且收集协议的传输延迟,投递率等。

doc:doc是帮助文档。

bindings:bindings目录是模块用来绑定Python语言的。

二、模块说明

1.常用模块

Core:ns-3的内核模块,实现了ns-3的基本机制,如智能指针(Ptr)、属性(attribute)、回调(callback)、随机变量(random ariable)、日志(logging)、追踪(tracing)和事件调度(event scheduler)等内容。

Network: 网络数据分组(packet)的模块,一般仿真会用到。

Internet: 实现了关于TCP/IPv4和IPv6的相关协议族,包括IPv4、IPv6、ARP、UPP、TCP、邻居发现和其他相关协议,目前大多数网络都是基于Internet协议栈的。

Applications: 集中常用的应用层协议

Mobility: 移动模型模块

Topolopy-read: 读取指定轨迹文件数据,按照指定格式生成相应的网络拓扑。网络协议时能量不得不考虑。

Status: 统计框架模块,方便ns-3仿真的数据收集、统计和分析。

Tools: 统计工具,包括统计作图工具gnuplot的接口和使用。

Visualizer:

Netanim: 动画演示工具Netnim

Propagation: 传播模型模块

Flow-monitor: 流量监控模块。

2.几种典型的网络模块

Point-to-point: 实现点对点通信的网络

CSMA: 实现了基于IEEE802.3的以太网络,包括MAC层、物理层和媒体信道。

Wifi: 如何实现基于IEEE 802.11 a/b/g的无线网络,可以是有基础设施的也可以是ad hoc网络。

Mesh: 实现基于IEEE 802.11s的无线mesh网络。

Wimax: 实现了基于IEEE802.16标准的无线城域网络。

原文链接:

三、脚本编写常规步骤

1、创建节点:NodeContainer

NodeContainer p2pNodes;
  p2pNodes.Create (2);

2、创建链路类型:XxxHelper

PointToPointHelper pointToPoint;

3、安装链路类型,生成网卡

NetDeviceContainer p2pDevices;
  p2pDevices = pointToPoint.Install (p2pNodes);

4、安装协议栈

InternetStackHelper stack;
  stack.Install (p2pNodes);

5、配置IP地址

Ipv4AddressHelper address;
  address.SetBase ("10.1.1.0", "255.255.255.0");

6、生成网络接口

Ipv4InterfaceContainer p2pInterfaces;
  p2pInterfaces = address.Assign (p2pDevices);

7、安装应用

ApplicationContainer  serverApps = echoServer.Install ( p2pNodes.Get (1));

8、仿真

四、移动模块简介

1、移动模型:

      MobilityHelper 类用来设置节点移动模型

例:
MobilityHelper mobility
mobility.SetPositionAllocator()     //设置节点初位置
mobility.SetMobilityModel()    //设置节点运动方式

初始位置->网格布局
 mobility.SetPositionAllocator ("ns3::GridPositionAllocator",
                                 "MinX", DoubleValue (0.0), //起始X轴坐标
                                 "MinY", DoubleValue (0.0), //起始Y轴坐标
                                 "DeltaX", DoubleValue (5.0), //X轴上的节点间距
                                 "DeltaY", DoubleValue (10.0), //Y轴上节点间距
                                 "GridWidth", UintegerValue (5), //一行最多节点数
                                 "LayoutType", StringValue ("RowFirst")); //布局类型

初始位置->园内随机布局
mobility.SetPositionAllocator ("ns3::GridPositionAllocator",
                                   参数...)

参数包括{ Theta 随机角度
          Rho 随机半径
          X  圆心X轴坐标
          Y  圆心Y轴坐标 }

2、运动模型:

运动模型->固定不动
mobility.SetMobilityModel("ns3::ConstantPositionMobilityModely)

运动模型->随机运动
mobility.SetMobilityModel("ns3::RandomWalk2dMobilityModely"
                             参数...)
参数包括{  Bounds      运动范围
           Time       走多久换一次方向
           Distance   走多远换一次方向
           Mode       选择时间还是距离改变方向
           Direction  随机方向
           Speed      随机速度 }

五、应用:

     所有应用程序要分别使用.Start()和.Stop()设置应用的启动、停止时间,注意服务器程序要比客户端早启动。

Udp,分为 UdpServer 和 UdpClient 顾名思义,构建一个Udp应用,客户端往服务器端发数据。

1、节点安装Udpserver

UdpEchoServerHelper echoServer (9);   //5.1、安装UdpServer应用服务,9表示服务端口
  ApplicationContainer serverApps = echoServer.Install (nodes.Get (1));
  serverApps.Start (Seconds (1.0));
  serverApps.Stop (Seconds (10.0));
  serverApps.Start (Seconds (1.0));   //6.1、Server启动时间
  serverApps.Stop (Seconds (10.0));

2、节点安装Udpclient

UdpEchoClientHelper echoClient (p2pInterfaces.GetAddress (1), 9);   //绑定服务器地址,地址用interface.GetAddress方法获取
  echoClient.SetAttribute ("MaxPackets", UintegerValue (100));  //发送多少个包
  echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.0)));  //发送间隔
  echoClient.SetAttribute ("PacketSize", UintegerValue (1024));  //包大小
  ApplicationContainer clientApps = echoClient.Install (wifiStaNodes.Get (1));  //安装到哪个节点
  clientApps.Start (Seconds (2.0));
  clientApps.Stop (Seconds (10.0));