本文结合例子介绍两种自定义网络拓扑的方法。使用The ONE仿真器,网络拓扑通常由移动模型或者外部数据集生成。如果自己需要定制简单的网络拓扑,如two-way relay networks,那该怎么做呢。
1. Two-way relay networks
1.1 创建拓扑结构
无线双向中继网络(two-way relay networks)是一个很经典的例子,经常用来介绍网络编码在无线网络带来的优势。其拓扑结构如下:
鉴于节点数很少,可以通过将节点放置在指定的坐标来创建网络拓扑。假设传输半径为10m,将节点A、R、B分别放置在(0, 0)
、(8, 0)
、(16, 0)
。值得注意的是,因为每个节点的坐标不一样,所以需要创建3个group。相关的配置如下:
## A -- R -- B Scenario.nrofHostGroups = 3 Group.nrofHosts = 1 Group.movementModel = StationaryMovement Group1.groupID = A Group1.nodeLocation = 0,0 Group2.groupID = B Group2.nodeLocation = 16,0 Group3.groupID = R Group3.nodeLocation = 8,0
1.2 产生消息
用MessageEventGenerator自动创建消息,关于MessageEventGenerator参考之前的博文《The ONE使用笔记:消息事件产生器MessageEventGenerator》。相关的设置如下(以节点A为例):
Events.nrof = 2 Events1.class = MessageEventGenerator Events1.interval = 4 Events1.size = 1k,2k Events1.prefix = M Events1.hosts = 0,1 Events1.tohosts = 1,2
值得注意的是,hosts
和tohosts
两个设置选项,包含下限但不包含上限。
2. X topology
2.1 创建拓扑结构
另一个无线网络编码的经典例子如下:
像这样的例子,设计各个点的坐标比较难。幸运的是,可以使用ExternalEventsQueue
将节点的连接情况读入。首先将节点的连接信息写入一个文件(如cross.dat
),如下:
0.0 CONN 0 2 up 0.0 CONN 0 3 up 0.0 CONN 1 2 up 0.0 CONN 1 4 up 0.0 CONN 2 3 up 0.0 CONN 2 4 up
这里,节点不断开,即整个仿真都保持建立。值得注意的是,节点的标号需要normalized,从0开始。
导入外部数据集,相关设置项如下,详情参观之前博文《The ONE使用笔记:导入不含节点位置的数据集》。
Scenario.simulateConnections = false Group.movementModel = StationaryMovement Group.nodeLocation = 0,1 Events3.class = ExternalEventsQueue Events3.filePath = nc/settings/5_settings_shigs/simple_scenario/cross.dat
2.2 产生消息
跟two-way relay networks一样,产生消息很简单,相关设置选项如下:
Events.nrof = 3 ## 0 --> 4 Events1.class = MessageEventGenerator Events1.interval = 5 Events1.size = 1k,2k Events1.prefix = M Events1.hosts = 0,1 Events1.tohosts = 4,5
3. 总结
简单的拓扑结构可以将节点放在相应的坐标,复杂的拓扑结构将节点的连接情况作为外部文件导入仿真器。
最后,分享一点个人经历。刚开始接触The ONE,不知道如何创建这些简单的拓扑结构。最近的仿真,不管我怎么调参数,结果总是很奇怪,难以解释。所以才想着,创建最简单的仿真场景,调整参数,观察结果,进一步了解仿真机理。才发现,用The ONE仿真器,不能想当然(比如上述的无线双向中继网络用xor编码需要3 emissions,然而在The ONE,却需要4 emissions),多么痛的领悟。
如果您刚刚接触The ONE仿真器,强烈建议您以two-way relay networks为例,修改设置项,仔细观察并分析仿真结果。
赞赏微信赞赏
支付宝赞赏
你好,想问一下这个创建组,还有相关配置是在哪里呢,就是在哪里运行配置的,cmd还是eclipse里面呢,刚刚安装上ONE,还不是太懂。能不能说一下具体的操作呢。
你好,想问一下这个创建组,还有相关配置是在哪里呢,就是在哪里运行配置的,cmd还是eclipse里面呢,刚刚安装上ONE,还不是太懂。
您好,在1.2这个环节,我是这么设置的:
Events.nrof = 1
Events1.class = MessageEventGenerator
Events1.interval = 4
Events1.size = 1k,2k
Events1.prefix = M
Events1.hosts = 0,3 (因为我搞了三个节点A,B,R)
Events1.tohosts = 1,2
但是我按照这个设置,一运行,到7点多秒的时候就卡住。
当我把Events1.tohosts = 1,2这一行删除,却可以正常运行了。
请问这是为什么呢? 在我删除 Events1.tohosts = 1,2 之前
我的理解是hosts 0,1,2 负责产生消息,目的节点是1. 不知我的理解是否正确。
为什么加上 Events1.tohosts = 1,2 这一行就不能运行了呢
你的理解是对的。你所说的“卡住”是什么意思,有什么错误提示信息吗?
One的机制 确实非常奇怪最近 试着 固定 数据包大小 比如:3K-4K这样然后 固定 缓存 比如:1M 10M 20M 这样ttl设成无穷大数据集 用的infocom06试着跑那几个自带的算法发现 缓存大还好缓存小 one不停的遍历缓存数据包 删除最近刚接收的到最后 程序直接跑溢出了 没错 居然报错了 内存栈溢出= =!无语了!
(1)关于内存溢出建议你修改one.sh文件,改为java -Xmx1024M (跟Java编译机制有关)。我之前也遇到这个问题,改后几乎没出现问题。(2)关于删包的问题我记得The ONE默认是删除最早一个到的(即FIFO)。为什么会是删除最近刚接收到的?
对 是最早的。。。
对,我也有类似的经历:在bufferSize有限的情况下,不管采取什么的路由策略,只要消息复制转发少了,其delivery_prob随着TTL增加,必须会超过Epidemic。既然是删的最早的包,为什么会这样呢?
Pingback: The ONE使用笔记:目录 | Spark & Shine