TheONE消息转发流程分析

     TheONE全称为The Opportunistic Network Environment simulator,是一款Java平台的容迟网络仿真软件,本文采用一条纵线分析了TheONE中消息转发的流程。

   1. 消息转发的入口

跟踪发包流程最主要的是找到入口,ONENS2最大的区别在于:NS2是离散事件驱动的,而ONE采用的是周期更新即Update,如果把网络中的事件比喻成出门坐车,那么NS2像是打车,招手即停,而ONE是坐公交,公交车每隔一段时间来一班,这个时间间隔就是Update的周期,在default_setting.txt中定义为0.1秒。于是最先要找到的就是update函数。ONE核心的功能可以看作由两大部分组成,一是移动,二是消息转发,简而言之,前者根据移动模型确定下一时段各节点的位置坐标,后者根据接口和路由来决定节点是否应该收到一个消息。本文讨论的是消息转发流程,因此忽略节点移动部分,直接找到消息转发的入口。

DTNHostONE中最基本的类,它定义了一个节点(后文将节点与Host等同)的基本属性和基本功能,在DTNHost.java中的update()函数负责更新网络接口和路由。

 

    

    public void update(boolean simulateConnections) {

       if (!isActive()) {   //如果节点处于非激活状态,则不会执行后面的语句

           return      //可以将非激活状态想象成一个自私节点或者没电的传感器

       }

       if (simulateConnections) {

           for (NetworkInterface i : net) {

              i.update();       //更新所有的接口

           }

       }

       this.router.update();    //更新路由

    }

可以看出在update()中先更新了接口,后更新了路由,原因是路由的工作需要建立在接口的基础之上。本文也先说接口,后说路由。

2. 维护有效的连接

首先要解释ONE中的一个最基本的概念——连接(Connection/Connect)。由于ONE并不侧重于底层信道的仿真,因此空中接口的概念已经淡化了,取而代之的是“连接”。简单的理解,当两个节点在彼此通信范围之内,连接就认为是建立的,ONE习惯中用UP表示,反之用DOWNONE中提供了一系列函数用于维护所有节点之间的连接。详细情况可以读一下connection.java。一个最基本的连接包括了:

 protected DTNHost toNode                //连接的目的节点

    protected NetworkInterface toInterface  //连接的目的接口

    protected DTNHost fromNode              //链接的源节点

    protected NetworkInterface fromInterface; //链接的源接口

    protected DTNHost msgFromNode           //消息的源节点

    private boolean isUp                    //最重要的是连接的当前状态

    protectedMessage msgOnFly              //连接正在传输的消息

实际上,仿真中通常使用的是CBRConnection类,这个类继承自Connection,扩展了:

 

    private int speed                    //CBR流的传输速度

    private double transferDoneTime      //传输完成的时间

回到update的问题上,更新接口执行的是网络接口的更新函数,在NetworkInterface类中update()是一个空函数,实际上更新的是它子类中的update()函数。在实际仿真中,经常采用SimpleBroadcastInterface作为接口类型(实际上ONE也没给我们太多的选择),因此SimpleBroadcastInterface.java中的更新函数是维护连接的关键。

    public void update() {

       // First break the old ones

       optimizer.updateLocation(this);

       for (int i=0; i<</span>this.connections.size(); ) {      //遍历所有连接

           Connection con = this.connections.get(i);

           NetworkInterface anotherInterface = con.getOtherInterface(this);

           // all connections should be up at this stage

           assert con.isUp() : "Connection " + con + " was down!";

 

           if (!isWithinRange(anotherInterface)) {       //删除已经断开的连接

              disconnect(con,anotherInterface);

              connections.remove(i);

           }

           else {

              i++;

           }

       }

       // Then find new possible connections

       Collection interfaces =

           optimizer.getNearInterfaces(this);

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值