NS3网络仿真项目(二)——入门指南

 

官网给出NS3的资料主要分为以下几种:

1. NS3入手指南(Tutorial)

主要介绍如何下载、安装、以及简单的功能、实例程序讲解

2. NS3使用手册(Manual)

主要介绍NS3仿真器的结构和核心,是理解使用NS3的重要参考文献

3. 模块库(Model Library)

主要介绍NS3仿真器中现有的模块、协议程序说明,这个可以根据自己的需求查阅

4. API文档

涉及一些变量属性等

以上这些资料可以在该链接中找到https://www.nsnam.org/releases/ns-3-29/documentation/

 

运行NS3第一个示例程序first.cc

NS3给出的第一个示例程序比较简单,完成了两个节点间一个数据包的发送和回传过程。但通过分析可以帮助刚接触NS3的朋友理解NS3网络仿真的建立和执行过程。

NS3网络仿真项目(二)——入门指南_第1张图片

“Main->Source Files->添加->现有项”在文件夹中找到示例程序。

NS3网络仿真项目(二)——入门指南_第2张图片

对first.cc进行如下程序说明。

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);

//创建一条点到点线路,PointToPointHelper类 可以很方便的配置链路属性
  PointToPointHelper pointToPoint;
  pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
  pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));

//给节点加载网卡设备并接入网络
  NetDeviceContainer devices;
  devices = pointToPoint.Install (nodes);
//给节点加载协议栈
  InternetStackHelper stack;
  stack.Install (nodes);
//配置ipv4地址域
  Ipv4AddressHelper address;
  address.SetBase ("10.1.1.0", "255.255.255.0");
//将ipv4接口加载到网卡上
  Ipv4InterfaceContainer interfaces = address.Assign (devices);

//给节点加载应用程序

//配置应用程序服务器端,并配置端口号9
  UdpEchoServerHelper echoServer (9);
//将该服务器功能加载到指定节点,并配置服务器开始和结束时间
  ApplicationContainer serverApps = echoServer.Install (nodes.Get (1));
  serverApps.Start (Seconds (1.0));
  serverApps.Stop (Seconds (10.0));

//配置应用程序客户端,interfaces.GetAddress(1)获取服务器节点的ip地址,以及服务器端口号9
  UdpEchoClientHelper echoClient (interfaces.GetAddress (1), 9);
//此外还需配置客户端属性,例如包的大小和长度以及发包间隔
  echoClient.SetAttribute ("MaxPackets", UintegerValue (1));
  echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.0)));
  echoClient.SetAttribute ("PacketSize", UintegerValue (10000));

//将客户端功能加载到另一个节点上,同样需要配置客户端开始和结束时间
  ApplicationContainer clientApps = echoClient.Install (nodes.Get (0));
  clientApps.Start (Seconds (2.0));
  clientApps.Stop (Seconds (10.0));

//开启仿真器运行
  Simulator::Run ();
  Simulator::Destroy ();
  NS_LOG_UNCOND("Done");
  system("pause");
  return 0;
}

当执行全局函数Simulator::Run时,系统将开始执行事件列表(Event Lists)。之前程序配置了客户端和服务器的开始和结束时间,在1.0s时开启服务器,在2.0s时开始echo client application,当仿真器调用一个事件时,该事件可能会引起其他事件被调度和执行。客户端发送一个数据包给服务器这一过程将会引起一连串事件在仿真器中被执行。程序配置了服务器和客户端的结束时间,当到达结束时间,服务器和客户端关闭socket并取消可能存在的其他事件,使事件列表里不再有事件需要被处理,Simulator::Run返回,仿真结束。在程序执行过程中创建的对象以及一些参数等由Simulator::Destroy清理。

理解事件Event的创建、执行和结束,才可以更好地使用NS3进行网络仿真,之后会再介绍Events&Simulator。

在first.cc中打开了客户端和服务器的日志功能,日志等级是LOG_LEVEL_INFO,因此函数运行结束后,会打印客户端和服务器收发数据包的信息。运行结果保存在“/windows/ns-3-dev/main”文件夹中的“1.txt”文件中。 

NS3网络仿真项目(二)——入门指南_第3张图片

如果希望打印出的日志信息直接在命令行中显示,可以进行如下配置:打开调试->main属性页,将原始的命令参数“2>1.txt”改成“2->1.txt”即可。

NS3网络仿真项目(二)——入门指南_第4张图片

重新运行程序后,打印的日志信息就会出现在命令行中

NS3网络仿真项目(二)——入门指南_第5张图片

日志功能的设置,使用LogComponentEnable函数。

LogComponentEnable ("UdpEchoClientApplication", LOG_LEVEL_INFO);

第一个变量指定日志记录的对象,以"UdpEchoClientApplication"为例,该字符串在udp-echo-client.cc函数中定义 :NS_LOG_COMPONENT_DEFINE("UdpEchoClientApplication");

第二个变量是日志记录的等级,不同等级记录的日志内容和详细程度有所不同。参考链接https://www.nsnam.org/docs/release/3.29/tutorial/html/tweaking.html#using-the-logging-module

你可能感兴趣的:(ns-3网络仿真器)