洪泛路由模拟(Java实现)
本文主要是以洪泛路由的一个简单模拟,一切都源于一个朋友的请求,所以花了大概两个小时的时间完成了这么一个简单的实现。
不知道大家对洪泛算法有没有过一些了解,总之我在这之前是完全没有听说有这么一个算法存在。如果没有了解过的话,可以参考如下描述(源自百度百科的拷贝):
洪泛不要求维护网络的拓扑结构和相关的路由计算,仅要求接收到信息的节点以广播方式转发数据包。例如,源节点希望发送一段数据给目标节点。源节点首先通过网络将数据副本传送给它的每个邻居节点,每个邻居节点再将数据传送给各自的除发送数据来的节点之外的其他。如此继续下去,直到数据传送至目标节点或者数据设定的生存期限(TTL,Time To Live)为0为止。
通过这么简短的一句话,大家也对于这个算法有了一个大致地了解,下面我们来谈谈对它的实现,
首先,我选用Java作为实现语言而不是C或者C++的原因主要有如下两点:
1. Java作为一种面向对象的语句使我们可以更好地对数据进行抽象,如路由中的节点、报文甚至通道。
2. 我对C与C++等不熟悉,也就没有必要为了这么简单一个实现去了解它们的语法了。
其次,既然是模拟通信,那么我们就必须先要有一份网络拓朴图,下图即为此次我所使用的拓朴图。
对于实现来说,我们需要对这个图进行抽象化。此次我主要将图抽象为两类对象,一类是节点,用于描述图中各主机的关联关系,第二个是报文,用于描述传输的数据。
对于一个模拟程序来说,我们需要指定一个报文的发出主机与目的主机,而在洪泛算法里,报文每到一个主机后会对与之相邻且未接收过该份报文的主机进行广播,在这里我们需要给一个最大的跳跃次数,即尝试多少次广播后,若还没有到达目标主机,我们会将该份报文丢弃。
这里,我选用初始节点为:节点1、目标节点为:节点7、最大跳跃次数为3。下面给出相关的代码实现:
首先是节点的实现:
/** * 节点 * @author chery * @date 2016年5月2日 - 下午1:43:03 */ public class Node { // 结点名称 private String name; // 是否结束节点 private boolean isEnd = false; private Set<Node> relativeNodes = new HashSet<Node>(); public Node(String name) { this.name = name; } public void link(Node... nodes) { for (Node node : nodes) { this.relativeNodes.add(node); node.getRelativeNodes().add(this); } } public Set<Node> getRelativeNodes() { return relativeNodes; } public void accept(Packet packet) { // 记录当前节点 packet.getRoute().add(this.name); // 如果计数器仍然等于零 或 当前节点已经是最终节点,则打印路由信息 // 否则继续传输,否则输出报文传输路径 if (this.isEnd) { System.out.println("传输成功: " + packet); } else if (packet.getCounter() == 0) { System.out.println("传输失败,已超出生命周期: " + packet); } else { packet.decrement(); boolean isAvailableNodeExist = false; for (Node nextNode : relativeNodes) { if (!packet.getRoute().contains(nextNode.getName())) { isAvailableNodeExist = true; nextNode.accept(packet.clone()); } } if (!isAvailableNodeExist) { System.out.println("传输失败,无法找到下一结点: " + packet); } } } public void setEnd(boolean isEnd) { this.isEnd = isEnd; } public String getName() { return this.name; } }
其次是报文的实现:
/** * 报文 * @author chery * @date 2016年5月2日 - 下午1:39:51 */ public class Packet implements Cloneable { // 计数器 private int counter; // 传输路径 private ArrayList<String> route = new ArrayList<String>(); public Packet(int counter) { this.counter = counter; } public int getCounter() { return counter; } public List<String> getRoute() { return route; } public void decrement() { this.counter = this.counter - 1; } @SuppressWarnings("unchecked") @Override public Packet clone() { Packet result = null; try { result = (Packet) super.clone(); result.route = (ArrayList<String>) this.route.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return result; } @Override public String toString() { return String.format("报文的传输路径为: %s", route); } }
最终是整个拓朴图的组织及模拟报文传递:
public class Runner { public static void main(String[] args) { Node node1 = new Node("1"); Node node2 = new Node("2"); Node node3 = new Node("3"); Node node4 = new Node("4"); Node node5 = new Node("5"); Node node6 = new Node("6"); Node node7 = new Node("7"); Node node8 = new Node("8"); Node node9 = new Node("9"); Node node10 = new Node("10"); node1.link(node2, node3, node6); node2.link(node3, node10); node4.link(node6); node5.link(node6); node6.link(node8); node7.link(node8); node8.link(node9, node10); // 设置节点7为终止结点 node7.setEnd(true); // 从节点1出发,尝试跳跃次数为3 node1.accept(new Packet(3)); } }
运行Runner.java可以得到如下结果:
传输失败,已超出生命周期: 报文的传输路径为: [1, 3, 2, 10]
传输失败,无法找到下一结点: 报文的传输路径为: [1, 2, 3]
传输失败,已超出生命周期: 报文的传输路径为: [1, 2, 10, 8]
传输失败,无法找到下一结点: 报文的传输路径为: [1, 6, 4]
传输失败,无法找到下一结点: 报文的传输路径为: [1, 6, 5]
传输失败,已超出生命周期: 报文的传输路径为: [1, 6, 8, 10]
传输失败,已超出生命周期: 报文的传输路径为: [1, 6, 8, 9]
传输成功: 报文的传输路径为: [1, 6, 8, 7]
当然我们也可以自定义拓朴图,只需修改Runner.java的拓朴图组织及跳跃次数即可。
附件为 Python 实现
相关推荐
简单使用Python实现的洪泛路由算法,写得比较蠢,仅供参考
无线传感器网络洪泛路由算法的改进模型,张小庆,李腊元,本文简要地介绍了无线传感器网络的特点以及目前无线传感器网络中的路由算法,在洪泛算法的基础上提出一种基于指定圆形区域的路由
C语言路由洪泛算法,通过洪泛确定到达目的地所走过的节点等功能。
已修改适用于NS2.35的MFlood洪泛路由协议的源码以及其测试tcl代码
无线传感器网络的路由问题是无线传感器网络研究中待解决的重要问题之一,洪泛(Flooding)路由算法是其中基本的一种算法,也是其他路由算法的基础。本文讨论了洪泛路由的性能和稳定性,并得出在使用洪泛路由时,无线...
用于学习NS2移植算法,方便初学者学习运用
通过build,从omnet3.0版升级到4.1版,可以正常运行,并可以验证flooding路由算法的正确性
针对无线自组织网络现有按需路由协议在路由维护时需要采用全网洪泛广播路由请求消息而导致大量额外开销的缺点,提出了一种无线自组织网络基于洪泛控制的动态路由协议FCDR.FCDR的主要思想是控制洪泛机制的使用范围,...
概率洪泛路由协议中洪泛概率的确定多依赖于实验,缺乏理论性。在无线传感器网络中,应用概率洪泛路由时,每个传感器节点收发信息具有随机性,在合理假设下,将网络中信息传输过程建立为一个分支过程模型,利用分支...
无线传感器网络洪泛路由算法的改进模型.doc
一种基于洪泛的能量高效的传感器路由算法,李训光,颜昕,本文在现有洪泛算法的基础上,针对无线传感器网络的特点,提出了一种能量高效的路由策略。此策略对传统的洪泛算法从两个方面进行
采用改进的洪泛路由方法加以实现,通过在洪泛路由方法中加入层数更新机制与帧转发控制机制,避免了资源浪费与数据内爆问题,优化了环状层次结构的建立过程,仿真结果表明:环状分层方法效果优于Zigbee的簇树状网络的...
创建无线传感器网络并使用随机泛洪路由技术来模拟数据传输。 进一步,减少能量并在每个节点上生成块以模拟数据交换。 在每个节点处生成块最终导致形成区块链,该区块链在目标节点处接收。 该模拟仅适用于STATIC节点...
在OMNET++下写的简单洪泛协议,里面有详细的实现代码
针对上述问题,采用有限洪泛路由查询和移动agent路由查询相结合的策略,为每个移动节点提供丰富可靠、及时高效的路由信息。同时,使用改进的蚁群算法,综合考虑网络带宽、时延等多个路由性能指标,作为路由策略中路...
用C++实现的洪泛算法 由5个节点的发送
为有效减少移动Ad hoc网络路由协议开销并且实现网络路由的鲁棒性, 引入位置匿名性和LAR局部定向洪泛机制。对Ad hoc网络中的ARMR协议anonymous routing protocol with multiple routes进行改进, 提出一种新的基于匿名...
NS2洪泛路由的代码,保存在mflood文件夹下,以及协议移植后的测试例程mflood-3node.tcl。
采用节点不相交多路径备份策略,实现失效路由的快速自愈。加入基于链路质量感知的Root节点切换机制,保证路由申请及分发的可靠性。仿真结果表明,CSRP算法有效抑制了洪泛现象、提升了网络性能,相比于现有经典相关...
关于洪泛节点在寻找路径时的方法,是一种简单的路由协议。这种协议可以能够提供最短的路径。