1.1 ONE机会网络仿真平台
ONE(The Opportunistic Network Environment simulator)[i]是专门为延迟容忍网络仿真所设计的仿真软件,由芬兰赫尔辛基大学的Ari Ker?nen and J?rgOtt等人利用Java编程语言开发的,在Windows、Linux和MacOS上都可以编译运行。ONE是使用开源协议GPL v3(General Public License)发布的,只要遵循GPL v3协议,就可以对ONE的源代码进行任意修改和免费使用。跨平台运行和开源发布方式使得ONE比较流行。2011年1月31日,ONE发布了1.4.1版,本文实验就是基于ONE平台的。ONE实现了多种DTN路由算法,包括DirectDelivery、FirstContact、Epidemic、Prophet、Spray andWait、MaxProp等。ONE支持多种场景的模拟,如城市街区场景和Ad Hoc场景,其节点种类包括行人、汽车和公车等。除了星际网络,ONE几乎可以进行其他各种复杂场景的模拟。ONE自带多个场景配置文件示例,其配置文件内的参数含义清楚明白,一目了然,很容易上手。其图形界面也很直观,使用便捷。
1.1.1 ONE的组成模块
ONE主要包括这些组成模块:application、core、gui、gui.playfield、input、interfaces、movement、movement.map、report、routing、routing.maxprop、routing.shcedule、test以及ui等。其功能介绍如下:
Application模块仅含有PingApplication类,就是简单的Ping程序,用于检测ONE是否工作正常。
Core模块包含了ONE的核心。其定义了DTN的节点类DTNHost、节点传输的消息类Message、处理节点之间的连接的类Connection、网络接口类NetworkInterface、ONE设置文件处理的类Settings和SettingsError、DTN场景布局的类SimScenario和World、仿真计时器的类SimClock、仿真实验的主类DTNSim等。DTNSim是所有仿真开始的地方。SimScenario是每一轮模拟的具体场景布置,其根据每一轮的配置参数创建所有的场景节点并设置场景的所有的全局参数。
Gui模块包含了GUI界面主窗口类的管理DTNSimGUI、MainWindow和信息面板等类。
Gui.playfield模块用于主窗口正中间部分的地图和节点绘制,实时地根据仿真情况绘制每个节点的分布和状态。其中包含了MapGraphic、MessageGraphic、NodeGraphic、PlayField、ScaleReferenceGraphic等几个主要的基类以及相关的类。
Input模块包含仿真事件的生成、删除、处理的类。 Interfaces模块包含仿真中连接接口处理的类。
Movement模块包含了仿真中各种类型节点运动的处理和基于地图路径运动的处理的类。有负责公交车运动处理的类BusMovement及其基类MapRouteMovement,处理小汽车运动的类CarMovement及其基类MapBasedMovement,处理基本运动模型的MovementModel类,模拟行走的RandomWalk和RandomWaypoint类,处理运动路径的类Path,等等。
Movement.map模块是为城市街区地图运动模型服务的,主要有处理地图上的点的类MapNode,由地图上点组成的路由处理的类MapNode,处理Dijkstra寻路的类DijkstraPathFinder。
Report包含了所有的报告实验结果的类,负责实验结果汇报的主类是MessageStatsReport,还有其他一些相关的类。
Routing模块是处理路由的模块,除了Core模块,就属Routing模块重要了。所有的路由算法的实现、拥塞控制策略的实现都在这个模块完成。MessageRouter类是所有路由类的基类,包括很多数据包发送、接收等细节的实现。ActiveRouter是所有活动路由器的基类,仿真活动节点的路由,而PassiveRouter类主要是模拟网络中的不发包的假路由节点。从ActiveRouter派生的类就是实现各种DTN路由算法的类:DirectDeliveryRouter、FirstContactRouter、EpidemicRouter、ProphetRouter、SprayAndWaitRouter、MaxPropRouter等。
Routing.maxprop模块是为MaxProp路由算法专门开发的模块。
Routing.schedule: 此模块主要完成路由算法中的调度工作,其主要包含了Schedule Dijkstra、Schedule Entry以及Schedule Oracle三个基类和相关的派生类。
UI模块包含仿真的Sim Text UI(命令行的批处理界面管理)和仿真的Sim UI(图形界面模式和批处理模式的基类)两个类。
Test模块专门用于测试ONE中各个模块中比较重要的类,比如上面介绍的类。要测试ONE各个模块是否各种正常,就调用AllTests类的函数进行测试。
1.1.2 ONE的运行模式
ONE有两种运行模式:图形界面模式和命令行批处理模式。图形界面模式比较直观,可以看到实时的仿真状况,如图2.6所示:
图 2. 1 ONE图形界面
图2.6上正中间的就是街区地图和节点运动状况。地图区域的上方是控制仿真开始、暂停等工具按钮。按钮左边的是仿真时间显示和仿真速率显示。在地图区域下方,左边是事件记录控制面板,右边是具体的事件记录,可以看到连接的建立、发包、丢包等。图形界面的右边的工具条是节点列表。图形界面一般用于仿真的试跑,看看ONE代码修改后是否运行正常等。图形界面下的仿真跑得比较慢,因为要绘图、实时呈现事件记录等,运行效率比较低。所以一般用图形界面试跑,而大批量的仿真实验使用命令行批处理模式的。
一般在代码编译并试跑完成后,大批量的实验就用批处理模式来跑。在命令行下,进入ONE的文件夹,运行命令:
one.bat -b 10 default_settings-CityRoad-DropOld-1M-10M.txt
one.bat是ONE平台启动的脚本,-b 10这两个参数指出用批处理模式跑10轮仿真,default_settings-CityRoad-DropOld-1M-10M.txt是10轮仿真采用的配置文件。批处理模式如图2.7所示:
批处理模式每分钟更新一下信息,更新的信息中,第一个是现实世界的计时,以秒为单位,第二个是仿真世界的计时,以秒为单位,最后一个是仿真运行的速率,就是现实世界1秒钟内仿真世界运行了多少秒。跑完一轮仿真,会自动将仿
真的结果写入设置好的文件中,然后进行下一轮仿真。
批处理的配置文件如default_settings-CityRoad-DropOld-1M-10M.txt,是需要提前配置好的,如果不配置好,实验结果文件只会有一个,就是最后一轮的实验结果。所以必须进行特定的设置。比如观察缓存变化,那么配置文件需要修改两处:
Scenario.name = default_scenario-CityRoad-DropOld-%%Group.bufferSize%% Group.bufferSize = [1M;2M;3M;4M;5M;6M;7M;8M;9M;10M]
其中%%Group.bufferSize%%就是将缓存大小也加入到结果文件名中,这样不同缓存大小的仿真,其实验结果文件不同了,并且会按照缓存大小自动排好。
如果是改变场景大小来跑仿真,那么需要注意数据包生存时间上限的设置,要根据最大场景合适的数据包生存时间上限,例如:
Scenario.name = AdHoc-DropOld-%%MovementModel.worldSize%% MovementModel.worldSize =
[500,500;1000,1000;1500,1500;2000,2000;2500,2500;3000,3000;3500,3500;4000,4000]
# Message TTL of 240 minutes (4 hours) Group.msgTtl = 240
240分钟就是根据4000m×4000m场景来设置的。
如果改变了节点个数,那么同时需要设置产生事件的节点范围: Scenario.name = AdHoc-APE-%%Group.nrofHosts%% Group.nrofHosts = [10;15;20;25;30;35;40;45;50]
Events1.hosts = [0,9;0,14;0,19;0,24;0,29;0,34;0,39;0,44;0,49]
Events1.hosts一般是设置为 0, N-1 ,注意N是所有节点数目,上面是只有一组节点的情况,如果有多组节点,必须计算所有组的节点数的总和N 。
上面是介绍ONE批处理模式的细节处理,如果细节处理不好,可能仿真会出错,也可能找不到应该有的实验结果文件。
1.1.3 ONE的实验结果参数
ONE实验结果的主要参数如表2.1所示:
表 2. 1 ONE实验结果主要参数
参数 sim_time created started relayed aborted dropped delivered delivery_prob overhead_ratio latency_avg hopcount_avg 意义 仿真世界的总运行时间,单位:秒 仿真生成的不同的数据包总数 开始过的转发次数 实际完成的总转发数 被迫中断的转发次数数 总共的丢弃的数据包数目 成功到达目的地的包数目 网络交付率 网络开销比率 成功到达包的平均延迟,单位:秒 成功到达包的平均跳数 这些参数中,主要关注网络交付率、平均延迟、平均跳数和网络开销比率。网络交付率的计算公式为:
delivery_prob = delivered/ created(2.4)
网络开销比率的计算公式为:
overhead_ratio = (relayed - delivered) / delivered (2.5)
网络交付率是数据包的成功到达率,网络开销比率由包转发总数和包成功到达数二者决定,转发总数越大,网络开销比率越大,成功到达数目越大,网络开销比率约小。
i