dtnsim2学习笔记

上传人:xzh****18 文档编号:46572718 上传时间:2018-06-27 格式:PDF 页数:9 大小:198.73KB
返回 下载 相关 举报
dtnsim2学习笔记_第1页
第1页 / 共9页
dtnsim2学习笔记_第2页
第2页 / 共9页
dtnsim2学习笔记_第3页
第3页 / 共9页
dtnsim2学习笔记_第4页
第4页 / 共9页
dtnsim2学习笔记_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《dtnsim2学习笔记》由会员分享,可在线阅读,更多相关《dtnsim2学习笔记(9页珍藏版)》请在金锄头文库上搜索。

1、1 Dtnsim2 代码笔记代码笔记 yanhc,2014.3.11 1. DTN MED平均等待时间计算公式平均等待时间计算公式 下面这段代码是在dtnsim2中的package protocolStack.globalKnowledge;下的contactschedule中,有一个计算MED时间的函数 /* Computes the MED metric assuming that time begins at startTime. */ public double getMEDWeight(double simTime) if (nextUpTime != null) throw new

2、 RuntimeException(“ContactSchedule is not closed“); double downSquaredSum = 0; double lastTime = 0; for (UpTime up : times) if (up.getTimeUp() != 0) assert up.getTimeUp() lastTime; double downTime = up.getTimeUp() - lastTime; assert downTime 0; downSquaredSum += downTime * downTime; lastTime = up.ge

3、tTimeDown();/仅仅统计down的时间长度 / Add the very last down time double downTime = simTime - lastTime; if (downTime 0) downSquaredSum += downTime * downTime; double ret = (double) (downSquaredSum / (2 * simTime) + contact.getLatency(); return ret; 2 在 example-simple-readme 中有下面情景 This scenario has four node

4、s: A, B, C, D. B and C are permanently connected to D. A B has a down interval of 40, and an up interval of 20 (MED = 13.3). A C has a down interval of 20, and an up interval of 5 (MED = 8). 对于 AB 之间的链路调度如下: 0 40 60 100 120 start up down up down 通过手动计算可以知道 0-40 期间平均等待时间为 40/2=20,而 40-60 期间平均等待时间是 0,

5、所以整个 60s的周期中平均等待时间为:20*(40/60)+0*(20/60)=13.3 上面函数中 downSquaredSum 统计了链路中断持续时间的平方,最后又除以 2 倍的 simTime,让人有点摸不着头脑,其实是这样的: downTime 2downTime simTime即在中断时间的平均等待时间乘以中断时间占整个时间的百分比。在 MEED 的硕士论文中提到了如何计算。 2. 如何运行如何运行dtnsim2 在 console 界面下进入到 E:NetworkONEEclipseprjdtnsim2 的 examples/simple 目录下,运行如下命令行: java -e

6、a -cp ././bin/lib simulator.Main -verbose 1 simple_MED verbose 冗长的、啰嗦的,Set the amount of logging output that should be generated 其中 ea 不知道什么意思,cp 表示查找类的路径,后面的-verbose 设置输出调试信息的数量,最后的simple_MED 表示要读取的配置文件,如下所示: 3 上述文件设定了带宽、延迟,什么时刻做什么工作,设置 node 类型、schedule 文件、运行文件,最后设置了输出统计数据 其中的 simple_Times 文件如下: 运行

7、完后,即可在该目录下生成 simple_stats 统计输出文件: Algo; Buffer_Size; Message_Size; Bandwidth; Latency; Total_Msgs;Delivered_Msgs; Deliv_Ratio; Avg_Time MED; 2000; 50; 10; 2; 2; 2; 100.00%; 26.50 如果是在 Eclipse 下运行的话,当前的路径是如下目录 E:NetworkONEEclipseprjdtnsim2 在设置 argument 参数时应该设置为:-verbose 1 examples/simple/simple_MED 4

8、 3. 程序解读程序解读 程序运行流程,simulator 包下有一个 Main,会读取运行参数: if (argsi.charAt(0) != -) / Until first line with specified time, all lines in input / will be interpreted immediately. (new InputReader(net, argsi).runInput(-1); 上面这个把 simple_MED 文件中0 之前的配置读取完毕 runInput 函数会对 simple_MED 文件进行解析,一句话一句话进行解析,语句分为注释#时间和命令

9、 public void runInput(double curTime) 比如 default_contact bandwidth = 10 latency = 2 这句话是对 contact 进行参数配置,是一个命令 会一步一步的测试各种命令: 测试是否是本地命令,看是否有 interpreter,下是否有 run_file cs = checkLocalCmds(line, curTime); 下一步测试 cs = line.execCommand();在 InputLine 类中 1) 测试网络层的命令,network.parseLocalCommand();有 network_ele

10、ment,traffic,stats,simulator,network_graph 等 2) 测试节点层的命令,parseNodeCommand();有 default_node 等 3) 测试 contact 连接的命令,parseContactCommand();,在 findContactsForCommand()下有 default_contact 在 contact,stat 类下都有 commandparser 方法,用于解析配置文件中的命令 运行到如下函数 fire 处时,将开始执行网络仿真,其实是开始执行0 后的语句命令或配置。 需 要 执 行receiver.receive

11、Event(this); , 其 中receiver定 义 为EventReceiver , 而EventReceiver 为一个接口类,找不到其接口实现函数? public class Event protected long seq = 0; 5 protected double time = 0; protected EventReceiver receiver = null; public void fire(Simulator net) if (receiver = null) return; receiver.receiveEvent(this); 经过调试发现执行的是 publi

12、c class InputReader implements EventReceiver public void receiveEvent(Event event) runInput(event.getTime(); 在 runInput 中会 simple_MED 文件内容,并按照其内容进一步读取其它文件,或执行相关命令。 消息发送 在 ProtocolStackNode 类下有 sendNewMessage 方法 4. 路径计算相关:路径计算相关: 路由模块的 routeForMsg(ProtocolStackMessage msg)方法会调用 topology.getRoute(msg)

13、; 接着,会调用 GKnowledgeTopologyHandler 类下的 getRoute(msg); 接着, 会调用此函数进行计算的初始化 lastRouting = new NetworkDijkstra(networkGraph(), parent, network.getCurrentTime(), forMsg); 接着,会调用 lastRouting.routeTo(ProtocolStackNode) forMsg.getDestNode();进行真正的路由计算 NetworkGraph,一个抽象类,定义了一些 Dijkstra 可能会用到的方法:获取邻节点、得到代价 Dij

14、kstraGraph,一个接口类,与 NetworkGraph 差不多 NetworkDijkstra,直接调用的父类 Dijkstra 的构造函数,这个主要是对 Dijkstra 计算进行一下初始化 routeTo(NodeType endPoint)该函数负责计算到 endPoint 的路径 该函数又调用了 computeShortestPath(endPoint);,此函数是 Dijkstra 计算所在地 下面的这种 HashMap,索引是节点,索引值是源节点到该节点的路径的信息,一种哈希映射 private HashMap routeInfoMap = new HashMap(); 6

15、 下面这个 GKnowledgeTopologyHandler 继承了抽象类 TopologyHandler GKnowledgeTopologyHandler extends TopologyHandler GKnowledgeTopologyHandler 类下有 getRoute 方法,此方法会新建 NetworkDijkstra 类,并调用routeTo 方法 在下面 RouteRoutingHandler 类下有 routeForMsg(ProtocolStackMessage msg)方法,此方法调用了 route = topology.getRoute(msg); Protoco

16、lStackNode 的方法 sendNewMessage 创建一个新的消息:msg = new ProtocolStackMessage(。destNode, dataLength); 然后,接收新消息:ret = acceptNewMessage(msg); 然后进入 RouteRoutingHandler 类下的 acceptNewOwnMessage 方法,新消息、自己产生 然后是 addMessage(msg),在这里会判断本地节点还有没有足够的足够的 buffer,如果有,那么加入buffer,至此,新消息已经产生 调用父母 parent 节点 ProtocolStackNode 的方法 notifyNewMessage,在这里会遍历所有的eventHandlers 的新消息到达通知, 通过这些又触发路由模块 RouteRoutingHandler 的 notifyNewMess

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号