The ONE使用笔记:创建自定义网络拓扑

本文结合例子介绍两种自定义网络拓扑的方法。使用The ONE仿真器,网络拓扑通常由移动模型或者外部数据集生成。如果自己需要定制简单的网络拓扑,如two-way relay networks,那该怎么做呢。

1. Two-way relay networks

1.1 创建拓扑结构

无线双向中继网络(two-way relay networks)是一个很经典的例子,经常用来介绍网络编码在无线网络带来的优势。其拓扑结构如下:

image

鉴于节点数很少,可以通过将节点放置在指定的坐标来创建网络拓扑。假设传输半径为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

值得注意的是,hoststohosts两个设置选项,包含下限但不包含上限

2. X topology

2.1 创建拓扑结构

另一个无线网络编码的经典例子如下:

image

像这样的例子,设计各个点的坐标比较难。幸运的是,可以使用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为例,修改设置项,仔细观察并分析仿真结果。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

9 thoughts on “The ONE使用笔记:创建自定义网络拓扑

  • 2018年06月21日 星期四 at 10:20上午
    Permalink

    你好,想问一下这个创建组,还有相关配置是在哪里呢,就是在哪里运行配置的,cmd还是eclipse里面呢,刚刚安装上ONE,还不是太懂。能不能说一下具体的操作呢。

    Reply
  • 2018年06月21日 星期四 at 10:06上午
    Permalink

    你好,想问一下这个创建组,还有相关配置是在哪里呢,就是在哪里运行配置的,cmd还是eclipse里面呢,刚刚安装上ONE,还不是太懂。

    Reply
  • 2015年11月19日 星期四 at 07:26下午
    Permalink

    您好,在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 这一行就不能运行了呢

    Reply
    • 2015年11月20日 星期五 at 08:09下午
      Permalink

      你的理解是对的。你所说的“卡住”是什么意思,有什么错误提示信息吗?

      Reply
  • 2015年02月09日 星期一 at 04:59下午
    Permalink

    One的机制 确实非常奇怪最近 试着 固定 数据包大小 比如:3K-4K这样然后 固定 缓存 比如:1M 10M 20M 这样ttl设成无穷大数据集 用的infocom06试着跑那几个自带的算法发现 缓存大还好缓存小 one不停的遍历缓存数据包 删除最近刚接收的到最后 程序直接跑溢出了 没错 居然报错了 内存栈溢出= =!无语了!

    Reply
    • 2015年02月09日 星期一 at 06:20下午
      Permalink

      (1)关于内存溢出建议你修改one.sh文件,改为java -Xmx1024M (跟Java编译机制有关)。我之前也遇到这个问题,改后几乎没出现问题。(2)关于删包的问题我记得The ONE默认是删除最早一个到的(即FIFO)。为什么会是删除最近刚接收到的?

      Reply
      • 2015年02月09日 星期一 at 10:11下午
        Permalink

        对,我也有类似的经历:在bufferSize有限的情况下,不管采取什么的路由策略,只要消息复制转发少了,其delivery_prob随着TTL增加,必须会超过Epidemic。既然是删的最早的包,为什么会这样呢?

  • Pingback: The ONE使用笔记:目录 | Spark & Shine