基于DV算法的路由器模拟设计与实现
- 格式:doc
- 大小:480.50 KB
- 文档页数:55
基于机器学习的智能路由器设计与实现近年来,随着人们生活水平的提高和科技的不断发展,智能家居正逐渐被普及。
而智能路由器作为智能家居的中枢设备之一,起到着至关重要的作用。
传统的路由器单一路由方案,无法满足网络的需求。
于是,基于机器学习的智能路由器应运而生。
一、机器学习在智能路由器中的应用智能路由器是基于普通路由器开发的智能化设备,可以智能管理家庭网络,提升人们的网络体验。
机器学习是其中不可或缺的一环。
路由器需要通过机器学习提取、分析和处理数据,从而提高自身的智能化水平。
通过机器学习算法,路由器可以自动进行智能决策,根据用户的行为模式和网络需求,自主调整路由策略。
二、基于机器学习的智能路由器的设计与实现1.智能路由器的硬件设计智能路由器必须具备足够的性能和稳定性来支持机器学习应用。
目前市面上的智能路由器普遍采用了高性能SOC或者CPU,配合高速内存,确保数据交换和计算的速度。
2.智能路由器的机器学习算法目前在智能路由器中主要采用了监督学习算法和强化学习算法。
监督学习算法可以通过对已知数据的学习,来预测未知数据,从而实现智能路由器的自动调节。
而强化学习算法则通过系统自身的尝试和学习来优化路由决策。
3.智能路由器的软件设计在智能路由器软件设计中,需要设计出一套机器学习应用程序,实现对数百万个数据进行分离、识别、分类和索引。
同时,还要实现数据的收集、存储、可视化和分析,构建出完整的智能路由器管理系统。
三、基于机器学习的智能路由器的应用场景1.智能家居在智能家居中,智能路由器可以与智能家居设备相连,实现智能化管理。
比如定期监控家庭网络情况,自动优化路由设置,确保家庭网络畅通无阻。
2.网络质量监测对于一些企事业单位来说,网络质量是非常重要的,智能路由器可以通过对网络质量的科学评估和分析,从而预测网络健康状况。
对网络出现故障和遭受攻击的风险进行预警,并自动采取相应措施进行优化和保护网络。
3.智能教育随着在线教育的普及,智能路由器还可以与在线教育平台相结合,科学管理校园网络。
LS算法与DV算法LS算法(Link State Algorithm)和DV算法(Distance Vector Algorithm)是两种常见的路由算法,用于计算网络中的最佳路径。
本文将详细介绍LS算法和DV算法的原理、特点和应用场景。
一、LS算法LS算法是一种基于链路状态的路由算法。
它的核心思想是每个节点都通过广播链路状态信息,将所知道的网络拓扑信息发送给所有节点,并根据收到的链路状态信息计算最佳路径。
具体流程如下:1.链路状态信息广播:每个节点定期地广播链路状态信息,包括自己与邻居节点之间的链路状态。
链路状态信息包括链路的带宽、延迟、可用性等参数。
2.链路状态数据库更新:每个节点收到链路状态信息后,更新本地的链路状态数据库,保存所有节点之间的链路状态信息。
3. 最短路径计算:根据链路状态数据库,每个节点使用最短路径算法(如Dijkstra算法)计算出到达所有其他节点的最短路径。
最短路径由一系列节点组成,经过这些节点可达目的节点。
4.路由表生成:每个节点根据最短路径计算结果生成路由表,将目的节点与下一跳节点对应起来。
路由表中的项表示到达一些目的节点应经过的下一跳节点。
LS算法的特点如下:1.需要大量的计算和存储开销:每个节点需要保存所有节点之间的链路状态信息,因此需要较大的存储空间。
同时,最短路径计算是一个复杂的计算过程,需要耗费大量的计算资源。
2.收敛速度较快:由于每个节点都拥有全局的网络信息,LS算法的收敛速度较快。
一旦网络拓扑发生变化,节点会立即更新链路状态并重新计算最短路径。
3.网络稳定性好:LS算法能够在整个网络中保持一致的路由信息,使得网络稳定性较高。
即使出现链路故障或节点故障,网络也能够快速恢复。
LS算法适用于网络规模较小、带宽较大、希望快速收敛和稳定性较高的场景(如企业内部网络)。
二、DV算法DV算法是一种基于距离向量的路由算法。
它的核心思想是每个节点通过交换距离向量信息,将自己的已知距离信息传递给相邻节点,相邻节点再根据收到的距离向量信息更新自己的距离向量。
信息系统工程 │ 2019.5.2080SYS SECURITY 系统安全摘要:论文设计了一种基于Batman-adv的无线自组网系统,将Batman-adv协议嵌入Openwrt系统中,经编译下载至自组网节点,实现了多个节点开机组网功能,并通过实验对基于Batman-adv的自组网系统进行了可行性验证,实验结果表明,基于Batman-adv的自组网系统能够实现无线节点的快速组网和高效部署。
关键词:Batman-adv;Openwrt;自组网一、前言自组网是由一系列无线移动节点组成的动态的多跳自组织的网络,相对于现有的网络而言,其不依赖于预设的基础设施,具有移动性、无中心性、拓扑架构动态变化等特点,是目前研究的热点方向[1-3]。
无线自组网通信的链路可靠性,都要求网络具有建立和维护稳定有效的路由信息[4],路由算法作为实现无线网络的基础,目前主要的路由协议有AODV、Babel、DSDV、DSR、HSLS、ZRP、OLSR、OSPF 等,但由于低功耗有损网络(Low-Power and Lossy Networks,LLN)的特点,上述路由协议并不能满足面向低功耗的无线自组网的需求[5]。
而Batman-adv 路由协议在吞吐量、时延、CPU 负载和路由开销等方面有更好的性能表现[6-7],同时耗费资源少,对硬件要求低,特别适合嵌入式应用。
本文基于Batman-adv 作为自组网的路由协议,研究了基于Batman-adv 协议的快速组网方法,通过在Openwrt 上移植Batman-adv 协议,并下载到AR9344路由器,实现了自组网系统开机快速组网的功能。
二、基于Batman-adv 的自组网系统设计本系统主要由AR9344路由器、Openwrt 固件及PC 机组成,将Batman-adv 嵌入Openwrt 系统中,并将编译后的固件下载到AR9344路由器,在PC 端进行相关配置,即可实现无线节点自组网。
收稿日期:2006-09-11 基金项目:国家自然科学基金资助项目(60472074);西北工业大学研究生创业种子基金资助项目(Z200568)作者简介:刘艳文(1983-),男,江西人,硕士研究生,主要研究方向:无线传感器网络、嵌入式计算技术; 王福豹(1963-),男,山西人,教授,博士,主要研究方向:计算机网络、流媒体、传感器网络; 段渭军(1962-),男,陕西人,高级工程师,博士,主要研究方向:流媒体、无线通信; 于超(1973-)男,湖南人,硕士研究生,主要研究方向:无线传感器网络、嵌入式设计.文章编号:1001-9081(2007)03-0516-03基于D V 2H op 定位算法和RSSI 测距技术的定位系统刘艳文,王福豹,段渭军,于 超(西北工业大学宽带网络技术研究所,陕西西安710072)(stor m i n grans @163.co m;li u yanwen@ma i.l nwpu .edu .cn)摘 要:针对D V 2H op 算法在实验环境中存在的问题,加入接收信号强度指示器(RSSI)测距模块辅助定位,对算法进行改进。
为了实现定位系统,首先,需要建立当前实验环境的RSSI 模型;然后,应用该模型,从锚节点和非锚节点两方面分别控制D V 2H op 定位过程。
实验证明:改进后的定位系统在增加少量计算复杂度的情况下,改善了系统的稳定性,提高了定位的精度,可以被应用到无线传感器网络中。
关键词:D V 2H op 定位算法;定位系统;接收信号强度指示器测距技术中图分类号:TP393.06 文献标识码:AA loca liza ti on syste m based on DV 2H op loca liza ti on a l gor ithmand R SSI rangi ng techn i queLI U Yan 2wen ,WANG Fu 2bao ,D UAN W ei 2j u n ,Y U Chao(Institute o f B roadband N etw ork ,Nor t hwest P ol ytechnica l Universit y ,Xi p an Sha anxi 710072,China )Abstra ct :As an assistant loca lizati o n method ,received si gna l strength i ndicator (RSSI)rangi ng module was added i nto t heD V 2H o p l ocali zatio n alg or it h m to resolve its pro b l e m s exi sti ng in experm i enta l environ men.t In order t o m i ple ment the l ocalizati on syste m,firs,t t he R SSI mode lwas bu ilt up ;t hen ,t h i s mode lwas app lied to co ntrol D V 2H o p l ocalizati on process fro m anchor nodes and nonanchor no des respecti ve l y .It is prov ed t hat m i prov ed l ocalizatio n syste m m i prov es syste m stab ility and l oca lizati on precisi on wit h a littl e sacr ifice on co mputi ng co mplexit y .Therefore ,it can be app li ed i nto wire l ess sensor net works .K ey word s :D V 2H op l oca liza ti on a l gor ith m;l oca lizatio n syste m;rece i ved signa l strengt h i nd i ca t or (R SSI)rang i ng techn i que0 引言目前,根据不同的定位需求和环境实现了多种应用的定位系统。
实验二路由选择算法模拟实验一、实验目的1.理解路由选择算法实现原理,加深对网络层功能的理解;2.掌握距离向量路由选择算法中路由表形成过程及其对路由选择的影响;二、实验内容1.熟悉模拟软件的运行环境及操作方法;2.调整参数,分析路由表变化情况,理解路由算法。
三、实验原理1.距离向量路由选择算法基本原理如下:(1)初始化,对于每节点G,对所有它直接连接的目的地N,路由表中的项用三元组(N,G,0)表示,即从节点G到目的节点N无需经过转发。
(2)节点G定期发送它的路由表给相邻节点,更新信息中对应着每一个目的地N,用一个三元组来表示(N,V,D),即到目的地N的路由上的下一节点为V,G到N的距离为D。
(3)节点G收到G’送来的路由信息,对于更新信息中给出的每个目的地,在G的路由表中查找相对应的表项,设它为(N,V,D),而更新信息中的三元组为(N,V’,D’),C为节点G和G’之间的距离。
如果找不到相应的表项,则在G的路由表中增加一项(N,G’,D’+C);(4)如果V=G’,则G中路由表对应的表项更新为(N,G’,D’+C);否则,比较D’+C和D:如果D’+C<D,则G中表项更新为(N,G’,D’+C)否则G中表项保持原状,仍为(N,V,D)。
2.网络拓扑结构图3.信息格式:目的IP地址`目的端口号`源IP地址`源端口号`控制`数据控制:"M"-数据帧;"GetR"-请求邻居路由器回送距离表,无数据域;"R"-数据内容为距离表。
四、实验仪器计算机45台、集线器4台、网卡45块、网线条、软盘若干。
五、实验步骤1.将模拟软件拷贝到计算机硬盘,熟悉模拟软件的运行环境及界面,察看帮助文件。
2.运行配置好的模拟环境,分析路由表情况,并与算法相比较,得出结论。
3.调整距离值,重新计算路由表,分析路由表情况,得出结论。
六、实验数据与分析1、普通路径分析(1)首轮计算路由表1分析:路由2到其本身的距离为0,到路由1、3、4的距离分别为4、2、6,由于与除路由1、3、4外的其他路由都未直接连接,所以延时显示为>100的数值。
基于DV-HOP WSN改进算法的研究与仿真*DV-HOP/定位算法/角度阈值/加权因子1 引言随着微机电系统(micro-electro-mechanism system,简称MEMS)、无线通信和数字电子技术的进步孕育了无线传感器网络(wireless sensor network,简称WSN)。
从军事应用、目标追踪、环境检测到空间探索,WSN 的未来应用将超出我们的想象力。
但是对于大多数的WSN应用,不知道传感器位置而感知的数据是没有意义的[1]。
传感器节点必须明确自身位置才能详细说明“在什么位置或区域发生了特定事件”,从而实现对外部目标的定位和追踪[2]。
而人工部署和为所有网络节点安装GPS接收器都会受到成本、功耗、扩展性等问题的限制,甚至在某些场合可能根本无法实现,如在室内由于受到建筑物的阻挡其定位性能并不理想,因此必须采用一定的机制与算法实现WSN的自身定位。
2 DV-HOP定位算法的研究2.1 DV-HOP定位算法的基本原理DV-Hop算法是由美国Rutgers University的Dragos Niculescu等人利用距离矢量路由和GPS定位原理提出来的一种无需测距的定位算法[3]。
因传感器节点通信距离有限,往往通过多跳路由的方式传送数据,节点本身仅与其邻接节点交换信息,DV-Hop算法就是利用了这一特性。
其基本原理是将未知节点到锚节点之间的距离用网络平均每跳距离和两者之间的最短跳数乘积表示。
虽然待定位节点通信范围内的参考节点数量不多,但是采用上述方法可以获得通信范围外多个参考节点的估计距离,利用大量的冗余信息实现节点定位。
该算法首先使用距离矢量交换协议,使网络中所有节点获得距锚节点的跳数,然后锚节点计算网络平均每跳距离值,并将其广播至网络中。
当未知节点接收到该值后,则根据跳数计算与锚节点的距离。
当未知节点获得与3个或3个以上锚节点的距离时,则执行三(多)边测量或极大似然估计法[4]。
DV算法实验报告一、实验目的通过自己写代码模拟路由器DV算法。
输入为路由器个数n,路由器i到路由器j的花费(i<n,i>j)。
输出为,稳定状态的路由表。
二、实验过程(1)输入路由器的相关信息(路由器个数,到邻居路由器的花费)(2)开始路由器间的信息交换(3)初始化flag为false。
每个路由器和邻居路由器交换信息。
若路由器i到路由器k的当前花费大于通过先到j再到k的花费,则更新路由表。
同时将flag设为true,表示有路由表发生变化(4)若flag为true则重复第三步。
否则输出各个路由器的路由表(5)程序结束三、实验结果假设输入的路由器扑拓图如下图:输出结果为:四、心得体会本次实验意义重大。
是一次把理论与实践的结合,是一次抽象到具体的转变。
之前在课堂上学习DV算法时,还有有点抽象,仅限在理论上讨论算法的能得到正确结果。
通过亲自编写代码,模拟路由器的工作过程,我对DV算法和路由器生成路由表的工作过程有了更深入的理解。
让我不再对网络课觉得恐惧。
import java.util.Scanner;public class DV {public static Router[] R=new Router[20];public static int MAX=10000;public static void main(String[] args) {// TODO Auto-generated method stubScanner s=new Scanner(System.in);System.out.print("Input the number of router: ");int num=s.nextInt();for(int i=0;i<20;i++){R[i]=new Router();}int cost;for(int i=0;i<20;i++){R[i].cost[i]=0;R[i].nexthop[i]=i;R[i].neighbour[i]=true;for(int j=i+1;j<num;j++){System.out.print("Input the cost from "+i+" to "+j+": ");cost=s.nextInt();if(cost<MAX){R[i].cost[j]=cost;R[j].cost[i]=cost;R[i].nexthop[j]=j;R[j].nexthop[i]=i;R[i].neighbour[j]=true;R[j].neighbour[i]=true;}}}boolean flag=true;while(flag){flag=false;for(int i=0;i<num;i++){boolean f=R[i].changeAll(R);if(f==true){flag=true;}}}for(int i=0;i<num;i++){System.out.println("Router["+i+"]");R[i].printRoutingTable(num);}}}class Router{boolean[] neighbour=new boolean[20];int[] cost=new int[20];int[] nexthop=new int[20];public Router(){for(int i=0;i<20;i++){this.neighbour[i]=false;this.cost[i]=10000;this.nexthop[i]=i;}}public boolean change(Router r,int k){boolean flag=false;for(int i=0;i<20;i++){if(this.cost[i]>this.cost[k]+r.cost[i]){this.cost[i]=this.cost[k]+r.cost[i];this.nexthop[i]=k;if(this.neighbour[i]=false){this.neighbour[i]=true;flag=true;}}}return flag;}public boolean changeAll(Router[] router){ boolean flag=false;for(int i=0;i<20;i++){if(this.neighbour[i]==true){boolean f=this.change(router[i],i);if(f==true)flag=true;}}return flag;}public void printRoutingTable(int n){System.out.println("dest cost nexthop");for(int i=0;i<n;i++){System.out.println(i+" "+this.cost[i]+" "+this.nexthop[i]);}}}。
基于DV算法的路由器设计与实现实验报告学院:姓名:日期:一.实验目的1.深入理解分布式路由选择算法,以最简单的DV算法来增强对路由算法的认识2.理解、掌握和利用距离向量算法3.所实现的路由器模拟Internet上的IP路由器。
它能确定网络的最短路由,并在这些利用上传输分组二.DV算法描述距离矢量算法,也称为Bellman-Ford shortest path algorithm,每个路由器都定期或拓扑结构突发变化时与其相邻的所有路由器交换路由表,据此更新它们自己的路由表。
DV算法工作方式:每个路由器维护一张路由表,表中分为三个表项:目的地址,列出了当前可达的目的网络地址;到达目的地址下一跳,列出了下一跳的IP地址;到达目的地址的代价,以距离或跳数为表征。
路由表更新规则:1.发现了一条到达某目的的新路由,而该路由在原来的路由表中不存在(即发现了一条新路由),则在路由表中增加该路由。
2.发现了一条到达某目的的、距离更短的新路由,则用该路由替换原有的路由。
3.到达某目的的一条路由,其后继结点到达该目的地的距离发生了变化,则需要更新该路由的距离。
在此实验当中,为了实现和模拟的方便,刚开始初始化生成一个网络连接图的二维数组(见mainManager/RoutersInit.java,初始化的二维数组是entity/NetMap.java);每个路由器类包括了路由器ID,端口,routerTable对象,还有两个HashMap(一个存储为每一个相邻路由器的计时器,一个存储每一个相邻路由器的上一次交流时间);路由表采用了两个数组来实现,一个数组存储到各个网络的下一跳,一个数组存储到各个网络的跳数,如下结构,以路由器一为例,(路由表的默认数组和两个真是数组的显示信息,其中下一跳是0表示不可达的下一跳,不是0如2004表示下一跳是2004,在距离数组里,如果是16表示不可达,如果是0,表示到本身路由,不是0或16表示可达且跳数为该数值),如下图路由表左边方框中的信息所示:在路由表中,只登记下一跳而不是完整路由,以真实模拟路由器的DV算法处理。
转发分组时,严格按照路由表进行转发。
如上图,路由器的连接信息在上面图片的左部区域,右部区域分为两部分(一个是路由器接到相邻路由器发来的路由表的实时-------我设置的是每1秒更新一次-------信息,一个是发送或者转发数据的显示信息)。
三.实验要求1.输出路由表:在此实验当中为了实现方便,所有拓扑结构中的路由器都给以显示(可达的,不可达的16以及自己的路由编号):要求对这个连接图的二维数组解析,进行DV算法的模拟。
2.发送分组:每个数字代表一个数据分组发送请求;数据分组发送到数字代表的目的地;如果目的结点不是邻居结点,不能直接发送分组,而必须在路由的各个结点上沿路由转发该分组。
收到数据分组的结点必须输出一行,显示该分组的目的,在图1中的右上角显示了每一秒的路由表的更新情况,每一个路由器都有三个转发进程,发送进程和接收进程。
发送进程每一秒都需要发送自己的路由表信息。
每一个路由器都给自己相邻的路由器设置了一个计时器,如果10秒钟没有收到相邻路由器的信息,就将下一跳设置成0,距离设置成16(表示不可达)。
否则重新开始计数。
2.发送数据:数据分组必须有数据,且在如图1中的点击提交按钮之前,必须在文本框中输入正确的数据格式(传送的目的路由和要传送的数据之间必须要有“#”号分割),如:2003#DDDDDDD,表示目的路由是2003,传送的数据是DDDDDDD。
例如:路由器2006要向2001发送数据,则具体转发过程如下:在RouterTablePacket 中有Hops(初始值是16,每过一跳,hops减1,当hops 是1的时候,就不再进行转发了,相当于TTL:Time to Live)属性,分组应该在Hops规定的时间或步数内到达目的结点,否则丢弃之。
分组经过每个中间结点时,将其TTL减1。
若TTL=1,丢弃,否则继续转发。
3.关于时间定时:每个路由器每1秒钟发出它们的路由表;每个路由器根据收到的路由表更新它们自己的路由表;路由器必须具备检测邻居是否活动的能力,如果路由器在10秒钟没有收到邻居发来的更新,则认为邻居不可达。
4.显示活动的相邻路由:用一个特定的表格来显示与当前路由相邻的路由器的信息。
5.关于拓扑结构:路由器必须具备路由器故障和恢复的能力;这里假设链路不会出现故障,分组不会丢失和出错;如果路由器在给定时间内未运行,表示路由器故障,如果重启运行,则认为路由器故障恢复;当然,假设通信是双向的。
四.实验用例编程语言:java;开发环境:jdk1.6.0_02、Myeclipse8.6,测试用例为二维数组的维数个(你可以随便写出一个对称的二维数组,程序可以自己解析的,我用的都是活代码),如下如所示我写的一个拓扑图的二维数组,如图:此实验是模仿DV算法,应用java中的多线程来模拟多个路由器,并且实现路由器之间的路由表和数据的传送。
实验中路由表的数据结构相比真实的DV算法发生了变化,所以程序在实现过程当中尽量的按照实验所用的路由表结构来完成功能,但是这不影响其主要思想的实现。
1.拓扑结构:为了模拟路由表的更新,首先是先确立六个结点网络的拓扑结构,由于是应用多线程来模拟各个路由器,所以在实验过程当中可以随时挂起某个或多个路由器来模拟网络拓扑的变化,之后仍然可以恢复挂起的路由器。
网络的初始拓扑结构如图2所示:图 2此处,路由表的端口号和路由器号全是来自entity/Constant.java文件的整个程序的全局变量,路由器初始值为2001,而端口初始值为5001,分别是数组初始化时的维数个。
在实验实现过程当中,通过路由器线程的挂起实现网络拓扑结构的动态变化,之后会对相应的更该重新画出拓扑结构。
2.路由表初始化:在程序的mainManager/RoutersInit.java 类中初始化了留个路由器,这六个路由器的每一个实现都是在mainManager/RouterThread.java类中,。
以上图2的初始化二维数组中所规划的网络拓扑结构为标准,根据当前所创建的路由器编号静态初始化每个路由器自己的路由表。
3.数据格式:各个路由器实例之间通过UDP来交换路由表,路由器之间还需要进行数据的传输。
在此,需要定义所传输的路由表和数据的结构,我是全部打成了数据包或者路由表包,具体结构见transportPacket/RouterTablePacket.java(有sourceRouterId和routerTable两个属性),transportPacket/SendDataPacket.java(有sourceRouterId,destRouterId,byte[]data,hops=16四个属性),transportPacket/TotalPacket.java(有type,routerTablePacket,sendDataPacket 三个属性,TotalPacket类定义了具体具体是传输的包是什么类型的)三个类,如果是传输路由表就用RouterTablePacket把路由表包装后再用TotalPacket的sendRouterTable类型来包装,最后用UDP发送出去,如果是传输数据就用SendDataPacket把要传送的数据包装后再用TotalPacket的sendData类型来包装,最后用UDP发送出去,在目的路由器端对收到的数据进行解封装。
五.程序描述为完成所要求功能,程序首先实现了二维数组维数个路由器线程,每一个路由器线程下面又实现了发送线程、接收线程和转发数据线程三个子线程;接收线程下面实现了定时器子线程。
建立一个工程,命名为day12-02_DV_new_hasTimer (名字可以随便起,我是以前的习惯都加上了日期),在此工程下建立源程序文件,每个线程放在单独的java源程序文件当中。
该实验还可以对其中一个路由器进行挂起,别的路由器在10秒后如果收不到这个路由器发来的路由表信息,就将其路由表中的与其对应的相应路由表的值进行修改成不可达,逐渐通知到整个网络。
在这里有点不同于DV算法的是:DV算法是每个路由器为收到的路由表的每一个简历一个计时器,而该路由器简化了这个设计,是仅仅为相邻的路由器保留一个计时器,这样不仅可以大大减少整个网络的通信量,将计时器的信息保留在内存而不是在路由表中,而且采用了hashMap保存后在验证是否联通时,从hashMap中取数据方便快捷。
六、实验结论在实验过程遇到了许多问题,一方面是编程语言的使用,另一方面是对路由算法的理解程度。
三是计时器的用法,尤其是计时器的用法想了将近2个小时,最后通过不懈的调试与算法完善,程序基本实现所要求的功能,有能力模拟DV 算法。
DV算法的优缺点:DV算法简单,容易实现,对于好消息传播的速度快,但是对于坏消息则传播速度慢。
package entity;/*** 常量类* @author 郭金磊*@since 20131220*/public class Constant {/*** @return 返回路由Id的初试值*/public static int getRouterIdBasic(){ return 2001;}/*** @return 返回路由端口的初试值*/public static int getPortBasic(){return 5001;}}package entity;/*** 初始化的网络拓扑图* @author 郭金磊*@since 20131220*/public class NetMap {/*** @return 返回初始化的网络图*/public int[][] getInitInternetMap(){ int[][] initVecter=new int[][]{{0,1,16,16,1,16},{1,0,1,16,16,16},{16,1,0,1,1,16},{16,16,1,0,16,1},{1,16,1,16,0,16},{16,16,16,1,16,0}};return initVecter;}}package entity;import java.util.HashMap;/*** 路由器实体类,包含routerId,port,RouterTable,createTimerMapsForNeighbers,lastTimeMaps* @author 郭金磊*@since 20131220*/public class Router {/*** 产生全局唯一的序列化的实体ID*/private static final long serialVersionUID = -4112736218089137504L;/*** 路由ID*/private int routerId;/*** 路由端口*/private int port;/*** 路由表*/private RouterTable RouterTable;/*** 存储计时器的Map*/private HashMap<Integer,TimeCounter> createTimerMapsForNeighbers=new HashMap<Integer,TimeCounter>();/*** 存储上一次该路由器收到某个路由器的路由表时间*/private HashMap<Integer,Long> lastTimeMaps=new HashMap<Integer,Long>();/*** 默认的构造方法*/public Router() {super();}/*** 有参数routerId和port的构造方法*/public Router(int routerId, int port) {super();this.routerId = routerId;this.port = port;}/*** 有参数routerId和port和routerTable的构造方法*/public Router(int routerId, int port, RouterTable routerTable) {super();this.routerId = routerId;this.port = port;RouterTable = routerTable;/*** getters 和setters方法* @return 相应的属性值*/public int getRouterId() {return routerId;}/*** getters 和setters方法*/public void setRouterId(int routerId) { this.routerId = routerId;}/*** getters 和setters方法* @return 相应的属性值*/public int getPort() {return port;}/*** getters 和setters方法*/public void setPort(int port) {this.port = port;}/*** getters 和setters方法* @return 相应的属性值*/public RouterTable getRouterTable() { return RouterTable;}* getters 和setters方法* @return 相应的属性值*/public void setRouterTable(RouterTable routerTable) {RouterTable = routerTable;}/*** getters 和setters方法* @return 相应的属性值*/public HashMap<Integer, TimeCounter> getCreateTimerMapsForNeighbers() { return createTimerMapsForNeighbers;}/*** getters 和setters方法* @return 相应的属性值*/public void setCreateTimerMapsForNeighbers(HashMap<Integer, TimeCounter> createTimerMapsForNeighbers) { this.createTimerMapsForNeighbers = createTimerMapsForNeighbers;}/*** getters 和setters方法* @return 相应的属性值*/public HashMap<Integer, Long> getLastTimeMaps() {return lastTimeMaps;}/*** getters 和setters方法* @return 相应的属性值*/public void setLastTimeMaps(HashMap<Integer, Long> lastTimeMaps) {stTimeMaps = lastTimeMaps;}/*** tostring方法*/@Overridepublic String toString() {return "Router [routerId=" + routerId + ", port=" + port+ ", RouterTable=" + RouterTable + "]";}}package entity;import java.io.Serializable;import java.util.Arrays;/*** 路由表实体类* @author 郭金磊*@since 20131220*/public class RouterTable implements Serializable{/*** 产生全局唯一的序列化的实体ID*/private static final long serialVersionUID = 7320514855714982331L; /*** 为每一个路由器设置一个下一跳的数组*/private int [] nextHop;/*** 为每一个路由器设置一个距离的数组*/private int [] distance;/*** 有参数routerId和port的构造方法*/public int[] getDistance() {return distance;}/*** getters 和setters方法* @return 相应的属性值*/public void setDistance(int[] distance) {this.distance = distance;}/*** getters 和setters方法* @return 相应的属性值*/public int[] getNextHop() {return nextHop;}/*** getters 和setters方法* @return 相应的属性值*/public void setNextHop(int[] nextHop) {this.nextHop = nextHop;}/*** tostring方法*/@Overridepublic String toString() {return "RouterTable [distance=" + Arrays.toString(distance)+ ", nextHop=" + Arrays.toString(nextHop) + "]"; }}package entity;import java.util.Timer;import java.util.TimerTask;/*** 计时器类,用于判断是否路由器的联通* @author 郭金磊*@since 20131220*/public class TimeCounter {/*** 得到邻居的路由器ID*/private int sourceRouterId;/*** 得到本身路由器*/private Router router;/*** 每个这个类一个计时器*/private Timer timer=new Timer();/*** getters 和setters方法* @return 相应的属性值*/public int getSourceRouterId() {return sourceRouterId;}/*** getters 和setters方法* @return 相应的属性值*/public void setSourceRouterId(int sourceRouterId) {this.sourceRouterId = sourceRouterId;}/*** getters 和setters方法* @return 相应的属性值*/public Router getRouter() {return router;}/*** getters 和setters方法* @return 相应的属性值*/public void setRouter(Router router) {this.router = router;}/*** 默认的构造方法*/public TimeCounter() {super();}/*** 带参数的构造方法* @param sourceRouterId 邻居的路由器ID* @param router 得到本身路由器,可以得到本身路由器的很多信息*/public TimeCounter(int sourceRouterId, Router router) {super();this.sourceRouterId = sourceRouterId;this.router = router;}/*** 开启计时器*/public void start() {final long lastTime=router.getLastTimeMaps().get(sourceRouterId);timer.schedule(new TimerTask() {@Overridepublic void run() {if(lastTime==router.getLastTimeMaps().get(sourceRouterId)){for(int i=0;i<new NetMap().getInitInternetMap().length;i++){if(router.getRouterTable().getNextHop()[i]==sourceRouterId){router.getRouterTable().getDistance()[i]=16;router.getRouterTable().getNextHop()[i]=0;}}}else{timer.cancel();}}}, 10 * 1000);}/*** 关闭该计时器*/public void close() {timer.cancel();}}package main;import java.awt.BorderLayout;import java.awt.Color;import javax.swing.JFrame;import javax.swing.JTextArea;import mainManager.RouterThread;import mainManager.RoutersInit;import Map;import entity.Router;/*** 主进入界面,进入程序的主控制接口* @author 郭金磊*@since 20131220*/public class RoutersStart extends JFrame{/*** 产生全局唯一的序列化的实体ID*/private static final long serialVersionUID = -4212024082944256452L;/*** 建立一个全局的JTextArea,用来关闭时窗口是,关闭整个进程而不是线程*/private JTextArea router_MainArea;/*** 初始化多少个路由器*/public RoutersStart(){super("router_MainProcess");router_MainArea=new JTextArea();getContentPane().add(router_MainArea,BorderLayout.CENTER);router_MainArea.append("\n\n\n开始模拟"+newNetMap().getInitInternetMap().length+"个路由器的距离向量路由算法...");setBounds(150,150,500,400);router_MainArea.setBackground(Color.lightGray);setBackground(Color.DARK_GRAY);setVisible(true);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);int length=new NetMap().getInitInternetMap().length;Router[] routers=new RoutersInit().getInitRouters();for(int i=0;i<length;i++){new Thread(new RouterThread(routers[i])).start();}}/*** 主程序的入口* @param args 默认的参数,此处不用参数*/public static void main(String[] args) {new RoutersStart();}}package mainManager;import entity.Constant;import Map;import entity.Router;import entity.RouterTable;/*** 读取拓扑图的二维数组数据,来初始化二维数组维数个路由器线程* @author 郭金磊*@since 20131220*/public class RoutersInit {/*** 初始化路由器数组* @return 得到初始化的几个路由器*/public Router[] getInitRouters() {int[][] initNetMap=new NetMap().getInitInternetMap();Router[] routers=new Router[initNetMap.length];RouterTable [] routerTables=new RouterTable[initNetMap.length];for(int i=0;i<initNetMap.length;i++){routers[i]=newRouter(Constant.getRouterIdBasic()+i,Constant.getPortBasic()+i);routerTables[i]=new RouterTable();routerTables[i].setDistance(initNetMap[i]);int [] nextHop=new int[initNetMap.length];for(int j=0;j<initNetMap.length;j++){if(initNetMap[i][j]==1){nextHop[j]=Constant.getRouterIdBasic()+j;}else{nextHop[j]=0;}}routerTables[i].setNextHop(nextHop);routers[i].setRouterTable(routerTables[i]);System.out.println(routers[i]);}return routers;}}package mainManager;import java.awt.BorderLayout;import java.awt.Color;import java.awt.GridLayout;import java.awt.HeadlessException; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.ByteArrayOutputStream; import java.io.IOException;import java.io.ObjectOutputStream; import .DatagramPacket; import .DatagramSocket; import .InetAddress;import .SocketException; import .UnknownHostException; import java.util.Arrays;import javax.swing.JButton;import javax.swing.JCheckBox;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTextArea;import javax.swing.JTextField;import totalThreads.ForwardThread; import totalThreads.ReceiveThread; import totalThreads.SendThread; import transportPacket.SendDataPacket;import transportPacket.TotalPacket;import entity.Constant;import Map;import entity.Router;import entity.RouterTable;/*** 每一个路由器都有的路由器线程* @author 郭金磊*@since 20131220*/public class RouterThread extends JFrame implements Runnable {/*** 产生全局唯一的序列化的实体ID*/private static final long serialVersionUID = -9094445007188117205L; /*** 每一个路由器线程一个路由器实体*/private Router router;/*** 每一个路由器实体一个接受路由表线程*/private DatagramSocket receiveSocket =null;/*** 每一个路由器实体一个接受转发的数据线程*/private DatagramSocket receiveDataSocket =null;/*** 每个路由器线程一个接受线程*/private ReceiveThread receiveThread=null;/*** 每个路由器线程一个发送线程*/private SendThread sendThread=null;/*** 每个路由器线程一个转发线程*/private ForwardThread forwardThread=null;/*** 每个路由器线程一个主窗口*/private JFrame routerFrame;/*** 有三个显示路由器信息的JTextArea,一个路由表,一个路由表的更新信息,一个是发送数据的显示信息*/private JTextArea routerAreaLeft,routerAreaRightNorth,routerAreaRightSouth; // 构造路由器窗口的组件。