ns-3网络仿真(简易脚本解析)

ns-3简易脚本解析

    • 点对点有线网络(first.cc)
    • 头文件
    • 命名空间
    • NS_LOG_COMPONENT_DEFINE
    • main()函数中的准备工作
    • 创建网络拓扑

点对点有线网络(first.cc)

目录 examples/tutorial/first.cc
这个脚本创建了一个包含了两个节点的有线网络

其链路层使用了点对点协议(Point-To-Point,PPP),传输分组
一个完整的ns-3脚本按照编写顺序可以分成以下几部分

头文件

ns-3是一个由不同模块组成的程序库,模拟脚本通过调用各个模块提供的API进行网络模拟,而每个模块的API都被统一存放在“<模块名>module.h”中。这样在添加头文件时,只需要知道所需模块名就可以调用相关内容,在编译后的build/ns3目录下找到这些头文件。

Core模块和network模块头文件是所有脚本必须包括的,他们分别定义了ns-3的核心功能(如模拟事件和事件调度)和基本的网络组件(如网络节点,分组和地址等)。

Internet和application模块尽管不是必须的,但也是大部分脚本经常会调用的模块,其中Internet模块定义了TCP/IP协议栈,application模块定义了应用层的分组收发模型(如贪婪模型,ON/OFF模型)

#include"ns3/core-module.h"							//core模块
#include"ns3/network-module.h"						//network模块
#include"ns3/internet-module.h"						//internet模块
#include"ns3/point-to-point-module.h"				//point to point 模块
#include"ns3/application-dodule.h"					//application模块

命名空间

整个ns-3源代码都受到”ns-3“命名空间保护,这样可以将ns3项目和非ns3项目隔离,起到很好的保护作用,也便于和其他项目整合。因此每一个脚本开始都需要声明命名空间,在ns3中使用标准库函数需要添加std命名空间,如std::cout std::min;

using namespace ns3;

NS_LOG_COMPONENT_DEFINE

允许在该脚本中使用Log系统中的宏定义打印辅助信息,如打印调试信息的NS_LOG_DEBUG宏和打印错误信息的NS_LOG_ERROR宏等等。
NS_LOG_COMPONENT_DEFINE
尽管这是一个可选步骤,建议添加,辅助信息对代码调试和模拟流程都十分有用。

main()函数中的准备工作

后续操作都需要在main中完成,在正式开始之前,我们还需要一些预备工作。

CommandLine cmd;
cmd.Parse(argc,argv);				//读取命令行参数

Time::SetResolution(Time::Ns);		//最小时间单元:ns

//打印指定LOG组件信息
LogComponentEnable(
	"UdpEchoClientApplication",LOG_LEVEL_INFO);
LogComponentEnable(
	"UdpEchoServerApplication",LOG_LEVEL_INFO);

创建网络拓扑

搭建网络拓扑,在物理网络中,一个网络拓扑由若干结点和链接结点的信道组成。在ns3中,结点和信道分别被抽象为Node和Channel以及结点中连接信道的网络设备NetDevice类三个C++类。不同类型的信道对应不同类型NetDevice和Channel子类。例如,对First脚本中的点对点(PPP)信道来说,其对应的网络设备类是PointToPointNetDevice,信道类是PonitToPointChannel。一般来说,NetDevice主要负责实现链路层协议,Channel主要实现物理层协议

First脚本中Node,Channel和NetDevice类的对象关系如下,其中箭头代表传输方向。

Node(NetDevice) <-->Channel<-->Node(NetDevice)
     结点0							结点1

下面在脚本中构建上述节点结构和网络拓扑

NodeContainer nodes;
nodes.Creat(2);							//创建网络结点

PointToPointHelper pointToPoint			//PPP信道助手类
//配置PPP信道属性
pointToPoint.SetDeviceAttribute(
	"DataRate",StringValue("5Mbps"));	//传输速率属性
pointToPoint.SetDeviceAttribute(
	"Delay",StringValue("2ms"));		//传输延迟属性

NetDeviceContainer devices;				//创建网络设备
devices = pointToPoint.Install(nodes);	//链接结点与信道

InternetStackHelper stack;				//为节点安装TCP/IP协议栈的助手是InternetStackHelper
stack.Install(nodes);					//为node容器中的结点安装TCP/IP协议

Ipv4AddressHelper address;				//为网络设备分配ip地址
address.SetBase("10.1.1.0","255.255.255.0");

Ipv4InterfaceContainer interfaces=address.Assign(devices);
//建立一个两个结点的有线网络,从物理层到传输层分别安装了PPP和TCP/IP协议族,可以运行基于TCP/IP应用进行通信

UdpEchoServerHelper echoServer (9);			//监听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)));
echoClient.SetAttribute ("PacketSize", UintegerValue (1024));

ApplicationContainer clientApps = echoClient.Install (nodes.Get (0));
clientApps.Start (Seconds (2.0));
。。。。。。。。。。。。。。。。。clientApps.Stop (Seconds (10.0));

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