The ONE v1.41 - 自述文件
=====================
The ONE是一个机会网络环境模拟器,
提供强大的移动轨迹的生成工具,
用不同的路由协议来模拟消息转发实验,
可观察实时的模拟交互情况和实验结果。
快速启动
===========
编译
---------
你可以从源代码中找到一个compile.bat脚本进行编译。
可以在包含JDK6或以上版本的Unix/Linux、Windows上
运行。
如果你想使用Eclipse来对the ONE进行编译,1.1.0版本开始,你需要
在build path中引入几个jar包。
这些jar包包含在lib文件夹中。
在你的Eclipse中加载the ONE项目之后,按照下面的步骤引入这些包:
从菜单选择: - >Project -> Properties -> Java Build Path
转到“Libraries”标签
点击“Add JARs...”
选择“lib”文件夹下的“DTNConsoleConnection.jar”文件
以同样的方式新增“ECLA.jar”
现在,Eclipse应该无差错地编译了。
运行
-------
the ONE可以直接用文件夹下的脚本来运行:one.bat(Windows)或one.sh
(Linux / Unix操作系统)。下面的例子假设你使用的Linux/Unix脚本。
Synopsis(大纲):
./one.sh [- b runcount] [conf-files]
Options(选项):
- b是the ONE的批处理模式。不会启动图形界面,但是会生成
程序运行的相关信息。
这个模式必须设置一个运行次数的参数(这里冒号是必须的):
比如2:4表示运行2,3,4
详细情况可以看下文的“Run indexing”。
Parameters(参数):
配置文件:模拟程序通过配置文件来确定从哪里读取相关参数。
可以设置任意个数的配置文件,读取的时候是根据命令行里的顺序来读的。
如果几个配置文件里有同一个参数,后读取的参数会覆盖之前的值。
Configuring(配置)
===========
所有模拟参数都以配置文件的形式给出。这些文件
是普通的txt文本文件,其中包含若干键值对。
变量的语法与形式是这样的:
Namespace.key = value (命名空间.关键字=值)
也就是说,关键字总是有一个命名空间和一个点号的前缀,
然后是关键字的名称。键和值之间用等于符号隔开。
命名空间以大写字母开头,命名空间和关键字都区分大小写。
命名空间的定义在一定程度反应了它所影响的仿真环境。
往往命名空间等于它所读取的类名,
尤其对于下面我们所提到的移动模型、报表、路由算法来说。
数字值使用'.'号作为十进制的小数点分隔符,
后缀可以有公斤kilo (k) mega (M) giga (G)等。布尔设置接受“ture”,
“false”,“0”和“1”值。
许多设置定义外部数据文件的路径。该路径可以是相对
或绝对的,但不管是在Unix还是在Windows环境里,分隔符都
应该是'/'。
有些变量是一个用逗号分隔开的多个值,他们的语法是这样的:
Namespace.key =value1, value2, value3, 等
运行索引的语法是这样的:
Namespace.key = [run1value; run2value; run3value;等]
即所有的值在括号内并且不同的运行值用分号隔开。
每个值也可以用一个逗号分隔。
如需了解更多的运行索引信息,请转到第“Run indexing(运行索引)”。
设置文件可以包含注释。注释行必须以“#”开始。
有些值(目前主要是脚本和报表名)支持“变量填充“。
使用此功能,您可以动态地用设置好的值来填充脚本值
当使用运行索引时特别有用。
只要把设定好值的关键字名字前后都用两个百分号(%)引起来就可以了
这些占位符
表示了当时的配置文件里对这些就是所赋的值。
详细情况请看snw_comparison_settings.txt中的一个例子。
文件“default_settings.txt”,只要存在这个文件,它始终会被读为一个配置文件
它可以定义一些公用的值,
之后的配置文件里若有同一个关键值,会覆盖default_settings.txt里面的值
运行索引 (Run indexing)
------------
运行索引提供的功能是,使您能够用一个配置文件,
运行一个批量的不同配置的程序。
就是说,你可以用前面的语法定义一个序列的设置值,
这些值会在这一批次的不同次运行里分别调用不同的值。
例如,如果你要运行的五个不同的随机数发生器模型,
可以设置如下变量:
MovementModel.rngSeed = [1; 2 ;3 ;4 ;5]
现在,如果您用下面的命令来运行程序:
./one.sh - b 5 my_config.txt
程序会首先使用种子1(运行指数0)来运行,
然后又运行种子2,等……。请注意,您必须使用批处理模式运行它(- b选项)如果
要使用不同的值。如果没有-b指令,默认的图形化模式运行的是第一个参数。
循环运行指标:使用的值是索引值(runIndex%
arrayLength)。
可以轻松运行一系列的参数值:比如
key1 = [1; 2]
key2 = [a; b; c]
设置运行指数为6,你会得到前面两个值的所有6个排列
(1,a; 1,b; 1,c; 2,a; 2,b; 2,c;)。
这里请确保所有数列的最小公因子是1,一些数对会成对运行(更新)
Movement models移动模型
---------------
移动模型管理仿真环境里的节点移动。
他为每个节点提供坐标,速度和停留时间。
the ONE里初始时有5个移动模式:random waypoint, map based movement, shortest
path map based movement, map route movement 和external movement.。
除了external movement,各模型的移动速度、停留时间都是可以配置的。
设置一个最大值和最小值后,模型会自动为节点分配这个范围里的一个随机值。
同样也适用于停留时间。
external 模型的速度和时间来自外部给定的数据。
随机点移动模型(RandomWaypoint):
在仿真区域里随机选择一个坐标,
节点以一个衡定的速度移动到指定坐标,停顿了一会儿,
然后随机获取一个新的目的地,这种情况持续下去。
总的来说节点就是以这种z形路径在移动。
基于地图的移动模型:
节点必须在预定义的路径上移动。
道路有不同种类,每种都可以为其定义一个或多个节点组,
比如,汽车是不能在人行道上行驶的。
基本的基于地图的移动模型(MapBasedMovement):
初始时,节点位于相邻的两个地图元素(通过道路相通)之间,
节点可以从一个点移动到另一个点。
当节点到达相应的点之后,它随机选择下一个目的点(相邻的),
但一般不会选择刚才的移动过来的点,除非那是唯一的选择。
每当节点移动了10-100次以后,会小歇一下,再开始之后的移动。
现有一个改进一点的版本(ShortestPathMapBasedMovement):
用Dijkstra最短路径算法寻找去往目的节点的路径。
节点到达目的地,并停留了一段时间之后,
节点选择地图一个随机点作为新的目的地。
对于最短路径移动模型来说,地图数据还包含了兴趣点(Points Of Interest,POIs)。
POI隶属于某个POI组并且可以配置,移动模型可以配置成赋一个POI值,而不是简单的
随机的选择一个地图点作为目的地。
可以有不限个数的POI组,并且每个组可以包含任何个数的兴趣点。
兴趣点有分组,节点也有分组,不同节点组到时不同兴趣组的可能性不同。
兴趣点可以用来建模,比如商店、餐馆、旅游点。
基于路径的移动模型(MapRouteMovement)
节点按照特定的路径移动,比如bus和轨道交通。
路径无需定义,只需要定义路径的停靠点,节点在这个路径上的
点与点之间移动时使用最短路径,在停靠点上的留时间可以配置。
所有的移动模型都可以决定何时节点处于活动状态(移动和可连接状态),
除了external movement模型外,所有模型都给出了多样的仿真间隔时间,
相应的节点组里的节点只有在这个特定的时间里才是活跃的。
所有基于地图的模型都通过一个数据文件来获得地图数据,这个数据文件
用一个通用文本格式来格式化(Well Known Text,WKT)。
地图解析器可以识别LINESTRING和MULTILINESTRING指令。
地图中的POINT元素,比如POIs信息,也是可以支持解析的。
在LINESTRING和MULTILINESTRING中,相邻点对用来生成一个路径(最小路段单元),
而十字路口是两个这种路径的交点。
WKT文件可编辑,并且可以从真实的地图系统(GIS)程序生成。
仿真环境中使用开源的OpenJUMP来编辑地图。
不同的地图定义取决于存储路径的不同的文件。
兴趣点简单地由WKT的POINT指令来定义,POI组通过存储所有属于这个组的POIs来定义。
所有的兴趣点都必须是地图数据的一部分,以便于使用路段(path)。
路径(route)上的站点用LINESTRING来定义,
并且路径穿越顺序是按照LINESTRING上定义的顺序的。
一个WKT文件可以包含多条路径,
这些路径按照在文件中出现的顺序给点(看不懂)。
在实验中,外部模型(ExternalMovement)从外部文件中读取时间戳节点
的位置,并以此为依据控制节点的移动。
欲了解详细信息,请参见input包里的ExternalMovementReader类里的格式。
工具文件夹中,有一个脚本(名为transimsParser.pl),
是一个合适的实验脚本。
“movementModel”参数的设置定义了每种节点组所使用的移动模型。
这个参数的值必须是移动模型的包里一个可用的类名。
各模型通用的设置可以在MovementModel 类里读取,
各个模型特有的设置应该在各自的类里定义好。
详细情况可以参看相应java文档。
路由模块和消息生成
------------------------------------
路由模块决定仿真时消息怎么处理。
The ONE里提供了6种主动路由协议(First Contact, Epidemic, Spray and Wait,
Direct delivery, PRoPHET and MaxProp)和一种被动路由协议(用于外部路由仿真)。
这些主动路由单元是DTN中常见路由算法的实现,
具体情况可以参看路由包里的类文件。
被动路由显得非常独特,因为相对于DTN中相互协作的路由协议来说,
它不需要任何路由功能。
路由本身不做任何事情,直到有外部事件产生了命令。
模拟器会有一个类来执行一个事件队列接口,为上述路由方法提供事件()。
目前的版本包括两个可以作为消息事件源使用的类:
ExternalEventsQueue和MessageEventGenerator。
前者可以从一个手工生成的文本里读取事件,这个文本是一个脚本(
详见toolkit文件夹下的createCreates.pl脚本),
或者是把dtnsim2的输出到转换为合适的形式。
详细输入格式请见input包的StandardEventsReader类。
MessageEventGenerator是一个简单的消息生成器,
它规则地生成消息,生成规则可以配置,包括消息大小、消息源、缩等。
toolkit文件夹中包含一个实验性的用于解析dtnsim2的输出
的解析器脚本(dtnsim2parser.pl)(曾经有一个更强大的基于Java的解析器,
但它被丢弃,取而代之的是现在这个易于扩展的脚本)。
该脚本需要一些关于dtnsim2补丁的脚本,可以在toolkit/dtnsim2patches
文件夹下找到。
每个节点组通过设置“router”参数来选择路由协议。
通常各种路由算法之间互不相通,因此通常所有的节点组都
使用同一种路由算法。
报表
-------
报表单元用于生成仿真的各种数据,包括:仿真的概要数据、
连接和消息的详细情况、适于后期处理的文件,例如图表数据,
并与其他程序的接口相适应。
详见report包的相关类。
每个仿真都可以有任意个数的报表,具体个是“Report.nrofReports”这个参数的值。
报表类的名字用"Report.reportN"参数来定义,
在这里,N是一个整数,从1开始自增。
这个参数的值必须是report包中的一个合法类名。
报表的输出路径(可能在每个报表的“output”参数中覆盖)必须在
Report.reportDir这个参数中定义。
如果某个报表没有定义“output”,系统会给报表文件取
一个默认的名字:“ReportClassName_ScenarioName.txt”。
所有的报表有许多可配置的参数,可以使用ReportClassName.settingKey的语法来
设置。
详细情况请见Report类和一些特定的报表类。
主机分组 Host groups
-----------
主机组是一个主机(节点)组,它们使用共同的移动模型和路由算法。
不同的分组可以有不同的设置,因而不同组代表了不同的节点类型。
分组的基本信息可以在Group命名空间中定义,
而特定的分组里定义的相同参数可以覆盖Group里的设置。
组的命名示例:Group1,Group2等。
设置
------------
有大量的设置需要配置(你不说我也知道),本文并不能全部列出(没看懂)。
请见特定是报表的java文档,路由、移动模型文档。
也应该看看配置文件的示例。
下面列出的可能是比较重要的设置:
场景设置:
---
Scenario.name
场景的名字。所有的报表文件都默认带有这个前缀。
Scenario.simulateConnections
是否对连接进行模拟。如果你只关心移动模型
可以禁止这一项,使仿真更快。
但一般会把这一项设为可用。
Scenario.updateInterval
定义几秒更新一次。
这个参数的值越大,程序跑得越快,
但会丢失一些细节,一般把这参数的值设为0.1-2.0。
Scenario.endTime
仿真的结束时间。
Scenario.nrofHostGroups
分组的个数。
接口设置(定义节点可能有的接口)
---
type
接口是什么类()。
剩下的是特定于类的,举个例子:
transmitRange
接口的传输距离(单位是m)
transmitSpeed
接口的数据传输速度(byte/s)
主机组设置(在Group或GroupN命名空间中使用):
---
groupId
分组的标识。
在GUI和报表中显示的名称。主机的全名是
groupId + NetworkAddress。
nrofHosts
在这一组的主机数。
nrofInterfaces
这个分组里的节点所使用的接口数。
interfaceX
接口编号。
movementModel
这个组中的所有节点所使用的移动模型。
waitTime
等待时间间隔(秒)的最小和最大值(两个用逗号分隔的十进制数)。
定义节点会在这个地点停留的时间,
每个站点停留时间都是这个范围里的一个随机数。
默认值是0,0。
速度
移动速度的最小值和最大值。定义节点移动的速度有多快。
每个路段上和速度不同。
默认值是1,1。
的bufferSize
节点的消息缓冲区(字节)大小。当缓冲区满时,节点不能
接受更多的消息,直到它丢弃一些旧的消息。
router
用于路由消息。
必须是route包里的一个有效类名。
activeTimes
时间间隔(以逗号分隔的模拟时间元组:start1,end1,
start2,end2,...),在这个时间间隔里的节点是活跃的。
如果没有定义这个变量,默认所有节点都是活跃的时间。
msgTtl
由主机组产生的消息生存时间(分钟)。
节点每分钟都进行判断,丢失TTL到期的消息。
如果没有定义TTL,默认为无限大。
分组和移动模型的特定设置(仅适用于特定的移动模式):
pois
兴趣点指标和概率(逗号分隔的指数、概率元组:poiIndex1,poiProb1,poiIndex2,poiProb2,... )。
索引是整数,概率是小于1的十进制的值(0.0-1.0)。
这个设置定义了这个分组里的节点可以选择作为目标的
POI分组,并且给出了选择每个POI分组的概率。
例如,节点选择字段1所示的POI分组的概率是poiProb1,
如果这些poiProb的和小于1,则选择地图中余下的POI分组
作为下一个目的地的概率是1.0 - theSumOfProbabilities
这个设置只适用于
以ShortestPathMapBasedMovement为基础的移动模型。
okMaps
定义哪些地图元素类型适于这个分组(用逗号分开的整数)。
节点不会去往那些不适于这个分组的地图元素。
默认情况下,所有地图元素都是合适的。
这个设置可用于任何MapBasedMovent为基础的移动模型。
routeFile
对于MapRouteMovement移动模型,这个参数用来设置
存储路径信息的文件名字。
路径文件是LINESTRING WKT格式的指令,
每个顶点代表了一个停靠站。
routeType
对于MapRouteMovement移动模型,
这个参数定义了路径类型。类型可以是圆形(1)或乒乓来回形(2)。
详见movement.map.MapRoute类的细节。
移动模型设置:
---
MovementModel.rngSeed
所有移动模型的随机数发生器的种子。
如果每次运行时移动模型都用同一个种子,
那么每次仿真的路线都是一样的。
MovementModel.worldSize
仿真世界的大小(单位是m,用逗号分隔宽和高)。
PointsOfInterest.poiFileN
对于ShortestPathMapBasedMovement为基础的移动模型,
这上参数指定从哪个WKT文件读取POI坐标。
POI坐标用WKT指令来定义。
如(即poiFile1,poiFile2,...).
MapBasedMovement.nrofMapFiles
这个参数指定了设置文件里会有几个地图文件。
MapBasedMovement.mapFileN
第n个地图文件的路径。
配置文件中至少要有nrofMapFiles个独立的文件。
所有的地图文件都必须是LINESTRING、MULTILINESTRING的WKT格式的指令。
地图文件还可以有POINT的指令,但这些点是跳跃性的。
这样一同,地图文件就可以又包含地图信息,又包含POI信息。
默认情况下,地图坐是从左开始读的,所以左上角
所有的POI和路径文件都应该适应这种格式
以便于地图数据在整合的转换。
报表设定:
---
Report.nrofReports
这个参数指定要加载几个报表模块。
各个模块的名字形式是这样的:"Report.report1", "Report.report2", 等
下面的几个参数可以是针对通用的Report模块,
也可以是会对某个特定的报表。
Report.reportDir
定义报表的输出路径,可以的绝对路径,也可以是相对路径。
如果这个路径不存在,会生成相应的文件夹和文件。
Report.warmup
定义仿真的热身时间(从仿真开始到的秒数)。
在这个期间里,报表忽略各种事件。
各个报表模块的设置不一样,所以请详见不同模块的java文件。
事件生成器设置:
---
Events.nrof
定义模拟将加载的生成器的个数。
各个生成器有各自的命名空间,所以特定在设置都是在特有的命名空间里设置的。
EventsN.class
第n个事件生成器所加载的类的名字。
这个类是在input包里的一个合法类。
对于外部事件生成器,要使用“filePath”设置外部文件的路径。
这一点请详见input.StandardEventsReader class文档。
其他设置:
---
Optimization.randomizeUpdateOrder
这个参数设置节点的更新函数的顺序是不是随机的。
比如每个时间单元既要检测当前的节点坐标,又要更新路由模块。
如果这个参数是false,那么更新的顺序是网络地址的顺序,
如果是ture,每次调用的顺序都不一样(看不懂)。
图形用户界面
===
图形用户界面的主窗口分为三个部分。
主体部分是节点的运行现图、控制界面、信息界面。
右边框用来选择节点,
底框是运行Log和断点。
主体部分的顶层部分是用于仿真和图形用户界面控制。
第一个文字框显示了当前的仿真时间。
第二个文字框显示了运行速度。
接下来的四个按键分别是“暂停,步进,加速,加速到指定时间”。
按下“step(步进)”按键,则步进。
“forward”按钮可以省去中间无聊的仿真过程。
在这个时间仿真的运行速度设置为最大值。
接下来的“GUI update”按钮用来设置GUI的更新速度,
如果设置值为1,则GUI每“仿真秒”更新一次,
如果这个值设置为10,则每10个“仿真秒”更新一次界面。
负值会使仿真减速。
下一个参数是地图放大倍数,再下一个参数是截屏。
GUI的中间部分,即仿真视图,显示了节点的运行地图,
地图路线,节点标识,连接情况等。
所有节点都显示为一个小点,它们的通信范围都显示为一个绿色的圆圈。
节点旁边显示了节点的分组和网络地址。
如果一个节点携带了一个消息,每个消息都是一个绿色或者蓝色的小矩形。
如果多于10个消息,会有另一档的矩形出现,但着色是红色。
双击可看一个地域的特写。
滚轮可以放大或缩小。
主窗口的右边部分用来选择某个特定的节点。
选中节点后,主窗口下方会显示这个节点的详细信息。
再选中它所携带的某个特定消息,可以查看更多信息。
只需点击一个按钮,显示了主要部分的下半部分节点的信息。
“routing info”按钮可以弹出一个对话框,显示路由模块的详情。
选中的节点会变成红色,并且地图会变成以它为中心。
日志部分(最底部分)分为两半:control和log。
控制部分可以控制Log部分显示的信息类型。
“pause”选项可以使仿真在发生相应事件时断点。
日志部分会显示每个时间单元里的事件。
这个区域里的所有消息和节点都是按钮,
可以点击获得详细信息。
DTN2连接执行参考
==========================================
通过DTN2的外部收敛层接口,the ONE里的所有运行得可以
在DTN2路由里顺利递交。
如果DTN2兼容了the ONE,ONE可以以自问数据的形式
连接到dtn路由算法中。ONE可以自动配置相关连接、路径等参数
来执行仿真。
当dtnd收到一个bundle,ONE尝试用配置文件(见下面的dtn2连接配置文档)里的
正则式来识别这个bundle里的目的地址。
对每个相配的节点,the ONE会在仿真里生成一个相应的消息副本,并路由。
(下面几行看不懂了)
。
为了使这种情况可行,必须采取以下步骤:
1)DTN2必须编译和配置与ECL支持。
2)DTN2Events事件产生器必须配置为the ONE的一个事件类(可加载的)。
3)DTN2Reporter报表必须配置为ONE里的一个报表类。
4)DTN2连接配置文件必须被配置为DTN2.configFile
要启动模拟:
1)启动所有dtnd路由实例。
2)启动the ONE。
示例配置(2-4段)
---------------------------------
Events.nrof = 1
Events1.class = DTN2Events
Report.nrofReports = 1
Report.report1 = DTN2Reporter
DTN2.configFile = cla.conf
DTN2连接配置文件
------------------------------------
这个文件配置哪个ONE节点将会连接哪个DTN2的实例。
还定义了与节点相配的EID。
配置文件注释行以#开始
有效配置行的格式如下:
这些字段的含义如下:
nodeID:the ONE 中的节点id
EID regexp(正则式):如果某个包的EID可以和这个正则式匹配,
则这个包可转发到这个ONE节点上。
(见java.util.regex.Pattern)
dtnd host:将连接到这个节点的dtnd路由器名字或ip。
ECL port:dtnd路由器的侦听ECLAs的端口
console port:dtnd路由器的控制端口
例如:
#
1 dtn://local-1.dtn/(.*) localhost 8801 5051
2 dtn://local-2.dtn/(.*) localhost 8802 5052
已知问题
------------
对于DTN2连接相关的问题,you can contact [email protected]
-Quitting dtnd router instances connected to ONE will cause ONE to quit.
工具包 (Toolkit)
=======
仿真包包括一个名为“工具包”的文件夹,其中包含了
生成input的脚本和处理output的脚本。
所有(目前包括)脚本是用Perl编写的(http://www.perl.com/),
因此你跑这个脚本之前需要正确安装。
一些后期加工使用的是gnuplot(http://www.gnuplot.info/)来生成图形。
两种脚本都有Unix/Linux和Windows的免费版。
请自阅。
getStats.pl
此脚本可为MessageStatsReport -报表模块生成的统计数据
创建直方图。
"-stat"这一个指令用来定义统计报表文件的名字……
“-help”……
ccdfPlotter.pl
生成累积分布函数图……。
createCreates.pl
这个脚本大大简化了外部事件生成大批事件的麻烦程度……。
dtnsim2parser.pl和transimsParser.pl
这两个脚本把别的程序生成的数据转化为the ONE可识别的格式……。