One1.4实现的路由算法说明

 

②消息ttl到后,节点会删除消息

③消息传到一半,连接断开时,传向的节点会删除不完整的消息,即aborted。

 

http://hi.baidu.com/shan1989hnu/blog/item/4ff5e1d7c2306714a18bb7a8.html

DirectDeliveryRouter;  只有当碰到目的节点才会传送消息。

EpidemicRouter;       将消息传给碰到的每一个节点。

EpidemicOracleRouter; 这是个开挂的EpidemicRouter,一旦消息传送到目的节点,所有其他节点上的消息都会被删除。而且一旦有消息可以被传输,路由就会将这个消息瞬间传输完成。

EnergyAwareRouter;  考虑节点能量是有限的EpidemicRouter,需要设置节点的初始能量。每次发送消息,扫描节点时都会耗损能量。

FirstContactRouter;   将消息传送给碰到的第一个节点,并且传送完后,源节点删除消息。

以下从这个网址copy来

http://hi.baidu.com/shan1989hnu/blog/item/4ff5e1d7c2306714a18bb7a8.html

MaxPropRouterMaxProp 利用路径历史信息对消息按照优先级排序转发消息,并且在网络内泛洪ACK(acknowledgement)以移除网络中过时的信息,同时避免同一数据包被同一节点接收两次。

MaxPropRouterWithEstimation:利用历史信息和估算方法的路由。

PROPHET(probabilistic routing protocol using history of encounters and transitivity)是一种基于概率策略的路由协议,利用节点间相遇(encounter)的历史信息和传递性(transitivity)来选择下一跳节点。

ProphetRouterWithEstimation:基于概率和估算方法的路由策略。

SprayAndWaitRouter:由两个阶段组成:SPRAY 阶段和WAIT 阶段.SPRAY 阶段,源节点要传输的消息被复制为,并转发到个不同的中继节点;WAIT阶段,L 个中继节点各自进行直接传输(direct transmission),直至把消息传输至目的节点

 One1.4在包routing下定义了几种路由算法的实现。超类MessageRouter.java中定义了具体路由算法的实现所必须的方法集合,通过在继承自MessageRouter.java的类中重写而实现不同的路由算法。这些方法有:

(

这里顺便说明几个重要的成员变量:

 /** Setting value for random queue mode 为随机队列模式设置值*/
 public static final int Q_MODE_RANDOM = 1;
 /** Setting value for FIFO queue mode 为先进先出队列模式设置值*/
 public static final int Q_MODE_FIFO = 2;

/*这里说明下,消息队列有两种方式:一种是先进先出;一种随机队列方式,即每次发送消息后,都将消息的顺序(也即消息在数据结构的排列次序)打乱,以模仿消息发送的随机性*/

 

/** applications attached to the host 连接到本机上的主机集合*/
 private HashMap<String, Collection<Application>> applications = null;

)

//用来更新本机与其他主机传输状态,在每种路由算法的类中都会被重写,是路由实现的核心方法
public void update(){

//两个循环遍历所有有连接的主机对
  for (Collection<Application> apps : this.applications.values()) {
   for (Application app : apps) {
    app.update(this.host);
   }
  }
 }

//传输消息,注意这里默认的是传输消息的副本

public void sendMessage(String id, DTNHost to) {... }

//改变连接状态

public abstract void changedConnection(Connection con); 

//获取消息

protected Message getMessage(String id)  {... }

//判断消息是否存在

protected boolean hasMessage(String id)  {... }

//消息已经被目的主机接收时,返回真

protected boolean isDeliveredMessage(Message m) {... }

//获取该路由下的消息集,需要注意的是,如果在该消息集在使用时会存在删除的情景,那么消息集在使用时应该用其拷贝,以防止发生同时修改异常

public Collection<Message> getMessageCollection() {... } 

//获取该路由下的消息数目

public int getNrofMessages() {... } 

//获取缓冲区大小

public int getBufferSize() {... } 

//获取可用缓冲区大小

public int getFreeBufferSize() {... }

//获取主机

protected DTNHost getHost() {... }

//发送消息

public void sendMessage(String id, DTNHost to) {... }

//获取准备就绪的传送消息,在超类中默认是所有都不可传输,子类中需根据算法需要来重写

public boolean requestDeliverableMessages(Connection con) {
  return false; // default behavior is to not start -- subclasses override
 }

//接收消息,超类中默认在任何时候都接收,子类在实现时根据自己的算法重写

public int receiveMessage(Message m, DTNHost from) {

  ...
  return RCV_OK; // superclass always accepts messages
 }

//设置消息为“已传输”,需要注意的是,只有消息在成功传输给下一个节点后,才设置此状态

public Message messageTransferred(String id, DTNHost from)  {... }

//向消息的发送端的缓冲区写入一个消息,如果缓冲区中存在两个同名的消息,则根据主机ID来区分

protected void putToIncomingBuffer(Message m, DTNHost from) {
  this.incomingMessages.put(m.getId() + "_" + from.toString(), m);
 }

//从消息的发送端的缓冲区删除一个消息

protected Message removeFromIncomingBuffer(String id, DTNHost from) {
  return this.incomingMessages.remove(id + "_" + from.toString());
 }

//判断指定消息是否为当前到来的消息

protected boolean isIncomingMessage(String id) {
  return this.incomingMessages.containsKey(id);
 }

//向缓冲区中加入一个消息

protected void addToMessages(Message m, boolean newMessage) {... }

//从缓冲区中删除一个消息

protected Message removeFromMessages(String id) {... }

//消息传输终止函数

public void messageAborted(String id, DTNHost from, int bytesRemaining) {... }

//创建一个新消息

public boolean createNewMessage(Message m) {... }

//删除一个消息

public void deleteMessage(String id, boolean drop) {... }

//此函数用于将给定的消息集合重新排序

@SuppressWarnings(value = "unchecked") /* ugly way to make this generic */
 protected List  sortByQueueMode(List list) {... }
 //消息比较函数,为上面的排序算法服务

protected int compareByQueueMode(Message m1, Message m2) {... }

//获取路由信息

public RoutingInfo getRoutingInfo() {... }

//添加新的连接主机

public void addApplication(Application app) {... }

//获取连接主机集合

public Collection<Application> getApplications(String ID) {... }

 

转载于:https://my.oschina.net/liyong1689/blog/53485

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值