代码分析
1 头文件
#include "ns3/core-module.h"
#include "ns3/point-to-point-module.h"
#include "ns3/network-module.h"
#include "ns3/applications-module.h"
#include "ns3/mobility-module.h"
#include "ns3/csma-module.h"
#include "ns3/internet-module.h"
#include "ns3/yans-wifi-helper.h"
#include "ns3/ssid.h"
2 名字空间
3 打印内容
NS_LOG_COMPONENT_DEFINE (“ThirdScriptExample”);
4 主函数(变量声明)
与案例1不同,此处定义并使用一些命令行参数。
bool verbose = true;uint32_t nCsma = 3;uint32_t nWifi = 3;bool tracing = false;CommandLine cmd;cmd.AddValue ("nCsma", "Number of \"extra\" CSMA nodes/devices", nCsma);cmd.AddValue ("nWifi", "Number of wifi STA devices", nWifi);cmd.AddValue ("verbose", "Tell echo applications to log if true", verbose);cmd.AddValue ("tracing", "Enable pcap tracing", tracing);
`
以nWifi为例,意义为默认无线节点数目,设置大小为3,但可以通过命令行传入参数
若运行时采用以下方式,则把参数传进里面。
./waf --run "third --nWifi=18"
5 创建网络拓扑
(1)案例1涉及PPP网络,【设置链路速率、时延】代码如下
NodeContainer p2pNodes;p2pNodes.Create (2);PointToPointHelper pointToPoint;pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));NetDeviceContainer p2pDevices;p2pDevices = pointToPoint.Install (p2pNodes);
(2)CSMA网络
CSMA可以连接多个节点,节点之间竞争使用信道
(PPP连接两个节点,专属信道)
NodeContainer csmaNodes;csmaNodes.Add (p2pNodes.Get (1));//此处为双接口节点csmaNodes.Create (nCsma);CsmaHelper csma;csma.SetChannelAttribute ("DataRate", StringValue ("100Mbps"));csma.SetChannelAttribute ("Delay", TimeValue (NanoSeconds (6560)));NetDeviceContainer csmaDevices;csmaDevices = csma.Install (csmaNodes);
(3)Wifi网络
由一个接入点(AP)与nWiFi个移动节点组成,AP为双模节点,安装WiFi与PPP两个设备。WiFi协议包括链路层(WiFIMac)与物理层(WifiPhy)。WifiNetDevice只起到连接上下层协议的作用。
1)
NodeContainer wifiStaNodes;wifiStaNodes.Create (nWifi);NodeContainer wifiApNode = p2pNodes.Get (0);//双模节点
//默认模型YansWifiChannelHelper channel = YansWifiChannelHelper::Default ();//配置Channel类YansWifiPhyHelper phy = YansWifiPhyHelper::Default ();//配置wifiPhy类phy.SetChannel (channel.Create ());
设置Channel和WifiPhy
2)
WifiHelper wifi;wifi.SetRemoteStationManager ("ns3::AarfWifiManager");WifiMacHelper mac;Ssid ssid = Ssid ("ns-3-ssid");mac.SetType ("ns3::StaWifiMac",//移动节点"Ssid", SsidValue (ssid),"ActiveProbing", BooleanValue (false));NetDeviceContainer staDevices;staDevices = wifi.Install (phy, mac, wifiStaNodes);//安装移动节点mac.SetType ("ns3::ApWifiMac","Ssid", SsidValue (ssid));NetDeviceContainer apDevices;//AP结点apDevices = wifi.Install (phy, mac, wifiApNode);//安装AP节点
服务集标志符(SSID)
其中,设置主要用WifiHelper设置,助手类
3)设置移动模型
设置笛卡尔坐标系,其中AP节点坐标设为原点
主要应用助手类MobilityHelper
MobilityHelper mobility;//使用分布器GridPositionAllocator形成初始分布mobility.SetPositionAllocator ("ns3::GridPositionAllocator","MinX", DoubleValue (0.0),"MinY", DoubleValue (0.0),"DeltaX", DoubleValue (5.0),"DeltaY", DoubleValue (10.0),"GridWidth", UintegerValue (3),"LayoutType", StringValue ("RowFirst"));
//利用RandomWalk2MobilityModel设置移动轨迹mobility.SetMobilityModel ("ns3::RandomWalk2dMobilityModel","Bounds", RectangleValue (Rectangle (-50, 50, -50, 50)));mobility.Install (wifiStaNodes);
// 为AP节点设置移动模型,设置原点mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");mobility.Install (wifiApNode);
6 安装TCP/IP协议
InternetStackHelper stack;stack.Install (csmaNodes);stack.Install (wifiApNode);stack.Install (wifiStaNodes);Ipv4AddressHelper address;address.SetBase ("10.1.1.0", "255.255.255.0");Ipv4InterfaceContainer p2pInterfaces;p2pInterfaces = address.Assign (p2pDevices);address.SetBase ("10.1.2.0", "255.255.255.0");Ipv4InterfaceContainer csmaInterfaces;csmaInterfaces = address.Assign (csmaDevices);address.SetBase ("10.1.3.0", "255.255.255.0");address.Assign (staDevices);address.Assign (apDevices);UdpEchoServerHelper echoServer (9);
7 安装应用程序
ApplicationContainer serverApps = echoServer.Install (csmaNodes.Get (nCsma));serverApps.Start (Seconds (1.0));serverApps.Stop (Seconds (10.0));UdpEchoClientHelper echoClient (csmaInterfaces.GetAddress (nCsma), 9);echoClient.SetAttribute ("MaxPackets", UintegerValue (1));echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.0)));echoClient.SetAttribute ("PacketSize", UintegerValue (1024));ApplicationContainer clientApps = echoClient.Install (wifiStaNodes.Get (nWifi - 1));clientApps.Start (Seconds (2.0));clientApps.Stop (Seconds (10.0));
具体解释可以看案例1
8 设置路由
之前一个节点设置两个网络设备(PPP CSMA),而网络属于两个不同的子网,需要连接两个字网的节点具有路由功能。才可以进行数据包的转发(PPP与CSMA之间)
此处设置路由协议为全局路由,采用最短路径优先(OSPF算法),为每个节点生成路由表。对于IPV4,此处调用Ipv4GlobalRoutingHelper的PopulateRoutingTable()函数。
Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
9 数据追踪
分析网络性能的重要前提是获取实验数据,ns3以pcap或ASCII文本形式保存在指定文件中,这部分代码往往最后编辑。
pointToPoint.EnablePcapAll ("third");//EnablePcapAll()用于收集信道上所有链路层分组收发记录,格式Pcap,文件名前缀为third,命名规则为“前缀-节点号-网络设备”phy.EnablePcap ("third", apDevices.Get (0));csma.EnablePcap ("third", csmaDevices.Get (0), true);
10 启动与结束
Simulator::Run ();Simulator::Destroy ();return 0;
运行程序
在ns3目录下运行
./waf --run third