节点类node

《开源网络模拟器》

Node类是ns-3中一个地位极高的 C++类。说其地位高,是因为ns-3里几乎所有的C++类或多或少都和Node类有关。这其 实很好理解,因为从应用层到物理层的所有算法都必须依托于结点才能实现。同样,单纯 一个Node对象是无法处理和传递分组的。它必须在关联各个网络层协议之后才能成为一 个可以使用的通信结点。

   

   

ns-3结点的协议栈结构采用TCP/IP参考模型(见图2-4)e除了物理层表示信道的 Channel类,一个结点中的应用层Application类、传输层IpL4Protocol类、网络层Ipv4Ipv6类,以及链路层NetDevice类的(子类)对象都存储在结点Node对象中。因此,当 人们想获取某一个协议层的信息时,从Node对象出发总能得到想要的结果。

   

当然,ns-3脚本中的一些对象是可以直接通过以下4个存储容器获取的,即应用存储 容器Applicationcontainer>网络设备存储容器NetDeviceContainerIP接口存储容器 Ipv4InterfaceContainer Ipv6InterfaceContainer,以及结点存储容器 NodeContainer

   

   

   

这一节中我们介绍一种获取对象的通用方法,即以Node为起点获取各个协议层对象。 这里需要事先说明的是,协议层对象在结点Node中都是以指针形式存储的,使用的是ns-3 中的智能指针Ptr模板类。

例如,"Pt«Node>"表示一个Node对象指针。读者可以在本 书第4章中找到更多有关Ptr指针的技术细节和使用方法。这里大家只需把Ptr理解成是 普通的指针即可(如把<<Ptr<Node>M理解成"Node*")。Ptr指针的操作和普通指针完全 相同。

   

1.获取应用层对象:Node::GetApplication()函数

Node类中,应用层对象以向量形式(std::vector)存储。

   

2.获取传输层对象

Node类中,传输层对象存储在一个数组中。数组元素的获取函数是GetObject()。 这是一个模板函数。调用该函数时只需指定目标对象的类名即可。

这个数组在ns-3中叫作对象聚合数组(object aggregation),ns-3中使用的一种针 对类的存储技术。这个数组中存储的都是那些在一个结点中有且只能有一个实例存在 的对象。例如,一个结点中只能有一个TCP对象和一个UDP对象。由于一个结点中可以 拥有多个应用,因此Application不能用对象聚合数组存储。对象聚合的原理和使用方法请 读者参考本书第2——设计之道

   

3.获取网络层对象

与传输层对象相同,网络层对象也存储在Node对象的聚合数组中。

   

通过网络层对象我们还可以进一步获取IP地址。例如,下面这段代码提取了一个结 点中所有的IPv4地址(一个ns-3网络设备的IPv4地址保存在其所对应的接口 Ipv4Interface 对象中)

   

可以通过GetObject()方式获取的对象还有很多,如路由协议、移动结点的移动模型等。

   

4.获取链路层对象

ns3中,链路层协议在网络设备NetDevice类中实现。由于一个结点可以有多个网 络设备,和Application 一样,Node类使用向量容器存储NetDevice对象。

   

通过网络设备对象,还可以进一步获取其MAC地址。

   

   

5.获取物理层对象

ns-3中,信道Channel的各个子类负责实现不同种类的物理层协议。尽管信道Channel类不存储在结点Node类中,但还是可以通过结点的网络设备NetDevice来间接地 获取信道对象。

   

   

6.获取结点对象

最后,各个协议层对象可以使用GetNode()函数来获取所属结点Node对象。脚本中每 一个结点都有一个唯一 IDo可以通过Node::GetId()函数获取。

   

posted @ 2022-08-31 11:31  atomxing  阅读(118)  评论(0编辑  收藏  举报