OMNeT++下的网络拓扑结构创建

OMNeT++通过NED语言来对网络系统进行描述。NED语言中包含着对信道、模块、节点和网络的完整描述,可以参见OMNeT++参考文档的第三章。在实际的网络仿真中,总是会首先描述一些特定形状和特性的网络。一般说来,网络拓扑结构包括两种,一种是平面(flat)结构,另外一种是层次化(Hierarchy)结构。由于OMNeT++采用的是层次化的模块构建,所以层次化的网络拓扑可以通过平面的拓扑结构来生成。在这里,对常见的几种网络拓扑结构进行描述。更多的代码可以参见OMNeT++包中sample目录下的neddemo。

在构建平面拓扑结构的时候,主要考虑的是各个节点之间的关系。对于规则的拓扑结构来说,节点之间的连线是有关系的。在下面的描述中,主要的是对这种关系进行梳理。

(1) 二叉树结构

一个二叉树结构中的节点包含有三个接口,分别对应父节点和左右子节点。这里用fromUpper和downLeft、downRight来表示。对于高度为height的二叉树结构,其节点之间的关系可以表示如下。

for i=0..2^height-2, for j=0..2^height-2 {
      node[i].downLeft <--> node[j].fromUpper if j==2*i+1;
      node[i].downRight <--> node[j].fromUpper if j==2*i+2;
}

  这是OMNeT++中的另外一种表示方法(没有了if条件表达式)。

for i=0..2^(height-1)-2 {
    node[i].downLeft <--> node[2*i+1].fromUpper;
    node[i].downRight <--> node[2*i+2].fromUpper;
}

 

生成的拓扑结构如下所示。从图中可以看到,最终生成了一个二叉树结构。这里的节点并没有显示成从上至下的结构,而是系统自动采用了一种合适的方法来表达。如果需要修改的话,则还需要对接点的位置进行约定。可以参见NED的描述文件。


(2) 链结构

另外一种很常见的网络拓扑结构就是线性结构,就像一条链一样串起来。这种结构在OMNeT++中是很容易描述的。下面的代码这个实现。

for i=0..n-2 {
    node[i].right <--> node[i+1].left;
}

 生成的网络拓扑结构如下所示。



 (3)完全图

完全图是一个节点和网络中的所有节点都有连接。拓扑结构描述如下所示。

for i=0..(n-2), for j=(i+1)..(n-1) {
    node[i].g[j] <--> node[j].g[i];
}

 

  其中, node 表示节点,而这里的 g[] 表示门向量。这里通过二重循环将节点之间的所有接口都连接了起来。另外,这里采用了位置描述符来对网络进行描述,从而让整个网络成为一个环形。

@display("p=,,ring");

  生成的完全图如下所示。

 

(4)星形图

这种网络拓扑结构是所有节点通过一个中心节点连出去。这种网络的创建并没有什么特殊的地方,一般构建两类节点:中间节点和终端节点,然后将所有的终端节点和中心节点相连即可。

生成的拓扑结构如下所示。

 

 

(5)网格网格拓扑结构

这种网络拓扑结构也很常见。这种拓扑结构中的节点包含有四个接口,分别连接上下左右的节点。节点之间的连接关系如下所示。

for i=0..height-1, for j=0..width-1 {
    node[i*width+j].down <--> node[(i+1)*width+j].up if i!=height-1;
    node[i*width+j].right <--> node[(i*width+j)+1].left if j!=width-1;
}

 

  生成的网格图如下。


 

(6)蜂窝网络拓扑结构

这是上面网格拓扑结构的一个变种,一般可以用于蜂窝网路中。这里的节点最多包含有三个接口,其连接关系如下面的NED代码所示。

for i=0..num-1 {
    node[i].port++ <--> node[i+1].port++ if i<num-1 && i%(2*cols+2)!=2*cols;
    node[i].port++ <--> node[i+2*cols+1].port++ if i<num-2*cols-1 && i%2==0;
}
 

生成的拓扑结构图如下所示。


(7)随机拓扑结构图

有些时候需要随机生成网络拓扑结构,这在OMNeT++中是比较容易实现的。下面就是一种实现的方法。

for i=0..n-1, for j=0..n-1 {
    node[i].g++ <--> node[j].g++ if i!=j && uniform(0,1)<connectedness;
}

代码中connectedness用来控制节点的连接度,1表示连接所有的其他节点。减小此值将减少网络中出现的边数。一种随机图如下所示(connectedness=0.15)。

 

上面介绍的是比较常见的一些网络拓扑结构。在实际使用中,这些网络拓扑在针对特定问题的简化版本是可以的,但是当网络变得复杂后,这样的拓扑生成还是不行的。此时最好是采用专门的拓扑生成器,来生成网络拓扑。另外,这里介绍的都还是有线网络中的拓扑结构,还没有涉及到无线网络的拓扑生成。

 

 

 

你可能感兴趣的:(J#,UP)