基于DV算法的路由器模拟设计与实现实验报告
物联网定位技术实验DV-Hop报告

物联网定位技术实验报告----------DV-Hop姓名学号:专业班级:物联网工程指导老师:完成时间:20170425目录实验一常用无线传感器网络定位算法实现与比较 (1)1实验背景 (1)2.实验目的 (1)3.使用的工具 (1)4.DV-Hop算法基本思想与基本原理 (1)5.实验详细设计 (1)实验一常用无线传感器网络定位算法实现与比较1实验背景DV-Hop定位机制由美国路特葛斯大学的DragosNiculescu等人提出的,DV-Hop算法是为了避免对节点间的距离直接进行测量而提出的一种基于距离矢量路由(根据目的地远近决定最好路径)的非测距定位算法。
非常类似于传统网络中的距离向量路由(从相邻站点收集网络列表,来路由选择)机制。
2实验目的2.实验目的1.(课堂完成)掌握典型的无线传感器网络定位算法基本原理,理解所讲的迭代式多边定位算法、DV-HOP算法、PDM定位算法、基于MDS的定位算法;2.(实验完成)利用所给的网络数据,实现两种以上的定位算法并进行比较。
3.使用的工具与语言工具:Visual studio语言:C#4.DV-Hop算法基本思想与基本原理(1)通过距离矢量路由方法使未知节点获得与信标节点之间的最小跳数(2)并计算出每跳的平均距离,然后以每跳平均距离和最小跳数的乘积作为未知节点与信标节点之间的估计距离,(3)再利用多边测量法获得未知节点的位置估算。
5.实验详细设计5.1本实验用到的基本数据类型Node(int NodeId,double x, do uble y,intisBeacon)//节点类NodeId—节点idX,y–节点的坐标isBeacon–是否为锚节点List<Node>NodeList–保存节点的信息Dictionary<int, int>hopCountTable–保存着路由信息double[,] d = newdouble[288, 32]; --锚节点i与锚节点j之间的实际距离path[b, c]–表示两点之间的跳数double avg --以锚节点i为基准,计算出的平均每跳距离本实验用到的计算方法是极大似然估计法double[,] A = newdouble[31, 2]; -- 表示如下A的信息double[] B = newdouble[31]; -- 表示如下B的信息double[] C = newdouble[2]; -- 表示如下X的值5.2.本实验用到的一些函数publicstaticvoid Floyd(int[,] path, int n)//找出两点最小跳数publicstaticdouble AvgHopSize(List<Node> list)//计算每跳的平均距离publicstaticvoid Multilateration(double[,] A, double[] B, double[] C)//多变定位本实验分四大阶段:第1阶段:读取信息---读取net1_pos.txt中的节点数据并存入List<Node>NodeList中,读取net1_topo-error free.txt中的节点距离数据,并存入string[] num中。
实训报告路由器配置

一、实训目的通过本次实训,掌握路由器的基本配置方法,了解路由器在网络中的作用,提高网络设备的配置与管理能力。
二、实训环境1. 路由器:华为AR系列路由器一台2. 交换机:华为S系列交换机一台3. 网线:直通网线若干4. 计算机若干5. 实验室网络环境:模拟企业局域网环境三、实训内容1. 路由器基本配置2. 路由器接口配置3. 路由协议配置4. 静态路由配置5. 动态路由配置6. 路由策略配置7. NAT配置8. 路由器安全配置四、实训步骤1. 路由器基本配置(1)连接路由器与计算机,使用Console线进入路由器配置模式。
(2)配置路由器基本参数,包括主机名、密码等。
(3)配置接口IP地址,确保路由器与交换机之间能够正常通信。
2. 路由器接口配置(1)查看路由器接口信息,了解接口状态。
(2)配置接口VLAN,实现不同VLAN之间的隔离。
(3)配置接口安全特性,如MAC地址绑定、IP源地址过滤等。
3. 路由协议配置(1)配置静态路由,实现不同网络之间的互通。
(2)配置动态路由协议,如RIP、OSPF等,实现网络自动路由。
4. 静态路由配置(1)查看路由表,了解当前网络的路由信息。
(2)配置静态路由,实现特定网络之间的互通。
5. 动态路由配置(1)配置RIP协议,实现网络自动路由。
(2)配置OSPF协议,实现网络自动路由。
6. 路由策略配置(1)配置路由策略,实现特定数据包的转发。
(2)配置策略路由,实现不同数据包的转发。
7. NAT配置(1)配置NAT地址池,实现内部网络访问外部网络。
(2)配置NAT转换,实现内部网络访问外部网络。
8. 路由器安全配置(1)配置ACL,实现访问控制。
(2)配置IPsec VPN,实现远程访问。
(3)配置端口安全,防止未授权访问。
五、实训结果通过本次实训,成功配置了路由器的基本参数、接口、路由协议、静态路由、动态路由、路由策略、NAT和路由器安全配置。
实现了不同网络之间的互通,满足了网络需求。
实验五 模拟路由器配置实验报告

实验五模拟路由器配置实验报告
一、实验目的
⏹了解路由器各部件、接口的特性
⏹通过使用路由器模拟软件来学习和掌握路由器配置的基本方法、用户接口模
式以及基本命令。
二、实验内容
⏹通过使用路由器模拟软件,利用不同模式下的命令,完成不同网
络拓扑结构情况下路由器各接口及其协议的配置和管理;
⏹通过常用的网络命令测试路由器配置结果和网络连通状态
四、实验过程
1.软件的熟悉:
接口的选择:
2.配置图
3、配置PC的IP地址Pc1的IP地址:
Pc2的IP地址:
Pc3的IP地址:
4.配置路由器RouterA的配置情况:
RouterB的配置情况:
RouterC 的配置情况:
5.实验结果:
六、实验心得
通过此次试验,我了解了路由器各部件、接口的特性;通过使用路由器模拟软件基本掌握了由器配置的基本方法、用户接口模式以及基本命令。
这次实验也加深了我对网络拓扑结构的认识,对什么是IP地址,什么是子网掩码,什么是默认网关等问题也有了更深一步的认识知道了在配置PC机的IP地址的时候必须要与路由器的网络号保持一致。
同时也反思了几点在实验过程中应该注意的几点:注意交换机与路由器的区别;注意命令模式中exit(返回上一级命令模式)与end(直接返回到特权模式)的区别;实验过程中要仔细认真,不能遗漏任何一个步骤。
最后,利用模拟软件还是有几条命令不能使用,我觉得以后最好能够有真实的路由器能让我们进行实验,毕竟在模拟软件上进行操作还是略显抽象。
路由器实训报告

路由器实训报告第一部分:引言在网络通信中,路由器是一种关键设备,负责将数据包从一个网络传输到另一个网络。
为了更好地了解并掌握路由器的工作原理和配置方法,我们进行了一次路由器实训。
本报告将详细介绍我们的实训内容、实训过程以及实训结果。
第二部分:实训目标我们的实训目标是通过实际操作,掌握以下内容:1. 路由器的基本概念和工作原理;2. 路由器的配置和管理方法;3. 路由器的故障排除和维护。
第三部分:实训内容在实训中,我们按照以下步骤进行操作:1. 硬件准备:购买路由器,并将其与电脑进行连接;2. 路由器的初始化配置:通过命令行界面(CLI)或Web界面,进行路由器的基本配置;3. 路由器的路由配置:配置路由表,使路由器能够正确地将数据包转发到目标网络;4. 网络连接测试:通过ping命令或其他工具,测试路由器与其他网络设备的连通性;5. 故障排除与维护:模拟一些常见的故障情况,如链路故障、IP地址冲突等,然后通过相应的方法进行排除和修复。
第四部分:实训过程在实训过程中,我们遇到了一些挑战:1. 基础知识不足:由于我们对路由器的了解相对较少,刚开始时遇到了一些困难。
但通过阅读相关资料和请教老师,逐渐弥补了这方面的不足;2. 配置命令复杂:路由器的配置命令较为复杂,需要熟悉并记忆各种命令及其参数。
通过反复练习和实际操作,我们逐渐掌握了常用命令;3. 故障排除难度大:在模拟故障排除时,由于故障种类繁多,有时需要一定的经验和思维逻辑才能找到问题所在。
通过和同学的讨论和老师的指导,我们逐渐提高了故障排除的能力。
第五部分:实训结果通过本次路由器实训,我们取得了以下成果:1. 理论知识掌握:我们对于路由器的基本概念和工作原理有了更深入的理解;2. 配置能力提升:我们学会了通过命令行界面或Web界面对路由器进行配置和管理;3. 故障排除技巧:通过模拟故障情况,我们掌握了一些故障排除的方法和技巧;4. 团队合作能力:在实训中,我们相互帮助、互相学习,提高了团队合作的能力。
路由器仿真软件实验报告

路由器仿真软件实验报告路由器仿真软件实验报告1、简介本实验报告旨在介绍路由器仿真软件的使用方法和实验结果。
通过仿真软件,我们可以模拟和测试各种网络场景中路由器的性能和功能。
2、实验环境设置在本实验中,我们使用了路由器仿真软件,并在一台个人电脑上进行了安装和配置。
实验所需的硬件和软件环境如下:- 个人电脑:操作系统Windows 10,处理器Intel Core i7,内存8GB- 路由器仿真软件:版本- 网络拓扑配置:3、实验目标本次实验的目标是:- 模拟一个复杂的网络拓扑,并验证路由器在该拓扑中的性能和功能。
- 测试不同路由器配置参数对网络性能和数据传输速度的影响。
- 分析路由器在各种网络故障情况下的表现,并评估其可靠性和鲁棒性。
4、实验步骤4.1 网络拓扑配置在路由器仿真软件中,设置所需的网络拓扑,包括路由器、交换机、主机等设备的连接和配置。
确保拓扑结构符合实验要求。
4.2 路由器配置对每个路由器进行配置,包括路由表配置、接口配置、路由协议配置等。
根据实验要求设置相应的参数。
4.3 数据包发送与接收在仿真软件中,网络流量,模拟数据包的发送和接收过程。
可以使用自定义的数据包,或者选择预定义的测试数据。
4.4 性能测试与分析通过监测路由器的性能指标,如转发速率、内存利用率等,评估路由器在实验环境下的性能表现。
针对不同配置和网络故障场景,进行性能测试和分析。
5、实验结果与讨论根据实验步骤中所进行的实验和性能测试,记录并整理实验结果。
对实验结果进行分析和讨论,比较不同配置和场景下的性能差异。
6、结论根据实验结果和分析,得出结论,总结路由器的性能和功能,以及对网络设计和优化的启示。
7、附件本文档附带了以下附件供参考:- 路由器仿真软件配置截图- 实验数据和性能指标记录表8、法律名词及注释请参阅附录部分。
路由器的配置实验报告

路由器的配置实验报告路由器的配置实验报告一、引言在现代网络通信中,路由器扮演着重要的角色。
路由器作为网络中的交通警察,负责将数据包从源地址发送到目标地址。
为了使路由器能够正常工作,需要进行相应的配置。
本文将介绍路由器的配置实验过程和结果。
二、实验目的本次实验的目的是熟悉路由器的配置过程,了解路由器的基本功能和参数设置。
通过实验,掌握如何设置路由器的IP地址、子网掩码、网关等参数,以及如何配置路由表。
三、实验步骤1. 连接路由器和电脑首先,将路由器和电脑通过网线连接起来。
确保连接的稳定性和正确性。
2. 登录路由器管理页面打开电脑上的浏览器,输入路由器的默认IP地址,进入路由器的管理页面。
输入正确的用户名和密码,登录路由器。
3. 设置IP地址在管理页面中找到“网络设置”或类似的选项,进入IP地址设置界面。
根据实际情况,设置合适的IP地址、子网掩码和网关。
确保设置的IP地址与电脑在同一个子网中。
4. 配置DHCP服务在管理页面中找到“DHCP服务器”或类似的选项,进入DHCP服务设置界面。
开启DHCP服务,设置IP地址分配的起始地址和结束地址,以及租期时间等参数。
5. 配置路由表在管理页面中找到“路由表”或类似的选项,进入路由表设置界面。
添加需要的路由条目,包括目标网络地址、子网掩码、下一跳地址等信息。
6. 保存并应用配置在完成以上设置后,点击“保存”或类似的按钮,保存配置信息。
然后点击“应用”或类似的按钮,使配置生效。
四、实验结果经过以上步骤的配置,我们成功完成了路由器的配置实验。
通过登录路由器管理页面,我们可以看到设置的IP地址、子网掩码、网关等参数已经生效。
DHCP服务成功开启,并能够为连接到路由器的设备分配IP地址。
路由表中添加的路由条目也能够正常工作,实现了数据包的正确转发。
五、实验总结通过本次实验,我们对路由器的配置过程有了更深入的了解。
路由器的配置需要注意各个参数的设置,确保网络的正常运行。
路由器实验报告1

路由器实验报告11. 引言本实验主要目的是通过对路由器的实验观察和实际操作,深入了解路由器的工作原理、配置和性能。
通过本实验,我们将能够更好地理解和运用路由器,提升网络的稳定性和性能。
2. 实验设备和配置本次实验使用的设备为一台常见的路由器,并根据实验要求进行了相应的配置,主要包括以下几个方面:2.1 路由器类型:在本次实验中,我们选择了一台用于家庭网络的无线路由器。
2.2 网络拓扑:基于实验的需求,我们搭建了一个简单的网络拓扑,包括一个主机和两个子网。
主机通过无线方式连接到路由器,而子网则由有线方式连接到路由器。
2.3 IP地址和子网掩码配置:根据网络拓扑,我们为每个子网配置了独立的IP地址和子网掩码,以确保网络通信的正常进行。
2.4 路由器配置:为了实现本实验的目标,我们对路由器进行了以下几个重要配置:- 配置路由器的管理地址和密码,以便于我们远程管理和操作路由器。
- 配置路由器的无线网络名称(SSID)和密码,以提供无线网络服务。
- 配置路由器的端口映射和QoS(Quality of Service)策略,以实现网络流量控制和优先级调整。
3. 实验步骤和观察结果在本次实验中,我们按照以下步骤进行了实验,并观察了相应的结果:3.1 路由器的基本操作和管理我们首先进行了路由器的基本操作,包括登录、查看和修改路由器的配置信息等。
通过观察,我们对路由器的管理界面和操作流程有了更加直观和深入的认识。
3.2 无线网络设置和连接在本次实验中,我们设置了路由器的无线网络名称(SSID)和密码,并尝试连接该网络。
通过观察,我们验证了无线网络的可用性和安全性。
3.3 端口映射和QoS配置为了实现网络流量的控制和优化,我们对路由器进行了端口映射和QoS配置。
我们通过观察网络传输速度和响应时间的变化,评估了配置的效果。
4. 实验结果分析通过以上实验步骤和观察结果,我们得出了以下几个结论:4.1 路由器的管理功能很强大,我们可以通过管理界面对路由器进行各种设置和配置,方便我们进行远程管理和维护。
路由器实习报告

实习报告:路由器实习体验一、实习背景随着互联网的普及和信息技术的飞速发展,路由器作为网络通信的重要设备,其在现代社会中的作用日益凸显。
为了更好地了解路由器的原理和应用,提高自己的实践能力,我选择了路由器实习项目。
本次实习主要涉及路由器的安装、配置、调试和维护等方面。
二、实习内容1. 路由器的基本概念和原理在实习过程中,我首先学习了路由器的基本概念和原理。
路由器是一种网络层设备,主要用于实现不同网络之间的数据传输和路由选择。
它通过分析数据包的目的地址,根据路由表确定数据包的下一跳路径,从而实现网络之间的互联。
2. 路由器的硬件组成实习过程中,我对路由器的硬件组成有了更深入的了解。
路由器主要由处理器、内存、接口、电源等部分组成。
其中,处理器负责路由器的数据处理和转发;内存用于存储路由表、操作系统和运行数据等;接口用于连接网络设备;电源则为路由器提供稳定的电力供应。
3. 路由器的软件系统路由器的软件系统是实现其功能的核心部分。
实习过程中,我学习了路由器的操作系统,如IP路由、静态路由、动态路由等。
此外,还了解了路由器的配置方法,包括命令行接口(CLI)配置、图形化界面配置等。
4. 路由器的调试与维护在实习过程中,我参与了路由器的调试和维护工作。
通过实际操作,掌握了路由器的基本调试命令,如ping、tracert等。
在遇到问题时,能够根据现象分析原因,采取相应的措施解决问题。
此外,我还学习了路由器的日常维护方法,如查看运行日志、分析系统性能等。
三、实习收获1. 提高了自己的实际操作能力。
通过实习,我能够熟练地操作路由器,进行基本的配置和调试。
2. 加深了对路由器原理和应用的理解。
通过实习,我对路由器的工作原理和应用场景有了更深入的了解,为今后的工作和学习打下了基础。
3. 增强了团队协作能力。
在实习过程中,我与同学们共同解决问题,分工合作,提高了自己的团队协作能力。
4. 拓宽了视野。
实习过程中,我了解了路由器在现代通信领域的重要地位,以及我国在路由器技术方面的最新进展。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于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所示:在程序的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 = -04L;/*** 路由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 = 31L;/*** 为每一个路由器设置一个下一跳的数组*/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 = -52L;/*** 建立一个全局的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开始模拟"+new NetMap().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 = -05L;/*** 每一个路由器线程一个路由器实体*/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; // 构造路由器窗口的组件。