这里写自定义目录标题
学习ns-3的第一天
- ns-3脚本编写的基本流程(每一步,都会有一个Helper类)
1)生成节点:---->NodeContainer拓扑助手对象模拟创建节点
/*创建节点
NodeContainer 的拓扑生成器提供一种简便的方式来创建、管理和使用任何节点对象,
我们用这些节点来运行模拟器
一个节点代表一个计算机
无论何时创建节点,将节点添加到系统的全局列表中
NS-3种的内部函数来产生两个节点对象,并把指向这两个对象的指针存储在系统之中。
*/
NodeContainer nodes;
nodes.Create (2);
2)安装网络设备:每个节点都有一个网络设备
------>PointToPointHelper对象创建、配置、安装设备
------>SetDeviceAttribute设置数据速率----->SetChannelAttribute信道传输时延
------>NetDeviceContainer对象存放NetDevice(网络设备)对象列表(包括节点对象,信道对象)
*例如:点对点通信:两个节点,一条信道组成一个NetDevice Container
一个PointToPointChannel,两个PointToPointNetDevice与之连接----->*
/*
将节点连接到网络中,网络设备+信道
*/
//使用PointToPointHelper,负责设置网络设备和信道属性
//来配置和连接ns-3的PointToPointNetDevice和PointToPointChannel对象。
//在栈中初始化了一个PointToPointHelper的对象PointToPoint
PointToPointHelper pointToPoint;
//从上层的角度告诉PointToPointHelper对象-----这里的上次指的是网络层这些吗
//当创建一个PointToPointNetDevice对象时使用“5Mbps”来作为数据速率。
//DataRate是一个可选的属性
pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
//告诉PointToPointHelper使用”2ms”(2毫秒)作为每一个被创建的点到点信道传输延时值。
pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));
//通过install方法把设备安装到节点上
/*
NetDeviceContainer对象存放NetDevice(网络设备)对象列表
通过helper类实例化网络设备,像设备添加MAC地址和队列,然后安装到节点
以下两行,完成设备和信道配置
*/
NetDeviceContainer devices;
devices = pointToPoint.Install (nodes);//一个NetDevice Container被创建了
/*
一个节点,一个PointToPointNetDevice
点对点通信:两个节点,一条信道组成一个NetDevice Container
一个PointToPointChannel
两个PointToPointNetDevice与之连接
*/
3)安装协议栈:每个节点都有一个网络协议栈,主要是IP层
------->分配IP地址,将IP和设备关联起来
/*
给每一个节点安装一个协议栈
*/
InternetStackHelper stack;
stack.Install (nodes);
/*从10.1.1.0开始以子网掩码为255.255.255.0分配地址
地址分配默认是从1开始并单调的增长,
所以在这个基础上第一个分配的地址会是10.1.1.1,紧跟着是10.1.1.2等等。
底层ns-3系统事实上会记住所有分配的IP地址
*/
Ipv4AddressHelper address;
address.SetBase ("10.1.1.0", "255.255.255.0");
Ipv4InterfaceContainer interfaces = address.Assign (devices);//完成地址配置
//IP地址同设备关联起来
4)安装应用层协议(产生数据)
安装服务器端应用程序、设置端口号
//服务器端
UdpEchoServerHelper echoServer (9);
//本例中,除非我们告知生成器服务器和客户端所共知的一个端口号,否则这个生成器是不会起任何作用的
ApplicationContainer serverApps = echoServer.Install (nodes.Get (1));
//echoServer.Install将会在管理节点的NodeContainer容器索引号为1的机节点上安装一个UdpEchoServerApplication。
//安装会返回一个容器,这个容器中包含了指向所有被生成器创建的应用指针。
serverApps.Start (Seconds (1.0));
serverApps.Stop (Seconds (10.0));
//echo服务应用于1s开始,10s结束
客户端
//客户端
//客户端的远端地址为服务器节点的IP地址,端口号一致
UdpEchoClientHelper echoClient (interfaces.GetAddress (1), 9);
//MaxPackets”属性告诉客户端我们所允许它在模拟期间所能发送的最大数据包个数。
echoClient.SetAttribute ("MaxPackets", UintegerValue (1));
//Interval”属性告诉客户端在两个数据包之间要等待多长时间
echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.0)));
//PacketSize”属性告诉客户端它的数据包应该承载多少数据,1024byte
echoClient.SetAttribute ("PacketSize", UintegerValue (1024));
//容器索引号为0的机节点上安装一个UdpEchoClientApplication。
ApplicationContainer clientApps = echoClient.Install (nodes.Get (0));
//客户端在服务端生效1s才开始
clientApps.Start (Seconds (2.0));
clientApps.Stop (Seconds (10.0));
5)其他配置
6)启动仿真
例子的完整代码:
```cpp
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation;
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
//在编译的过程中,每一个ns-3的include文件被放在build目录下一个叫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"
// Default Network Topology
//
// 10.1.1.0
// n0 -------------- n1
// point-to-point
//
using namespace ns3;
/*
Ns-3的日志子系统是核心模块(core module)的一部分,
所以继续前进打开核心(Core)这个文件节点。
接着展开调试(“Debugging”)节点,选择日志(Logging)页面。
*/
//NS-3提供了若干个日志级别来满足不同的Debug需求,每一级的日志内容都涵盖了低一级的内容。
NS_LOG_COMPONENT_DEFINE ("FirstScriptExample");
/*
这一行声明了一个叫FirstScriptExample的日志构件,
通过引用FirstScriptExample这个名字的操作,
可以实现打开或者关闭控制台日志的输出。
在仿真过程中发生了很多你所没有看到的事情。
现在可以很容易的打开系统的日志组件,察看整个过程了
*/
int
main (int argc, char *argv[])
{
CommandLine cmd (__FILE__);
cmd.Parse (argc, argv);
Time::SetResolution (Time::NS);
/*
下面两行脚本是用来使两个日志组件生效的。
它们被内建在Echo Client 和Echo Server 应用中
这两行代码将回显clients和server的日志级别设为”INFO”级
当仿真发生数据包发送和接受时,对应的应用就会输出相应的日志消息
*/
LogComponentEnable ("UdpEchoClientApplication", LOG_LEVEL_INFO);
LogComponentEnable ("UdpEchoServerApplication", LOG_LEVEL_INFO);
/*创建节点
NodeContainer 的拓扑生成器提供一种简便的方式来创建、管理和使用任何节点对象,
我们用这些节点来运行模拟器
一个节点代表一个计算机
无论何时创建节点,将节点添加到系统的全局列表中
NS-3种的内部函数来产生两个节点对象,并把指向这两个对象的指针存储在系统之中。
*/
NodeContainer nodes;
nodes.Create (2);
/*
将节点连接到网络中,网络设备+信道
*/
//使用PointToPointHelper,负责设置网络设备和信道属性
//来配置和连接ns-3的PointToPointNetDevice和PointToPointChannel对象。
//在栈中初始化了一个PointToPointHelper的对象PointToPoint
PointToPointHelper pointToPoint;
//从上层的角度告诉PointToPointHelper对象-----这里的上次指的是网络层这些吗
//当创建一个PointToPointNetDevice对象时使用“5Mbps”来作为数据速率。
//DataRate是一个可选的属性
pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
//告诉PointToPointHelper使用”2ms”(2毫秒)作为每一个被创建的点到点信道传输延时值。
pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));
//通过install方法把设备安装到节点上
/*
NetDeviceContainer对象存放NetDevice(网络设备)对象列表
通过helper类实例化网络设备,像设备添加MAC地址和队列,然后安装到节点
以下两行,完成设备和信道配置
*/
NetDeviceContainer devices;
devices = pointToPoint.Install (nodes);//一个NetDevice Container被创建了
/*
一个节点,一个PointToPointNetDevice
点对点通信:两个节点,一条信道组成一个NetDevice Container
一个PointToPointChannel
两个PointToPointNetDevice与之连接
*/
/*
给每一个节点安装一个协议栈
*/
InternetStackHelper stack;
stack.Install (nodes);
/*从10.1.1.0开始以子网掩码为255.255.255.0分配地址
地址分配默认是从1开始并单调的增长,
所以在这个基础上第一个分配的地址会是10.1.1.1,紧跟着是10.1.1.2等等。
底层ns-3系统事实上会记住所有分配的IP地址
*/
Ipv4AddressHelper address;
address.SetBase ("10.1.1.0", "255.255.255.0");
Ipv4InterfaceContainer interfaces = address.Assign (devices);//完成地址配置
//IP地址同设备关联起来
//安装应用层
//服务器端
UdpEchoServerHelper echoServer (9);
//本例中,除非我们告知生成器服务器和客户端所共知的一个端口号,否则这个生成器是不会起任何作用的
ApplicationContainer serverApps = echoServer.Install (nodes.Get (1));
//echoServer.Install将会在管理节点的NodeContainer容器索引号为1的机节点上安装一个UdpEchoServerApplication。
//安装会返回一个容器,这个容器中包含了指向所有被生成器创建的应用指针。
serverApps.Start (Seconds (1.0));
serverApps.Stop (Seconds (10.0));
//echo服务应用于1s开始,10s结束
//客户端
//客户端的远端地址为服务器节点的IP地址,端口号一致
UdpEchoClientHelper echoClient (interfaces.GetAddress (1), 9);
//MaxPackets”属性告诉客户端我们所允许它在模拟期间所能发送的最大数据包个数。
echoClient.SetAttribute ("MaxPackets", UintegerValue (1));
//Interval”属性告诉客户端在两个数据包之间要等待多长时间
echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.0)));
//PacketSize”属性告诉客户端它的数据包应该承载多少数据,1024byte
echoClient.SetAttribute ("PacketSize", UintegerValue (1024));
//容器索引号为0的机节点上安装一个UdpEchoClientApplication。
ApplicationContainer clientApps = echoClient.Install (nodes.Get (0));
//客户端在服务端生效1s才开始
clientApps.Start (Seconds (2.0));
clientApps.Stop (Seconds (10.0));
Simulator::Run ();
Simulator::Destroy ();
return 0;
}
自己输入遇到的问题:
1. 头文件输入include之后要加空格
2. 所有左括号前都要有空格(有的不输入空格没问题,有的不输入空格会报错,为避免麻烦都加空格)