本文参考Brite官网提供的用户手册,介绍拓扑生成器Brite的安装与使用,并提供一个简单的Python脚本将生成的拓扑文件转为ndnSIM可读取的文件。
版本信息如下:
Brite:Brite2.1
jdk:1.8.0_151
安装
下载
Brite官网:http://www.cs.bu.edu/brite
注意到Brite有C++和Java两种版本,前者不支持GUI可视化界面,所以一般使用Java版本。
安装
下载完成后将压缩包移动到用户根目录下并解压,得到BRITE文件夹:
~$ sudo cp ~/下载/BRITE.tar.gz ~
~$ gunzip BRITE.tar.gz
~$ tar xvf BRITE.tar
进入BRITE目录,编译并运行:
~$ cd BRITE
~/BRITE$ make java
~/BRITE$ ./brite
这里需要系统有Java环境,关于如何在Ubuntu中安装Java网上有大量的参考文档。本文用的是jdk1.8.0,其他版本未测试,Oracle官网下载可能比较慢,可以去国内镜像网站中下载,比如华为的jdk镜像https://repo.huaweicloud.com/java/jdk/。
然后就可看到Brite的应用界面:
使用
Brite可生成的拓扑类型(Topology Type)有四种:
- 1 Level: AS ONLY
- 1 Level: ROUTER(IP) ONLY
- 2 Level: TOP-DOWN
- 2 Level: BOTTOM-UP
我们只需要选择第二种ROUTER(IP) ONLY。在下方的参数设置里(Router Topology Parameters)也有很多可选参数,我们用到的是HS、LS和N,其中HS表示拓扑平面一侧的大小(与ndnSIM拓扑格式中节点的坐标有关),LS表示拓扑平面一侧对应面积的大小,N表示节点总数,N<HS*LS。其他参数选择默认值即可,具体含义如下:
Parameter | Meaning | Values |
---|---|---|
HS | Size of one side of the plane | int ≥ 1 |
LS | Size of one side of a high-level square | int ≥ 1 |
N | Number of nodes | int 1 ≤ N ≤ HS*HS |
Model | model id | int ≥ 1 |
alpha | Waxman-specific exponent | 0 < α < 1; α ∈ R |
beta | Waxman-specific exponent | 0 < β < 1; β ∈ R |
Node Placement | how nodes are placed in the plane | 1: Random, 2: HT |
m | Number of links per new node | int ≥ 1 |
Growth Type | how nodes join the topology | 1: Incremental, 2: Random |
BWdist | bandwidth assignment to links | 1: Const, 2: Unif, 3: Exp, 4: HT |
MaxBW, MinBW | min, max link bandwidth values | float > 0 |
比如我们设置HS=100、LS=10、N=500,输入Location为test,选择Formats为BTITE,然后点击Build Topology,在BRITE目录里会生成test.brite文件,即拓扑文件,内容如下:
节点:
链路:
导出文件格式
Brite导出的文件格式如下:
节点格式:
Field | Meaning |
---|---|
NodeId | Unique id for each node |
xpos | x-axis coordinate in the plane |
ypos | y-axis coordinate in the plane |
indegree | Indegree of the node |
outdegree | Outdegree of the node |
ASid | id of the AS this node belongs to (if hierarchical) |
type | Type assigned to the node (e.g. router, AS) |
链路格式:
Field | Meaning |
---|---|
EdgeId | Unique id for each edge |
from | node id of source |
to | node id of destination |
length | Euclidean length |
delay | propagation delay |
bandwidth | bandwidth (assigned by AssignBW method) |
ASfrom | if hierarchical topology, AS id of source node |
ASto | if hierarchical topology, AS id of destination node |
type | Type assigned to the edge by classification routine |
而ndnSIM中拓扑文件的格式为:
router
# node comment yPos xPos
...
link
# srcNode dstNode bandwidth metric delay queue
...
因此我们需要进一步转换。有两种转换方式,一种是将test.brite文件的内容复制到excel表格中然后手动调整,另一种是编写脚本自动调整。此处需要注意的是:(1)Brite拓扑文件中节点的xy坐标与ndnSIM拓扑文件中节点的xy坐标是相反的;(2)一般情况下我们只需要用到Brite生成拓扑的结构,链路信息可以在转换过程中再次指定,比如ndnSIM拓扑文件中链路的bandwidth、metric、delay和queue的信息可以最后统一设置。此处我们提供一个简单的Python转换脚本,将此文件放入BRITE目录中然后运行,可以得到适用于ndnSIM的拓扑文件test.txt。
import sys
if __name__ == "__main__":
bandwidth = "10Mbps"
metric = "1"
delay = "10ms"
queue = "20"
f_in = open("test.brite","r")
line = f_in.readline()
routers = []
links = []
routers_start = False
links_start = False
while line:
if line != "\n":
if "Nodes:" in line:
routers_start = True
links_start = False
elif "Edges:" in line:
routers_start = False
links_start = True
elif routers_start and not links_start:
items = line.split("\t")
routers.append(items[0]+"\tNA\t"+items[2]+"\t"+items[1]+"\n")
elif not routers_start and links_start:
items = line.split("\t")
links.append(items[1]+"\t"+items[2]+"\t"+bandwidth
+"\t"+metric+"\t"+delay+"\t"+queue+"\n")
line = f_in.readline()
f_in.close()
f_out = open("test.txt","w")
f_out.write("router\n")
f_out.writelines(routers)
f_out.write("\nlink\n")
f_out.writelines(links)
f_out.close()