加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

OMNET++生成网络拓扑图

(2013-12-02 17:19:21)
标签:

it

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

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

(1) 二叉树结构

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

  1. for i=0..2^height-2for j=0..2^height-2  
  2.       node[i].downLeft <--> node[j].fromUpper if j==2*i+1 
  3.       node[i].downRight <--> node[j].fromUpper if j==2*i+2 
  4.  

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

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

 

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


http://searun.iteye.com/upload/attachment/91325/334c8b25-eece-355d-85a6-bbc4b9d5912e.png

(2) 链结构

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

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

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


http://searun.iteye.com/upload/attachment/91323/5a3d406a-f3ca-307b-a6bf-b32476b85b5b.png
 (3)完全图

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

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

 

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

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

  生成的完全图如下所示。

 
http://searun.iteye.com/upload/attachment/91327/b53977b7-83f0-31ea-b036-8b86b7d466b3.png

(4)星形图

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

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

 
http://searun.iteye.com/upload/attachment/91333/fd7fd7de-d93f-3ec7-b9ee-465caa6b74e1.png

 

(5)网格网格拓扑结构

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

  1. for i=0..height-1for j=0..width-1  
  2.     node[i*width+j].down <--> node[(i+1)*width+j].up if i!=height-1 
  3.     node[i*width+j].right <--> node[(i*width+j)+1].left if j!=width-1 
  4.  

 

  生成的网格图如下。


http://searun.iteye.com/upload/attachment/91345/3fd9ea7d-29ad-3e81-95b8-629cf9999585.png

 

(6)蜂窝网络拓扑结构

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

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

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


http://searun.iteye.com/upload/attachment/91343/c1798761-c19b-3dde-a437-d90b54085861.png

(7)随机拓扑结构图

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

  1. for i=0..n-1for j=0..n-1  
  2.     node[i].g++ <--> node[j].g++ if i!=j && uniform(0,1)
  3.  

代码中connectedness用来控制节点的连接度,1表示连接所有的其他节点。减小此值将减少网络中出现的边数。一种随机图如下所示(connectedness=0.15)。
http://searun.iteye.com/upload/attachment/91341/e2db4ac4-43e5-3d69-a60c-c48e39ca8759.png

 

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

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有