DTN仿真工具,one_1.5.0-RC1版本。芬兰人开发的一个专门用于DTN网络仿真的软件,用Java语言写的.里面有一个README.txt,很有用,不仅介绍了the ONE的一些性能,还有具体的安装以及示例。
DTN(delay-tolerant network)是从ad hoc,WSN(wireless sensor network)等自组织无线网络中抽象出来的一种网络模型.其典型特征是节点之间的链路间歇性中断且中断持续时间较长,以至于在任意时刻源节点和目的节点间可能不存在路径.
1 .report包:用来指定导出哪些类型的报表,具体可查阅readme.txt文档。
上图为这些类的继承关系,可在配置文件settings中配置,然后反射注入四类订阅者(由图可知为ConnectionListener,UpdateListener,MessageListener,ContactTimesReport四种接口的集合,定义在core包中)里面,然后在不同的事件发生后,对四个订阅者队列进行遍历(四个队列存放在类core.SimScenario中)
2 .routing包:用来指定消息的路由策略,按组指定。
上图为该包的继承关系,如果是研究算法 的同学,注重点就应该就是这个包了,如:DirectDeliveryRouter--只是简单地向最后接收者传递,不会传给别的结点中转,EpidemicRouter--洪范传输,还有1.3中新添的EnergyAwareRouter,就具有能源这个概念了,因为从现在DTN网络的利用来考虑,能源的消耗很关键。还有一些实现了现今比较流行的dtn路由算法的类
使用 :只需继承MessageRouter,覆盖对应的方法,然后加入自己的实现,再在settings配置文件中配置则可。
3 .movement包:用来指定结点的移动策略,亦为按组指定。
该包的继承关系,其中,大部分的移动策略(继承MapBaseMovement)都是基于给定的地图文件移动(还可以分为不同的路线类型,如人行道,汽车道等),也有部分为随机移动(RandomWaypoint和RandomWalk)和事件驱动(ExternalMovement和ExtendedMovementModel)
4 .input包:分为两个类型,一类为继承ExternalEvent的消息实体类,基本为每个消息对应一个实体
上图为各类消息实体类的继承关系
第二类为实现EventQueue接口的外部事件
其中DTN2Events为与DTNSim2的事件与The One事件的对接
5 .core包:包括一些核心的类和核心的接口等
具体执行流程应该是这样的:
a.读取配置文件。
b.初始化模拟环境,把report,routing等都配置好,并把host生成。
c.初始化模拟时间
d.检验当前时间是否小于模拟时间:是,则跳到e,否,则跳到f
e.模拟环境update,回到d
f.end
其中主要的流程在world.update方法里面,包括:触发事件(消息传输,丢包等),移动host等。
举个例子:如EpidemicRouter(即洪范路由算法),覆盖了父类的update方法
public void update() {
//super.update做了三件事:传输完成的终止传输,连接断开的终端传输,ttl小于零的丢包处理
super.update();
//检查
if (isTransferring() || !canStartTransfer()) {
return; // transferring, don't try other connections yet
}
//检查
// Try first the messages that can be delivered to final recipient
if (exchangeDeliverableMessages() != null) {
return; // started a transfer, don't try others (yet)
}
//问题在此
// then try any/all message to any/all connection
this.tryAllMessagesToAllConnections();
}
protected Connection tryAllMessagesToAllConnections(){
//检查
List<Connection> connections = getConnections();
if (connections.size() == 0 || this.getNrofMessages() == 0) {
return null;
}
//消息按优先级排序
List<Message> messages =
new ArrayList<Message>(this.getMessageCollection());
this.sortByQueueMode(messages);
//问题在此
return tryMessagesToConnections(messages, connections);
}
protected Connection tryMessagesToConnections(List<Message> messages,
List<Connection> connections) {
for (int i=0, n=connections.size(); i<n; i++) {
Connection con = connections.get(i);
//如果可以传输,就传输该消息,并返回传输的消息。
Message started = tryAllMessages(con, messages);
//如果传输了,则返回了
if (started != null) {
return con;
}
}
return null;
}
由上面的代码可看出,每次传输,只会向一个连接传输,但大家都知道,无线网络结点与结点的数据传输,应该是广播的(只是说应该),导师也是这样说的,但从代码可以看出,该软件是特意这样做的。所以就有矛盾了,所以也就怀疑其自己的结论了,但自己只是学软件的,对dtn网络只是有一点了解,所以也无从下手,只能是从代码角度去推断了。