资源描述:
《网络原理实验报告(GBN)》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、网络原理实验报告——编程模拟GBN姓名:班级:学号:教师:1.实验目的运用各种编程语言实现基于Go-Back-N的可靠数据传输软件。PS:这里使用的是JAVA语言2.实验意义通过本实验,使学生能够对可靠数据传输原理有进一步的理解和掌握。3.实验背景Go-Back-N的有限状态机模型表示如下图所示:(a)(b)图为Go-Back-N的有限状态机模型(a)发送端(b)接受端1.实验步骤(1)选择合适的编程语言编程实现基于Go-Back-N的可靠数据传输软件。(2)在实际网络环境或模拟不可靠网络环境中测试和验证自己的可靠数据传输软件。2.实验环境(1)
2、实验语言:JAVA(2)实验平台:Eclipse(3)引用库函数:.net库、随机(Random)库、计时库(Timer)3.类概览与描述(1)Sender类:继承于Thread(线程)类,模拟发送方的一切功能,主要功能函数有:A.Publicvoidrun()——启动函数,标识开始发送数据包B.Sender()——构造函数,分配并初始化窗口值C.Publicvoidgetack(intack)——ACK接收函数,接收接收方返回的ACK并进行验证是否为期待的ACK值(若不是,则重发)D.Publicvoidtime()——定时器函数,初始化定时,
3、计时并记录超时与否的状态(2)Receiver类:继承于Thread(线程)类,模拟接收方的一切功能,主要功能函数有:A.Publicvoidrun()——启动函数,标识开始等待并接收数据包B.VoidReceive(intdata,Senders)——数据包接收函数,功能强大!主要包括:接收数据包,验证数据包,判断与丢弃数据包等C.Publicvoidrespond(intack)——ACK发送函数,发送当前接收到的最后一次正确的数据包对应的ACK(1)Timers类:继承于TimerTask(计时器)类,具有自定义定时与超时提醒的功能,主要功
4、能函数有:A.Publicvoidrun()——启动函数,标识开始计时(这里预设的是2秒的时间),超时后提醒并且停止计时器B.PublicTimers()——构造函数,清0计时器,等待下一次启动(2)GBN类:继承于Thread(线程)类,是主函数类,具有本程序的核心功能,这里先作一部分简单介绍,主要函数功能有:A.Staticvoidsenddelay(intx)throwsInterruptedExceptionPublicTimers()——随机延迟函数,模拟数据包发送传输过程中的随机延迟,常用延迟值分别为:300ms,750ms,1200
5、ms,3000ms等A.Publicstaticvoidmain(String[]args)throwsIOException,InterruptedException()——主函数,功能强大,主要包含以下几大方面:①开启发送端与接收端(包括计时器)②超时或者ACK不匹配等情况导致的发送方重新发送数据包③(第一次)发送当前窗口内的数据包④随机函数模拟数据包发送过程中的丢包情况⑤实时更新与显示当前窗口内的数据包情况⑥统计每一个数据包被发送过的次数(含重发)并最终显示出来1.代码展示与描述(一)Sender类importjava.util.Timer
6、;publicclassSenderextendsThread{publicintwindowsize=3;//发送方窗口长度设为3publicString[]data={"data1","data2","data3","data4","data5","data6","data7"};//模拟七个数据包publicintsign[]={0,1,2,3,4,5,6};//为7个数据包标号publicintlocalack=-1;//保存最近收到的ACKpublicTimerslitime=null;//定时器(这里定为2秒)publicintswi
7、tches=0;//超时标志,1为超时publicintwindowsign[];//当前窗口内待发的数据分组的序号publicintacksign=0;//为0表示收到正确ACK,为1表示收到错误的ACK,必须重发!publicSender(){windowsign=newint[windowsize];//给窗口分配指定大小的空间for(inti=0;i<3;i++)windowsign[i]=sign[i];//窗口初始化时存放前3个序号}publicvoidrun(){System.out.println("发送方开始发送分组数据!");
8、}publicvoidgetack(intack){System.out.println("发送方收到了ACK,序号为"+ack+"并且