鉴于前面已经有写过了ns3安装的部分,因此也就不重新介绍beginning部分了。
第四章介绍了几个网络中非常重要的概念。对于网络比较熟悉的基本上一看就能懂,理解这几个概念对于理解ns3十分重要。下面就是tutorial第四章的相关翻译工作。
相关概念介绍
首先,在进行ns3程序开发之前,我们有必要对相关概念进行介绍。它们是网络中最基本的对象,因此必须理解。
节点-Node
在因特网术语中,连接到网络的计算设备被称为主机或者终端。但是由于ns3是网络模拟器,而非因特网模拟器,因此我们更习惯使用图论中的概念节点来描述。
节点对象的基类是使用C++编写的Node类,它提供各类方法模拟网络中的计算设备。同时,也允许用户向其内部添加功能(应用程序、协议栈、外部设备驱动…)以模拟更复杂的网络设备。
应用程序-Application
计算机软件分为两类:系统软件和应用软件。系统软件负责组织各类资源(内存、处理器、磁盘、网络…),应用软件则用于完成用户需求(期间可能需要与系统软件通信以使用其资源)。然而在ns3中,并没有操作系统的概念,因此系统软件也就不存在了,只剩下应用程序。
在ns3中,应用程序的基类为Application。但是在学习初期,我们直接使用两个具体的应用程序类,它们继承Application,分别为:UdpEchoClientApplication(客户端)和UdpEchoServerApplication(服务器)。它们可以用来产生和回应数据包。
信道-Channel
现实中,网络通信数据流经过的媒介乐意被称为“信道”。同样,在ns3中我们也需要有信道的概念。其基类使用Channel表示。信道用于管理通信子网之间、节点与通信子网之间的通信。
在ns3中,提供了具体的信道类,它们继承于Channel。分别为:CsmaChannel(载波侦听多路访问信道)、PointToPointChannel(点对点信道)、WifiChannel(wifi信道)。不同信道支持的协议不一样,如CsmaChannel在其通信媒介上提供载波侦听和冲突检测,可以模拟以太网的特点。
网络设备-Net Device
总所周知,当你需要使用电脑上网时,必须使用网络接口卡(NIC)。但是硬件网卡必须使用软件驱动,二者结合才能正常工作。在Linux操作系统中,它们的出现形式类似于eth0这样的。
在ns3中,网络设备的模拟包括硬件和软驱动两部分。而且必须将其“安装”在Node中,才能使Node通过Channel与外部通信。另外,一个Node允许有多个Net Device,通过多条Channel与外部进行通信。
网络设备在ns3中的抽象为NetDevice,它提供连接Channel和Node的方法。在ns3中的具体派生类有:CsmaNetDevice(CSMA网络设备)、PointToPointNetDevice(点对点网络设备)、WifiNetDevice(wifi网络设备)。不同的网络设备应该被用在Node与对应的的Channel之间。例如:CsmaNetDevice对应CsmaChannel。
拓扑帮助器-Topology Helpers
现实中的网络十分复杂,想要在ns3中模拟,那么就必须在Node、NetDevice、Channel之间搭建各种连接,还包括分配IP,等等工作。为了简化开发工作,ns3提供了Topology Helpers来帮助搭建网络拓扑,它为开发人员提供了一种更见方便的模式。
第一个ns-3脚本
以本人安装的ns-3.15为例,在…ns-3.15/examples/tutorial/first.cc,这是我们需要学习的第一个例子。关于该例子的解释,详细的请参考tutorial第25-33页。本文选出在上面没有介绍的部分进行说明。
位于ns3命名空间下。它提供了管理、创建、访问Node对象的方法。程序中涉及的Create()即为创建节点的方法。
它属于我们前面提到的Topology Helper。在该脚本中构造一个点对点的链路,连接PointToPointNetDevice和PointToPointChannel。在实例化对象之后,使用了两个方法:SetDeviceAttribute()设置网络设备的属性,包括MTU、Address、bps、DateRate等;SetChannelAttribute()设置信道属性,具体可查阅www.nsnam.org/docs/release/3.24/doxygen;
网络设备容器,类似于NodeContainer,是网络设备的容器。但是它并非像NetContainer那样创造对象。而是通过将Channel和Node连接起来这样的一个过程构造网络设备卡,并将其附在节点和信道之间。最初在创建Channel时所设置的属性值会过渡到创建的属性中。下面的代码以容器为对象两两匹配。
NetDeviceContainer = PointToPointHelper.Install(NodeContainer);
网络协议部署器,属于前面提到的Topology Helper,在设置完整体拓扑结构之后,需要在节点中部署互联网协议(TCP、UDP、IP等)。下面的安装过程以节点容器为对象。
InternetStackHelper.Install(NodeContainer);
负责ip地址的分配,同样为了方便,可以直接以节点容器为对象进行地址分配。目前该类对外只提供基础IP地址和子网掩码的设置功能,函数为SetBase()。
Ipv4AddressHelper.SetBase(IP, MASK);
具体分配是由Assign()方法完成的,以容器为对象,按顺序分配ip。当然,ip地址绑定在NetDevice上。这样就形成了网络接口,这些接口保存为Ipv4InterfaceContainer,同样也是一个容器类,对外提供统一的访问方式。
Ipv4InternetContainer = Ipv4AddressHelper.Assign(NetDeviceContainer);
如此一来,一个基本的网络架构便搭建完成。下面需要做的就是在网络中产生流量。
应用程序-Application
之前提到过,为了简化入门的过程,我们前面提到了两个具体类:UdpEchoServerApplication和UdpEchoClientApplication分别作为服务器和客户端,在ns3中为了减少开发人员的工作,分别提供了UdpEchoServerHelper和UdpEchoClientHelper,对于服务器Helper而言,需要在初始化的时候设定一个监听端口,然后将该服务安装到某一节点(而非节点容器)中,然后得到的UdpEchoServerApplication同样保存在ApplicationContainer容器中。
UdpServerHelper echoserver(PORT);
ApplicationContainer = UdpEchoServerHelper.Install(Node);
客户端Helper在初始化过程中需要设定访问的远程IP地址、远程端口。其次设定相关的属性(包大小、发包间隔等),最后则是将Client安装到节点上。
UdpEchoClientHelper echoclient (Remote IP, Remote Port);
UdpEchoClientHelper.SetAttribute(ATTRIBUTES);
ApplicationContainer = UdpEchoClientHelper.Install(Node);
需要注意的是Server和Client都保存在ApplicationContainer中,但是程序中是建立了两个ApplicationContainer,分开存放。对于同一容器内的对象均是按先来后到的顺序存放。
仿真-Simulator
基础架构搭建完毕、流量工程设置完毕,接着就可以启动网络,开始仿真。具有流量运动的仿真时间通过Client和Server的开始、关闭时间决定。仿真直接调用Run开始整个工程。
Simulator::Run();
但是在运行结束之后,必须将其关闭,以免造成内存泄露等问题。
Simulator::Destroy();
另外仿真器可以显示停止,在于对Stop()的调用。
Simulator::Stop();
程序运行之前一般先编译、再运行。
$ ./waf
$ ./waf –run YOUR-PROGRAMM
NS3之路---Tutorial解读---Beginning&&Concept
原文:http://www.cnblogs.com/yibobo-blog/p/4931408.html