概述
在本次学习中,我们将研究这些节点模型的内部结构,以便更深入地了解它们的定制可能性,并对如何组装定制节点模型给出一些指导。
Ingredient
节点模型由其他模块组装而成,这些模块代表了应用程序、通信协议、网络接口、路由表、移动性模型、能源模型和其他功能。这些模块可分为以下几大类。
- Applications 应用程序通常对用户行为以及应用程序(如浏览器)和应用层协议(如HTTP)进行建模。应用程序通常使用传输层协议(如TCP和/或UDP),但它们也可能通过套接字直接使用较低层的协议(如IP或以太网)。
- Routing protocols 路由协议作为单独的模块提供。OSPF、BGP或用于MANET路由的AODV。这些模块使用TCP、UDP和IPv4,并在Ipv4RoutingTable模块中操作路由。
- Transport layer protocols 传输层协议与应用和网络层协议相连。它们通常由简单的模块表示,目前支持TCP、UDP和SCTP。TCP有几种实现方式:Tcp是OMNeT++的本地实现;TcpLwip模块封装了lwIP TCP协议栈;TcpNsc模块封装了网络模拟库。
- Network layer protocols 网络层协议与传输层协议和网络接口相连。它们通常被建模为复合模块。Ipv4NetworkLayer用于IPv4,Ipv6NetworkLayer用于IPv6。Ipv4NetworkLayer模块包含几个协议模块。Ipv4、Arp、Icmp和Icmpv6。
- Network interfaces 网络接口由复合模块表示,在有线情况下,它与网络层协议和其他网络接口相连。它们通常被建模为包含队列、分类器、MAC和PHY协议的独立模块的复合模块。
- Link layer protocols 链接层协议通常是在网络接口模块中的简单模块。一些协议,例如IEEE 802.11 MAC,由于协议的复杂性,被建模为一个复合模块本身。
- Physical layer protocols 物理层协议是复合模块,也是网络接口模块的一部分。
- Interface table 接口表维护着网络节点中的网络接口集(如eth0、wlan0)。接口是在网络接口的初始化过程中动态注册的。
- Routing tables 路由表维护相应网络协议的路由列表(例如,Ipv4RoutingTable用于Ipv4)。路由是由自动网络配置器或路由协议添加的。网络协议使用路由表来找出数据报的最佳匹配路由。
- Mobility modules 移动性模块负责在模拟场景中移动网络节点。即使网络节点是静止的,移动性模型对于无线模拟也是必须的。移动性模块存储网络节点的位置,这是计算无线传播和路径损失所需要的。不同的移动性模型被提供为不同的模块。网络节点用参数类型定义他们的移动性子模块,所以移动性模型可以在配置中改变。
- Energy modules 能量模块对能量存储机制、设备和软件进程的能量消耗、设备的能量生成以及关闭和启动网络节点的能量管理进程进行建模。
- Status 状态(NodeStatus)跟踪网络节点的状态(向上、向下等)
- Other modules 比如功能性模块 PcapRecorder
节点架构
在网络节点内,OMNeT++连接被用来代表协议之间的通信机会。在这些连接上发送的数据包和消息代表软件或硬件活动。
尽管协议之间也可以直接连接,但在大多数情况下,它们是通过调度器模块连接的。调度器(MessageDispatcher)是小型、低开销的模块,它允许协议组件以一对多和多对多的方式连接,并确保从一个组件发送的消息和数据包最终被传递到正确的组件。调度器不需要手动配置,因为它们使用发现和窥视数据包。
在预先组装好的节点模型中,调度器允许任意的协议组件直接对话,也就是说,不仅仅是与相邻层的对话。
自定义定制节点
内置的网络节点被编写为尽可能的多功能和可定制。这可以通过几种方式实现。
- Submodule and Gate Vectors
一种方法是使用门向量和子模块向量。向量的大小可以来自参数,也可以由网络节点的外部连接数量得出。例如,一个主机可以有任意数量的无线接口,它将自动拥有与连接到它的以太网设备数量一样多的以太网接口。
例如,主机的无线接口是这样定义的。
wlan[numWlanInterfaces]: <snip> // wlan interfaces in StandardHost etc al.
numWlanInterfaces 是模块参数,默认值是0或1(对于比如 StandardHost and WirelessHost是不同的)。为了配置一个host具有两个接口,可以在.ini文件中如下配置:
**.hostA.numWlanInterfaces = 2
- Conditional Submodules
不是向量的子模块通常是有条件的。例如,主机中的TCP协议模块是以hasTcp参数为条件的。因此,要禁用主机中的TCP支持(默认情况下是启用的),使用以下ini文件行。
**.hostA.hasTcp = false
- Parametric Types
另一种经常使用的定制方式是参数化类型,也就是说,一个子模块(或一个通道)的类型可以作为一个字符串参数指定。几乎所有内置节点类型中的子模块都有参数化类型。例如,TCP协议模块是这样定义的。
tcp: <default("Tcp")> like ITcp if hasTcp;
tcp子模块的typename参数默认为默认实现。要使用另一种实现,请在ini文件中添加以下一行。
**.host*.tcp.typename = "TcpLwip"
# use lwIP's TCP implementation
具有参数化类型的子模块向量的定义不使用模块参数,以允许元素具有不同的类型。一个例子是如何在主机中定义应用程序。
app[numApps]: <> like IApp;
// applications in StandardHost et al.
然后应用可以用以下方式加入:
**.hostA.numApps = 2
**.hostA.apps[0].typename = "UdpBasicApp"
**.hostA.apps[1].typename = "PingApp"
- 继承
继承可以用来从现有的节点类型中衍生出新的、专门的节点类型。一个派生的NED类型可以添加新的参数、门、子模块或连接,并可以将继承的未分配的参数设置为特定的值。
module WirelessHost extends StandardHost
{
@display("i=device/wifilaptop");
numWlanInterfaces = default(1);
}
定制网络节点
尽管有许多预组装的网络节点和一些可用的定制选项,但有时从头开始建立一个网络节点会更容易。
这个网络节点已经包含了一个可配置的应用程序和几个标准协议。它还演示了如何使用数据包调度机制,这对于以多对多关系连接多个协议是必需的。
module NetworkNodeExample
{
parameters:
gates:
inout ethg; // ethernet interface connector
input radioIn; // incoming radio frames from physical medium
submodules:
app: <> like IApp; // configurable application
tcp: Tcp; // standard TCP protocol
ip: Ipv4; // standard IP protocol
md: MessageDispatcher; // connects multiple interfaces to IP
wlan: Ieee80211Interface; // standard wifi interface
eth: EthernetInterface; // standard ethernet interface
interfaceTable: InterfaceTable;
connections: // network node internal connections
app.socketOut --> tcp.appIn; // application sends data stream
app.socketIn <-- tcp.appOut; // application receives data stream
tcp.ipOut --> ip.transportIn; // TCP sends segments
tcp.ipIn <-- ip.transportOut; // TCP receives segments
ip.queueOut --> md.in++; // IP sends datagrams
ip.queueIn <-- md.out++; // IP receives datagrams
md.out++ --> wlan.upperLayerIn;
md.in++ <-- wlan.upperLayerOut;
md.out++ --> eth.upperLayerIn;
md.in++ <-- eth.upperLayerOut;
eth.phys <--> ethg; // Ethernet sends frames to cable
radioIn --> wlan.radioIn; // IEEE 802.11 sends frames to medium
}
最后
以上就是糟糕航空为你收集整理的OMNET++学习(Network Node)的全部内容,希望文章能够帮你解决OMNET++学习(Network Node)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复