基于DV算法的路由器模拟设计与实现实验报告_第1页
基于DV算法的路由器模拟设计与实现实验报告_第2页
基于DV算法的路由器模拟设计与实现实验报告_第3页
基于DV算法的路由器模拟设计与实现实验报告_第4页
基于DV算法的路由器模拟设计与实现实验报告_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基于DV算法的路由器设计与实现实验报告学 院:姓 名:日 期:一 实验目的1深入理解分布式路由选择算法,以最简单的DV算法来增强对路由算法的 认识2理解、掌握和利用距离向量算法3所实现的路由器模拟Internet上的IP路由器。它能确定网络的最短路由,并在这些利用上传输分组二 DV算法描述 距离矢量算法,也称为Bellman-Ford shortest path algorithm,每个路由器都定期或拓扑结构突发变化时与其相邻的所有路由器交换路由表,据此更新它们自己的路由表。 DV算法工作方式:每个路由器维护一路由表,表中分为三个表项:目的地址,列出了当前可达的目的网络地址;到达目的地址下一跳

2、,列出了下一跳的IP地址;到达目的地址的代价,以距离或跳数为表征。 路由表更新规则: 1发现了一条到达某目的的新路由,而该路由在原来的路由表中不存在(即发现了一条新路由),则在路由表中增加该路由。 2发现了一条到达某目的的、距离更短的新路由,则用该路由替换原有的路由。 3到达某目的的一条路由,其后继结点到达该目的地的距离发生了变化,则需要更新该路由的距离。 在此实验当中,为了实现和模拟的方便,刚开始初始化生成一个网络连接图的二维数组(见mainManager/RoutersInit.java,初始化的二维数组是entity/NetMap.java);每个路由器类包括了路由器ID,端口,rout

3、erTable对象,还有两个HashMap(一个存储为每一个相邻路由器的计时器,一个存储每一个相邻路由器的上一次交流时间);路由表采用了两个数组来实现,一个数组存储到各个网络的下一跳,一个数组存储到各个网络的跳数,如下结构,以路由器一为例,(路由表的默认数组和两个真是数组的显示信息,其中下一跳是0表示不可达的下一跳,不是0如2004表示下一跳是2004,在距离数组里,如果是16表示不可达,如果是0,表示到本身路由,不是0或16表示可达且跳数为该数值),如下图路由表左边方框中的信息 所示: 在路由表中,只登记下一跳而不是完整路由,以真实模拟路由器的DV算法处理。转发分组时,严格按照路由表进行转发

4、。如上图,路由器的连接信息在上面图片的左部区域,右部区域分为两部分(一个是路由器接到相邻路由器发来的路由表的实时-我设置的是每1秒更新一次-信息,一个是发送或者转发数据的显示信息)。三 实验要求 1输出路由表:在此实验当中为了实现方便,所有拓扑结构中的路由器都给以显示(可达的,不可达的16以与自己的路由编号):要求对这个连接图的二维数组解析,进行DV算法的模拟。 2发送分组:每个数字代表一个数据分组发送请求;数据分组发送到数字代表的目的地;如果目的结点不是邻居结点,不能直接发送分组,而必须在路由的各个结点上沿路由转发该分组。收到数据分组的结点必须输出一行,显示该分组的目的,在图1中的右上角显示

5、了每一秒的路由表的更新情况,每一个路由器都有三个转发进程,发送进程和接收进程。发送进程每一秒都需要发送自己的路由表信息。每一个路由器都给自己相邻的路由器设置了一个计时器,如果10秒钟没有收到相邻路由器的信息,就将下一跳设置成0,距离设置成16(表示不可达)。否则重新开始计数。2发送数据:数据分组必须有数据,且在如图1中的点击提交按钮之前,必须在文本框中输入正确的数据格式(传送的目的路由和要传送的数据之间必须要有“#”号分割),如:2003#DDDDDDD,表示目的路由是2003,传送的数据是DDDDDDD。例如:路由器2006要向2001发送数据,则具体转发过程如下:在RouterTableP

6、acket 中有Hops(初始值是16,每过一跳,hops减1,当hops是1的时候,就不再进行转发了,相当于TTL:Time to Live)属性,分组应该在Hops规定的时间或步数到达目的结点,否则丢弃之。分组经过每个中间结点时,将其TTL减1。若TTL=1,丢弃,否则继续转发。 3关于时间定时:每个路由器每1秒钟发出它们的路由表;每个路由器根据收到的路由表更新它们自己的路由表;路由器必须具备检测邻居是否活动的能力,如果路由器在10秒钟没有收到邻居发来的更新,则认为邻居不可达。 4显示活动的相邻路由:用一个特定的表格来显示与当前路由相邻的路由器的信息。 5关于拓扑结构:路由器必须具备路由器

7、故障和恢复的能力;这里假设链路不会出现故障,分组不会丢失和出错;如果路由器在给定时间未运行,表示路由器故障,如果重启运行,则认为路由器故障恢复;当然,假设通信是双向的。四 实验用例编程语言:java;开发环境:jdk1.6.0_02、Myeclipse8.6, 测试用例为二维数组的维数个(你可以随便写出一个对称的二维数组,程序可以自己解析的,我用的都是活代码),如下如所示我写的一个拓扑图的二维数组,如图: 此实验是模仿DV算法,应用java中的多线程来模拟多个路由器,并且实现路由器之间的路由表和数据的传送。实验中路由表的数据结构相比真实的DV算法发生了变化,所以程序在实现过程当中尽量的按照实验

8、所用的路由表结构来完成功能,但是这不影响其主要思想的实现。 1拓扑结构: 为了模拟路由表的更新,首先是先确立六个结点网络的拓扑结构,由于是应用多线程来模拟各个路由器,所以在实验过程当中可以随时挂起某个或多个路由器来模拟网络拓扑的变化,之后仍然可以恢复挂起的路由器。网络的初始拓扑结构如图2所示:端口号:50012002端口号:2005端口号:5002端口号:5004端口号:5003端口号:200620032001200520042006图 2 此处,路由表的端口号和路由器号全是来自entity/Constant.java文件的整个程序的全局变量,路由器初始值为2001,而端口初始值为5001,分

9、别是数组初始化时的维数个。 在实验实现过程当中,通过路由器线程的挂起实现网络拓扑结构的动态变化,之后会对相应的更该重新画出拓扑结构。 2路由表初始化: 在程序的mainManager/RoutersInit.java 类中初始化了留个路由器,这六个路由器的每一个实现都是在mainManager/RouterThread.java类中,。以上图2的初始化二维数组中所规划的网络拓扑结构为标准,根据当前所创建的路由器编号静态初始化每个路由器自己的路由表。 3数据格式: 各个路由器实例之间通过UDP来交换路由表,路由器之间还需要进行数据的传输。在此,需要定义所传输的路由表和数据的结构,我是全部打成了数

10、据包或者路由表包,具体结构见transportPacket/RouterTablePacket.java(有sourceRouterId和routerTable两个属性),transportPacket/SendDataPacket.java(有sourceRouterId,destRouterId,bytedata,hops=16四个属性),transportPacket/TotalPacket.java(有type,routerTablePacket,sendDataPacket 三个属性,TotalPacket类定义了具体具体是传输的包是什么类型的) 三个类,如果是传输路由表就用Rout

11、erTablePacket把路由表包装后再用TotalPacket的sendRouterTable类型来包装,最后用UDP发送出去,如果是传输数据就用SendDataPacket把要传送的数据包装后再用TotalPacket的sendData类型来包装,最后用UDP发送出去,在目的路由器端对收到的数据进行解封装。五程序描述 为完成所要求功能,程序首先实现了二维数组维数个路由器线程,每一个路由器线程下面又实现了发送线程、接收线程和转发数据线程三个子线程;接收线程下面实现了定时器子线程。建立一个工程,命名为day12-02_DV_new_hasTimer(名字可以随便起,我是以前的习惯都加上了日期

12、),在此工程下建立源程序文件,每个线程放在单独的java源程序文件当中。该实验还可以对其中一个路由器进行挂起,别的路由器在10秒后如果收不到这个路由器发来的路由表信息,就将其路由表中的与其对应的相应路由表的值进行修改成不可达,逐渐通知到整个网络。在这里有点不同于DV算法的是:DV算法是每个路由器为收到的路由表的每一个简历一个计时器,而该路由器简化了这个设计,是仅仅为相邻的路由器保留一个计时器,这样不仅可以大大减少整个网络的通信量,将计时器的信息保留在存而不是在路由表中,而且采用了hashMap保存后在验证是否联通时,从hashMap中取数据方便快捷。六、实验结论 在实验过程遇到了许多问题,一方

13、面是编程语言的使用,另一方面是对路由算法的理解程度。三是计时器的用法,尤其是计时器的用法想了将近2个小时,最后通过不懈的调试与算法完善,程序基本实现所要求的功能,有能力模拟DV算法。DV算法的优缺点:DV算法简单,容易实现,对于好消息传播的速度快,但是对于坏消息则传播速度慢。package entity;/* * 常量类 * author 郭金磊 *since 20131220 */public class Constant /* * return 返回路由Id的初试值 */public static int getRouterIdBasic()return 2001;/* * return

14、返回路由端口的初试值 */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

15、,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 router

16、Id;/* * 路由端口 */private int port;/* * 路由表 */private RouterTable RouterTable;/* * 存储计时器的Map */private HashMap<Integer,TimeCounter> createTimerMapsForNeighbers=new HashMap<Integer,TimeCounter>();/* * 存储上一次该路由器收到某个路由器的路由表时间 */private HashMap<Integer,Long> lastTimeMaps=new HashMap<In

17、teger,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 =

18、 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;

19、/* * 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;/* * gette

20、rs 和setters方法 * return 相应的属性值 */public HashMap<Integer, TimeCounter> getCreateTimerMapsForNeighbers() return createTimerMapsForNeighbers;/* * getters 和setters方法 * return 相应的属性值 */public void setCreateTimerMapsForNeighbers(HashMap<Integer, TimeCounter> createTimerMapsForNeighbers) this.cr

21、eateTimerMapsForNeighbers = createTimerMapsForNeighbers;/* * getters 和setters方法 * return 相应的属性值 */public HashMap<Integer, Long> getLastTimeMaps() return lastTimeMaps;/* * getters 和setters方法 * return 相应的属性值 */public void setLastTimeMaps(HashMap<Integer, Long> lastTimeMaps) this.lastTimeMa

22、ps = 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

23、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;/* * gett

24、ers 和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方法 */Over

25、ridepublic 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 TimeC

26、ounter /* * 得到邻居的路由器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 setSourceRou

27、terId(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();/* * 带参数的构造

28、方法 * 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.s

29、chedule(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(

30、)i=0;elsetimer.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 entity.NetMap;import enti

31、ty.Router;/* * 主进入界面,进入程序的主控制接口 * author 郭金磊 *since 20131220 */public class RoutersStart extends JFrame/* * 产生全局唯一的序列化的实体ID */private static final long serialVersionUID = -52L;/* * 建立一个全局的JTextArea,用来关闭时窗口是,关闭整个进程而不是线程 */private JTextArea router_MainArea;/* * 初始化多少个路由器 */public RoutersStart()super(&

32、quot;router_MainProcess");router_MainArea=new JTextArea();getContentPane().add(router_MainArea,BorderLayout.CENTER);router_MainArea.append("nnn开始模拟"+new NetMap().getInitInternetMap().length+"个路由器的距离向量路由算法.");setBounds(150,150,500,400);router_MainArea.setBackground(Color.ligh

33、tGray);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(routersi).start();/* * 主程序的入口 * param arg

34、s 默认的参数,此处不用参数 */public static void main(String args) new RoutersStart();package mainManager;import entity.Constant;import entity.NetMap;import entity.Router;import entity.RouterTable;/* * 读取拓扑图的二维数组数据,来初始化二维数组维数个路由器线程 * author 郭金磊 *since 20131220 */public class RoutersInit /* * 初始化路由器数组 * return 得到

35、初始化的几个路由器 */public Router getInitRouters() int initNetMap=new NetMap().getInitInternetMap();Router routers=new RouterinitNetMap.length;RouterTable routerTables=new RouterTableinitNetMap.length;for(int i=0;i<initNetMap.length;i+)routersi=new Router(Constant.getRouterIdBasic()+i,Constant.getPortBas

36、ic()+i);routerTablesi=new RouterTable();routerTablesi.setDistance(initNetMapi); int nextHop=new intinitNetMap.length;for(int j=0;j<initNetMap.length;j+)if(initNetMapij=1)nextHopj=Constant.getRouterIdBasic()+j;elsenextHopj=0;routerTablesi.setNextHop(nextHop);routersi.setRouterTable(routerTablesi);

37、System.out.println(routersi);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.e

38、vent.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.utton;import javax.swin

39、g.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 transportPacke

40、t.SendDataPacket;import transportPacket.TotalPacket;import entity.Constant;import entity.NetMap;import entity.Router;import entity.RouterTable;/* * 每一个路由器都有的路由器线程 * author 郭金磊 *since 20131220 */public class RouterThread extends JFrame implements Runnable /* * 产生全局唯一的序列化的实体ID */private static final l

41、ong serialVersionUID = -05L;/* * 每一个路由器线程一个路由器实体 */private Router router;/* * 每一个路由器实体一个接受路由表线程 */private DatagramSocket receiveSocket =null;/* * 每一个路由器实体一个接受转发的数据线程 */private DatagramSocket receiveDataSocket =null;/* * 每个路由器线程一个接受线程 */private ReceiveThread receiveThread=null;/* * 每个路由器线程一个发送线程 */pr

42、ivate SendThread sendThread=null;/* * 每个路由器线程一个转发线程 */private ForwardThread forwardThread=null;/* * 每个路由器线程一个主窗口 */private JFrame routerFrame;/* * 有三个显示路由器信息的JTextArea,一个路由表,一个路由表的更新信息,一个是发送数据的显示信息 */private JTextArea routerAreaLeft,routerAreaRightNorth,routerAreaRightSouth; / 构造路由器窗口的组件。/* * 提示信息三个

43、请输(目的路由#数据),该路由器路由表信息,路由转发和数据转发的信息 */private JLabel commandPrompt,showMsgLink,showMsgForward;/* * 选择是否挂起该路由的提示 */private JLabel suspended;/* * 写出要达到的目的地和要发送的数据 */private JTextField enterField;/* * 提交数据 */private utton submit;/* * 选择是否挂起该路由 */private JCheckBox selectSuspend;/* * 是否挂起该路由的置变量布尔值 */publ

44、ic boolean suspendFlag = false;/* * 显示几个panal,用于承载所有的组件。 */private JPanel firstLine, secondLine,centerArea,centerAreaLeft,centerAreaRight,centerAreaRightBorderCenter;/* * 默认的构造方法 */public RouterThread() super();/* * 进行本路由器注入的构造方法 * param router 每个路由器进程要注入的路由器(注入又叫控制反转) */public RouterThread(Router r

45、outer) try this.router = router;routerFrame = new JFrame("路由器"+router.getRouterId()+"_DV算法模拟_郭金磊2620139012");commandPrompt = new JLabel("请输(目的路由#数据):");suspended = new JLabel("选择是否使该路由发生挂起: ");enterField = new JTextField("如2003#AAA",100);submit=new u

46、tton("提交");submit.setSize(20,10);selectSuspend = new JCheckBox("开始挂起.");firstLine = new JPanel();secondLine = new JPanel();centerArea = new JPanel();centerAreaLeft = new JPanel();centerAreaRight = new JPanel();centerAreaRightBorderCenter = new JPanel();firstLine.setLayout(new Gri

47、dLayout(1, 2);secondLine.setLayout(new GridLayout(1, 2);centerArea.setLayout(new GridLayout(1, 2);centerAreaLeft.setLayout(new BorderLayout();centerAreaRight.setLayout(new BorderLayout();centerAreaRightBorderCenter.setLayout(new GridLayout(2,1);firstLine.add(commandPrompt);firstLine.add(enterField);

48、firstLine.add(submit);secondLine.add(suspended);secondLine.add(selectSuspend);enterField.setCaretPosition(enterField.getText().length();showMsgLink = new JLabel("以下是该路由器路由表信息: ");/"以下路由显示转发的信息:"showMsgLink.setOpaque(true);showMsgLink.setBackground(Color.pink);showMsgForward = new

49、 JLabel("以下路由转发和数据转发的信息:");showMsgForward.setOpaque(true);showMsgForward.setBackground(Color.pink);routerAreaLeft=new JTextArea();routerAreaRightNorth=new JTextArea();routerAreaRightSouth=new JTextArea();routerAreaLeft.setBackground(Color.YELLOW);routerAreaRightNorth.setBackground(Color.GR

50、EEN);routerAreaRightSouth.setBackground(Color.WHITE);JScrollPane scrollPaneLeft=new JScrollPane(routerAreaLeft);JScrollPane scrollPaneRightNorth=new JScrollPane(routerAreaRightNorth);JScrollPane scrollPaneRightSouth=new JScrollPane(routerAreaRightSouth);centerAreaLeft.add(showMsgLink,BorderLayout.NO

51、RTH);centerAreaLeft.add(scrollPaneLeft,BorderLayout.CENTER);centerAreaRight.add(showMsgForward,BorderLayout.NORTH);centerAreaRightBorderCenter.add(scrollPaneRightNorth);centerAreaRightBorderCenter.add(scrollPaneRightSouth);centerAreaRight.add(centerAreaRightBorderCenter,BorderLayout.CENTER);centerArea.add(centerAreaLeft);centerArea.add(centerAreaRight);routerFrame.add(firstLine, BorderLayout.NORTH);routerFrame.add(centerArea,BorderLayout.CENTER);routerFr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论