一个简单的网络实现Dijkstra最短路径算法,路径代价为跳数加排队延时
代码下载地址:http://download.csdn.net/detail/yanhc519/6774991
由于链路使用了包交换的链路,所以propdel = 0,txdel=1s,剩下的关键就是排队延时了。
排队延时就是输出链路缓冲区的队列中的等待时间,首先得找到缓冲区的位置所在。
在NS中链路上直接关联queue,Opnet中不太一样,链路上似乎没有queue,虽然有个channel,但是在节点内部好像无法读取链路的状态。目前是在transmitter中找到了一个queue,而且,通过statistics wire可以获取这个queue的size和delay等属性。
实际读取transmitter的delay的时候遇到一个问题,当delay很小的时候(可以通过link的统计量获得),transmitter的delay并不能读取。不知道为什么???不过,实际网络中应该是读取queue size,然后自己计算queue delay,或者直接根据queue size,路由做出其它选择。
采用了邻接表实现,然后利用Dijkstra最短路径算法计算路径。
为了简单,目前没有生成路由表,有包发送了就计算一次路径,有点像被动路由。这样也许会增加计算开销,需要确定一下opnet下Dijkstra计算开销大不大???how???正常应该是定时更新路由表,每次发送就查找路由表就可以了,后续会实现这个。
目前通过hello包获取网络拓扑和邻居链路的stream number,为了贪图简单,没有涉及链路状态信息的分发,直接使用了一个全局变量存储网络拓扑。这个应该实现链路状态信息的分发,无链路状态分发全局存储网络拓扑的情况应该设置为Dijkstra最优的方法,用作其它benchmarking。
网络层与泛洪的差不多,下面是节点层,加了statistics wire
下面是进程层,加了一个收集统计量的状态,其它都与泛洪差不多。
HB部分
FB部分