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)。

 

上面介紹的是比較常見的一些網絡拓撲結構。在實際使用中,這些網絡拓撲在針對特定問題的簡化版本是可以的,但是當網絡變得複雜後,這樣的拓撲生成還是不行的。此時最好是採用專門的拓撲生成器,來生成網絡拓撲。另外,這裏介紹的都還是有線網絡中的拓撲結構,還沒有涉及到無線網絡的拓撲生成。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章