这一节我们开始分析第二个例子 first.cc 。网络拓扑就下所示:
// Default Network Topology
//
// 10.1.1.0
// n0 -------------- n1
// point-to-point
//
//
这是一个P2P模型。我们接着来看看NS3的具体实现:
----------------------------------------------------------------------------------------------------------------
//头文件声明
#include "ns3/core-module.h"
#include "ns3/network-module.h"
#include "ns3/internet-module.h"
#include "ns3/point-to-point-module.h"
#include "ns3/applications-module.h"
//namespace的声明
using namespace ns3;
//声明了一个叫FirstScriptExample的日志构件,通过引用FirstScriptExample这个名字的操作,
//可以实现打开或者关闭控制台日志的输出。
NS_LOG_COMPONENT_DEFINE ("FirstScriptExample");
int main (int argc, char *argv[])
{
Time::SetResolution (Time::NS);
//下面两行脚本是用来使两个日志组件生效的。它们被内建在Echo Client 和Echo Server 应用中
//设置日志为LOG_LEVEL_INFO级别
LogComponentEnable ("UdpEchoClientApplication", LOG_LEVEL_INFO);
LogComponentEnable ("UdpEchoServerApplication", LOG_LEVEL_INFO);
/********************网络拓扑部分************************/
//创建ns3节点对象,它们在仿真中代表计算机
NodeContainer nodes; //声明了一个名为”nodes”的NodeContainer
nodes.Create (2); //调用了nodes对象的Create()方法创建了两个节点
//构建一个点到点的连接
//使用PointToPointHelper来配置和连接ns-3的PointToPointNetDevice和PointToPointChannel对象
PointToPointHelper pointToPoint; //在栈中初始化了一个PointToPointHelper的对象PointToPoint
pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps")); //创建一个PointToPointNetDevice对象时使用“5Mbps"来作为数据速率
pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms")); //使用"2ms"(2毫秒)作为每一个被创建的点到点信道传输延时值
//完成设备和信道的配置
NetDeviceContainer devices;
devices = pointToPoint.Install (nodes);
//安装PointToPointHelper 对象和点到点网络设备的网络协议栈
InternetStackHelper stack;
stack.Install (nodes);
//为节点上的设备设置IP地址
//地址分配默认是从1开始并单调的增长,所以在这个基础上第一个分配的地址会是10.1.1.1,紧跟着是10.1.1.2等等
Ipv4AddressHelper address; //声明了一个地址生成器对象
address.SetBase ("10.1.1.0", "255.255.255.0");
//使用 Ipv4Interface对象将一个IP地址同一个设备关联起来
Ipv4InterfaceContainer interfaces = address.Assign (devices);
/********************网络拓扑部分结束*********************/
/**********************应用程序部分*********************/
//在我们之前创建的节点上设置一个UDP 回显服务应用
UdpEchoServerHelper echoServer (9); //声明了UdpEchoServerHelper,用来帮助创建真正应用的对象
//ApplicationContainer的方法Start和Stop来设置时间点
//使echo服务应用在1s时开始(生效)并在10s时停止(失效)
ApplicationContainer serverApps = echoServer.Install (nodes.Get (1));
serverApps.Start (Seconds (1.0));
serverApps.Stop (Seconds (10.0));
//使用UdpEchoClientHelper来管理UdpEchoClientApplicationecho,设置客户端的应用
UdpEchoClientHelper echoClient (interfaces.GetAddress (1), 9);//创建了一个生成器并告诉它设置客户端的远端地址为服务器节点的IP地址。
//我们同样告诉它准备发送第二个数据包到端口9。
echoClient.SetAttribute ("MaxPackets", UintegerValue (1)); //告诉客户端我们所允许它在模拟期间所能发送的最大数据包个数
echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.0))); //告诉客户端在两个数据包之间要等待多长时间
echoClient.SetAttribute ("PacketSize", UintegerValue (1024)); //告诉客户端它的数据包应该承载多少数据
//告诉echo客户端何时来开始和停止
ApplicationContainer clientApps = echoClient.Install (nodes.Get (0));
clientApps.Start (Seconds (2.0));
clientApps.Stop (Seconds (10.0));
/**********************应用程序部分结束*********************/
Simulator::Run (); //运行模拟器
Simulator::Destroy (); //销毁所有被创建的对象
return 0;
}
----------------------------------------------------------------------------------------------------------------
编译,运行结果如下:
通过该例子,我们来看看两个基本概念:拓扑生成器类和Applications类
1、拓扑生成器
NodeContainer类:
节点概念是我们的一个关键抽象概念。节点代表一台能够加入诸如协议栈,应用以及外设卡等等的东西的计算机。NodeContainer 的拓扑生成器提供一种简便的方式来创建、管理和使用任何节点对象,我们用这些节点来运行模拟器。
PointToPointHelper类:
PointToPointHelper被用来做关于创建,配置和安装设备的工作。在这个脚本中仅需使用PointToPointHelper来配置和连接ns-3的PointToPointNetDevice和PointToPointChannel对象。
字符串“DataRate”与PointToPointNetDevice的一个属性相对应,PointToPointChannel也有一个Delay属性。
NetDeviceContainer类:
PointToPointHelper的Install()方法以一个NodeContainer对象作为一个参数。
在Install()方法内,一个NetDeviceContainer被创建了。对于在NodeContainer 对象中的每一个节点(对于一个点到点链路必须明确有两个节点),一个PointToPointNetDevice被创建和保存在设备容器内。一个PointToPointChannel对象被创建,两个PointToPointNetDevices与之连接。当PointToPointHelper对象创建时,那些在生成器中就被预先地设置的属性被用来初始化对象对应的属性值。
当调用了pointToPoint.Install(nodes)后,我们会有两个节点,每一个节点安装了点到点网络设备,在它们之间是一个点到点信道。两个设备会被配置在一个有2毫秒传输延时的信道上以5M比特每秒的速率传输数据。
InternetStackHelper类:
类InternetStackHelper 是一个安装PointToPointHelper 对象和点到点网络设备的网络协议栈的拓扑生成器类。其中Install()方法以一个NodeContainer 对象做为一个参数,当它被执行后,它会为每一个节点容器中的节点安装一个网络协议栈(TCP,UDP,IP等等)。
使用Ipv4AddressHelper类
提供了一个拓扑生成器来管
理IP地址的分配。当执行实际的地址分配时唯一用户可见的API是设置基IP地
址和子网掩码。
2、Applications类
UdpEchoServerHelper类:
UdpEchoServerHelper类是一个用来帮助创建真正应用的对象。
同其它生成器对象类似,UdpEchoServerHelper对象有一个Install方法。实际上是这个方法的执行,才初始化回显服务器的应用,并将应用连接到一个节点上去。有趣的是,安装方法把NodeContainter当做一个参数,正如我们看到的其他安装方法一样。这里有一个C++隐式转换,此转换以nodes.Get(1)的结果作为输入,并把它作为一个未命名的NodeContainer的构造函数的参数,最终这个未命名的NodeContainer被送入Install方法中去。
ApplicationContainer:
应用对象需要一个时间参数来“开始”产生数据通信并且可能在一个可选的时间点“停止”。我们提供了开始和停止的两个参数。这些时间点是用ApplicationContainer的方法Start和Stop来设置的。这些方法以”Time”对象为参数。
UdpEchoClientHelper类:
echo客户端应用的设置与回显服务器端类似。也有一个UdpEchoClientHelper来管理UdpEchoClientApplication。
Simulator类:
运行模拟器,这是用全局函数Simulator::Run.来做到的
原文地址:http://blog.csdn.net/liuruiqun/article/details/45220147