本文介绍DTNHost都有些什么东西,想理解这一点,想想一台PC通常会包含哪些东西。本文先给出与DTNHost相关类的UML类图,接着介绍一个节点DTNHost包含些什么,即身份识别信息+移动模型+网卡+协议栈。
目录
1. 概述
1.1 UML类图
以DTNHost为中心的类图如下。可见,DTNHost与MovementModel
、MessageRouter
是一一对应的,与NetworkInterface
是一对多的关系。
1.2 DTNHost成员变量
//DTNHost private static int nextAddress = 0; private String name; private int address; private MessageRouter router; /*** 移动相关 ***/ private MovementModel movement; private Coord location; // where is the host (2D coordinates) private Coord destination; // where is it going (2D coordinates) private Path path; //the Path this node is currently traveling private double speed; private double nextTimeToMove; private List<MessageListener> msgListeners; private List<MovementListener> movListeners; private List<NetworkInterface> net; //Network interface of a DTNHost. Takes care of connectivity among hosts. private ModuleCommunicationBus comBus; //Intermodule communication bus
2. 身份识别信息
DTNHost身份识别信息,用一个静态整型变量标识系统的DTNHost id
,源代码如下:
private String name; private int address; //唯一标识DTNHost,类似于ip地址 private static int nextAddress = 0; //静态成员变量
3. 移动模型MovementModel
DTN下的节点是移动的,需要描述起始位置,移动路径;如何移动,移动速度,下次移动时间。每个节点只有一种移动方式,即DTNHost与移动模型一一对应。相关源代码如下:
private Coord location; //平面坐标下的位置(x,y) private Coord destination; //平面坐标下的位置(x,y) private Path path; //包含一系列坐标点, private List<Coord> coords private MovementModel movement; //移动模型,节点如何移动 private double speed; //移动速度 private double nextTimeToMove; //下次移动时间
4. 网卡NetworkInterface
一台PC可以装多个网卡(有线与无线),同理,DTN的节点也可以装多个网卡(一对多的关系),用于管理节点间的连接。
private List<NetworkInterface> net; //Network interface of a DTNHost. Takes care of connectivity among hosts. private ModuleCommunicationBus comBus; //总线? Intermodule communication bus
NetworkInterface
管理一系列连接,还包含一些传输属性的信息(理解成物理层,传输距离、传输速度等),相关源代码如下:
//NetworkInterface.java protected DTNHost host = null; //每个NetworkInterface关联一个DTNHost private int address; //network interface address protected String interfacetype; //在设置文件设置,如Group4.interface1 = btInterface(bluetooth interface) 或 highspeedInterface protected List<Connection> connections; //一个NetworkInterface有多具连接 private List<ConnectionListener> cListeners = null; //list of listeners protected double transmitRange; //传输范围 protected double oldTransmitRange; protected int transmitSpeed; protected ConnectivityOptimizer optimizer = null; //optimizing the location of possible contacts with network interfaces of a specific range private double scanInterval; private double lastScanTime; private ActivenessHandler ah; //activeness handler for the node group private int activenessJitterMax; //maximum activeness jitter value for the node group private int activenessJitterValue; //this interface's activeness jitter value
NetworkInterface
是超类,目前只有SimpleBroadcastInterface
(provides a constant bit-rate service, where one transmission can be on at a time)继承该类,NetworkInterface
管理一系列连接(一对多)。对于一个连接,需要刻画其连接两端的DTNHost
和NetworkInterface
,类似于IP地址+端口号。其UML类图如下:
5. 协议栈
有了网卡NetworkInterface
,还需要在其上面安装协议栈,方可通信。The ONE没有MAC层(被抽象了),网络层的路由层次关系如下:MyRouter
继承 ActiveRouter
继承 MessageRouter
。以EpidemicRouter
为例,其层次类图如下:
6. 监听器Listeners
监听器用于统计仿真结果,当节点变化时(如:节点移动或消息创建、转发、丢弃、删除),会触发相应的监听器更新仿真结果,详情可参考博文《The ONE使用笔记:深入源码理解消息监听器MessageListener》。DTNHost有两个监听器列表,如下:
private List<MessageListener> msgListeners; //消息监听器 private List<MovementListener> movListeners;//移动监听器赞赏
微信赞赏
支付宝赞赏
博主:
你好。请问在The ONE这个仿真器中,有没有写入DTN整个协议?学习了一段时间,感觉没有接触到类似于Bundle这个概念,我的理解是,这个仿真器是不是单纯模拟了延时容忍的这个场景?另外,请问这个仿真器能实现丢包率的设置吗?
仿真器是针对可延迟容忍的,但可以用于模拟其他网络,比如静态网络。
丢包率的话,得自己实现。
也就是说ONE没有写入完整的DTN协议?这样理解对吗?
SparkandShine你好,我的配置文件里设置了a,b两组,a为消息生成,b为消息目的节点,a使用接口一(假设3G),b使用两种接口,接口一为蓝牙,二为3G,但是仿真时,a与b之间不能通信,没有消息传递成功。我是想实现a,b间3G通信(消息下发);b,b间蓝牙通信(消息互传)。请问要怎么改才能使用两种接口?谢谢。
你这个问题很有意思。我也一度遇到过因为NetworkInterface不匹配,没有任何消息转发。
但你的需求比我更进一步,我不知道怎么解决。
谢谢你的回复
谢谢我的疑问已经解决了
请问怎么解决的这个问题
one 代码中DTNHost的update函数里调用了 –SimpleBroadcastInterface的update和MessageRouter的update,但是MessageRouter的update函数再跟踪下去是application的update函数,这里里面就是个空的,再也跟踪不下去了,请问下HOST里update里的路由更新这个地方的执行流程是这么走下去的哪?
很抱歉,因为休假,没有及时回复留言。你解决了就好。
Pingback: The ONE使用笔记:目录 | Spark & Shine