洪泛路由模拟(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")@Overridepublic Packet clone() {Packet result = null;try {result = (Packet) super.clone();result.route = (ArrayList<String>) this.route.clone();} catch (CloneNotSupportedException e) {e.printStackTrace();}return result;}@Overridepublic 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出发,尝试跳跃次数为3node1.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 实现

洪泛路由模拟(Java实现)相关推荐

  1. 路由选择协议(二)主讲OSPF,使用洪泛法的层次区域路由信息交换

    1.内部网关协议OSPF 1.1 OSPF的特点 它称为open shortest path open,开放最短路径优先协议.它使用了Dijkstra提出的最短路径算法SPF. 它最重要的特征是使用了 ...

  2. 中继(洪泛中继、定向中继)在无线通讯中的应用

    无线中继,即中继节点在无线网络中起到中继的作用,能实现信号的中继和放大,从而延伸无线网络的覆盖范围.就中继的运行机制而言,中继可分为洪泛中继.定向中继. 洪泛中继,是指中继设备在任何时刻收到的任意数据 ...

  3. TCP连接三次握手协议,释放连接四次挥手,以及使用 awl伪造mac地址进行多线程syn洪泛攻击。...

    这个TCP连接就是一次追女生-谈恋爱-分手,追求比分手简单,但是分手比追求复杂.哥,谈了半年的女朋友,在就快要成功了的时候分了,原因是因为有人在后面该老子背后搞SYN洪泛攻击,最后女朋友丢失了.学会T ...

  4. 冲突、冲突域、广播、广播域、洪泛的基本概念

    冲突.冲突域.广播.广播域.洪泛的基本概念 冲突是指在同一个网段上,同一个时刻只能有一个信号在发送,否则两个信号相互干扰,即发生冲突.冲突会阻止正常帧的发送.冲突域是指能够发生冲突的网段.冲突域大了, ...

  5. 前端小知识:控制台打印(console)- 模拟Java日志打印、表格形式打印美化输出对象、代码运行时间统计

    文章目录 6. 控制台打印(Console) 模拟Java日志打印格式 美化对象打印(表格形式打印输出) 日志等级输出(让其在控制台显示时有颜色提示) 代码运行时间统计打印输出   6. 控制台打印( ...

  6. P2P应用(BT种子,Skype,洪泛式查询)

    目录 P2P应用 文件分发时, 客户机/服务器架构和P2P架构的对比 BT种子 Bittorrent技术对网络性能有哪些潜在的危害? P2P索引(P2P如何搜索信息的) 集中式索引 洪泛式查询 层次式 ...

  7. kotlin模拟java三目运算

    kotlin没有三目运算,一直都要if else,但是如果是空判断可以用?.?:连用模拟 代码: fun 判空模拟java三目运算(variable: Int? = null){variable?.l ...

  8. 计算机网络原理 实验2 《NS3路由模拟实验》

    计算机网络原理 实验2 <NS3 路由模拟实验> 一.实验目的 1.了解NS3网络模拟器的基本操作: 2.学习采用距离矢量算法(Distance Vector Algorithm)的动态路 ...

  9. SYN 洪泛、SYN 攻击、DDos 攻击以及如何抵御

    SYN 洪泛.SYN 攻击.DDos 攻击实际上就是对服务端一直发送 TCP SYN 包,但是不回第三次握手 ACK,这样就会使得服务端有大量的处于 SYN_RECV 状态的 TCP 连接. 这里给出 ...

最新文章

  1. “高龄”员工如何给家庭保障
  2. JSP页面中实现使用taglib导入库时自动提示(JSTL 库安装)
  3. 兼容性记录-class属性
  4. idea打包meven镜像_Intelij IDEA中修改maven为国内镜像
  5. 从框架源码中学习创建型设计模式
  6. python全栈开发笔记---------数据类型-----集合set
  7. 【脑经急转弯】—— 灯亮还是灭?
  8. elementui中给input框赋值成功后input框不能进行编辑问题
  9. java数字后面加f_java 数字后面 f 和 l
  10. 精简版XP的IIS安装
  11. 5G无线技术基础自学系列 | 5G NR和LTE信道结构比较
  12. 计算冲突域和广播域的方法
  13. 精细加工领域中超快激光的应用
  14. Guava--Splitter使用方式
  15. R数通杀思路分享-反部分混淆解析canvas和fonts指纹
  16. 2022CCPC预选赛C Guess(博弈)
  17. 开涛的博客—公众号:kaitao-1234567,一如既往的干货分享
  18. Hexo+Github实现相册功能
  19. python学习之双目图像得到景深图(及遇到的问题)
  20. 飞思卡尔微控制与MSCAN ----自学笔记

热门文章

  1. shutil python_python之shutil模块
  2. 游戏是如何有序运行的
  3. 复古风吹到科技圈,老玩意也有新意思
  4. 怎样判断java成员方法,【判断题】在Java中,针对类、成员方法和属性提供了四种访问级别,分别是private、static、protected和public...
  5. hash 和 history 两种模式
  6. 软件工程用的17种图
  7. DVD影碟特色功能大展
  8. 如何用C++封装一个简单的数据流操作类(附源码),从而用于网络上的数据传输和解析?
  9. Adobe Premiere 导出视频时遇到的问题
  10. 用计算机打爸爸妈妈,教爸妈玩电脑