目录 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;
允许在该脚本中使用Log系统中的宏定义打印辅助信息,如打印调试信息的NS_LOG_DEBUG宏和打印错误信息的NS_LOG_ERROR宏等等。
NS_LOG_COMPONENT_DEFINE
尽管这是一个可选步骤,建议添加,辅助信息对代码调试和模拟流程都十分有用。
后续操作都需要在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));