网络基础学习知识原理实验报告_第1页
网络基础学习知识原理实验报告_第2页
网络基础学习知识原理实验报告_第3页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

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

文档简介

1、,.,.姓名:班级:学号:教师:1. 实验目的运用各种编程语言实现基于Go-Back-N的可靠数据传输软件。PS:这里使用的是JAVA 语言2. 实验意义通过本实验,使学生能够对可靠数据传输原理有进一步的理解和掌握。3. 实验背景Go-Back-N的有限状态机模型表示如下图所示:,.(a)(b)图为 Go-Back-N的有限状态机模型( a)发送端(b) 接受端4. 实验步骤( 1) 选择合适的编程语言编程实现基于 Go-Back-N 的可靠数据传输软件。( 2) 在实际网络环境或模拟不可靠网络环境中测试和验证自己的可靠数据传输软件。5. 实验环境,.( 1) 实验语言: JAVA( 2) 实

2、验平台: Eclipse( 3) 引用库函数: .net 库、随机( Random )库、计时库(Timer )6. 类概览与描述( 1) Sender 类:继承于 Thread (线程)类,模拟发送方的一切功能,主要功能函数有:A Public void run() 启动函数,标识开始发送数据包BSender() 构造函数,分配并初始化窗口值CPublic void getack(in tack) ACK 接收函数,接收接收方返回的 ACK 并进行验证是否为期待的 ACK 值(若不是,则重发)DPublic void time()定时器函数,初始化定时,计时并记录超时与否的状态( 2) Re

3、ceiver 类:继承于 Thread (线程)类,模拟接收方的一切功能,主要功能函数有:A Public void run() 启动函数,标识开始等待并接收数据包B Void Receive(int data,Sender s)数据包接收函数, 功能强大! 主要包括: 接收数据包,,.验证数据包,判断与丢弃数据包等CPublic void respond(int ack) ACK 发送函数,发送当前接收到的最后一次正确的数据包对应的 ACK( 3) Timers 类:继承于 TimerTask (计时器)类,具有自定义定时与超时提醒的功能,主要功能函数有:A Public void run(

4、) 启动函数,标识开始计时(这里预设的是2 秒的时间),超时后提醒并且停止计时器BPublic Timers()构造函数,清0 计时器,等待下一次启动( 4) GBN 类: 继承于 Thread (线程)类,是主函数类,具有本程序的核心功能,这里先作一部分简单介绍,主要函数功能有:AStaticvoidsenddelay(int x) throwsInterruptedExceptionPublic Timers()随机延迟函数,模拟数据包发送传输过程中的随机延迟,常用延迟值分别为:300ms, 750ms,1200ms, 3000ms等BPublicstaticvoidmain(String

5、 args)throws IOException, InterruptedException(),.主函数,功能强大,主要包含以下几大方面: 开启发送端与接收端(包括计时器) 超时或者 ACK 不匹配等情况导致的发送方重新发送数据包 (第一次)发送当前窗口内的数据包 随机函数模拟数据包发送过程中的丢包情况 实时更新与显示当前窗口内的数据包情况 统计每一个数据包被发送过的次数(含重发)并最终显示出来7. 代码展示与描述(一)Sender类publicclass SenderextendsThreadpublicint windowsize=3;/ 发送方窗口长度设为3publicStringda

6、ta = "data1" ,"data2","data3" ,"data4" ,"data5" ,"data6","data7" ;/ 模拟七个数据包publicint sign =0,1,2,3,4,5,6;/ 为 7个数据包标号publicint localack =-1;/ 保存最近收到的ACKpublicTimerslitime = null ;/ 定时器(这里定为2秒)publicint switches =0;/ 超时标志, 1为超时,.pub

7、licint windowsign;/ 当前窗口内待发的数据分组的序号publicint acksign =0;/ 为0表示收到正确 ACK ,为 1 表示收到错误的 ACK ,必须重发!publicSender()windowsign= newint windowsize;/ 给窗口分配指定大小的空间for (inti=0;i<3;i+)windowsigni= sign i;/ 窗口初始化时存放前3个序号publicvoidrun()System. out .println( " 发送方开始发送分组数据!" );publicvoidgetack( int ack)

8、System. out .println( " 发送方收到了 ACK ,序号为 "+ack+ "并且开始加以确认! ");if (ack!= localack +1)System. out .println(" 经验证,这不是发送方正期待的ACK ,立刻重发序号为 " +( localack +1)+ " 的数据分组! " );acksign =1;else localack =ack;/ 表示正确确认了ACK,.acksign =0;publicvoidtime()switches =0;/ 标志初始化为 0li

9、time = newTimers();Timer limit=new Timer();limit.schedule(litime , 0,100);(二)Receiver类importjava.util.Random;publicclass ReceiverextendsThreadpublicint lastdata ;publicSendersender ;publicvoidrun(Sender s)sender =s;System. out .println( " 接收方开始接收分组数据!" );voidreceive( int data, Sender s)sen

10、der =s;/ 发送方的参数传递System. out .println( " 接收方收到了序号为" +data+" 的分组! ");,.if (data!=0)if (data=lastdata +1)/ 数据包序号校验,若连续则是正确 / 所期待的System. out .println(" 该数据分组正是接收方所期待的,接收方接受了它并准备回送对应的ACK !");lastdata =data;/ 更新本地保存的数据包序号变量respond(lastdata );/ 回送该正确接收的数据包对应的ACKelse System.

11、out .println(" 该数据分组不是接收方所期待的,该分组将被丢弃,接收方准备回送最后接受的数据分组对应的ACK !");respond(lastdata );/ 若不是所期待的数据包则丢弃并且重发上一次的ACKelse System. out .println(" 该数据分组正是接收方所期待的,接收方接受了它并准备回送对应的ACK ! ");lastdata =data;respond( lastdata );/ 首次接收数据包并且回送ACK,.voidrespond(intack)/ 回送指定序号的ACKif (sender .litime

12、.limit <20)/ 判断是否超时(2 秒)ack= lastdata ;sender .getack(ack);/ 获取本场保存的数据包序号else System. out .println(" 计时超时!(未丢包但是时间超过2 秒)发送方准备重发序号为" +ack+ " 的数据分组! " );sender .switches =1;/ 如果超时,设置超时状态并显示警告(三)Timers类TimerTask if (limit <20)limit +;else switches =-1;this .cancel();/ 计时 2秒,./

13、 开关为 -1 表示超时,并且停止计时器publicTimers()switches =0;/ 启动计时器时全部初始化limit =0;(四)GBN 类publicclass GBNextendsThreadstaticvoidsenddelay(intx) throwsInterruptedExceptionif (x=1) sleep (300); System.out .println("发送数据分组时发生延迟:300 毫秒! "); else if (x=2) sleep (750); System.out .println( " 发送数据分组时发生延迟:

14、 750 毫秒! " );else if (x=3) sleep (1200);System.out .println("发送数据分组时发生延迟: 1200 毫秒! " );else if (x=4) sleep (3000);System.out .println("发送数据分组时发生延迟: 3000 毫秒! " );,.else ;publicstaticvoidmain(String args)throwsIOException,InterruptedException Sender s=newSender();Receiver re=n

15、ewReceiver();s.start();/ 发送端启动re.run(s);/ 接收端启动sleep(1000);/ 延迟处理int retimes=newint 7;/ 计算每个分组被发送的次数for (inti=0;i<7;i+) retimesi=0;/ 数据包顺次发送for (inti=0;i<=s.sign .length ;i+)while (i>s. localack +1)/ 尚有未确认的数据包, 重发!System. out .println(" 发送方开始重新发送序号为"+(s. localack +1)+ "的数据分组

16、" );retimess. localack +1+;int ran= newRandom().nextInt(3);intrandelay=new Random().nextInt(5);s.time();senddelay (randelay);/ 设置随机值,模拟数据传输延迟,.if (ran!=1) re.receive(s.localack +1,s);/ 设置随机值,模拟数据丢包过程else System. out .println(" 序号为 " +(s. localack +1)+ "的分组在传给接收方途中发生了丢包!" );i

17、f (i!=s. sign .length )System. out .println();System. out .println(" 发送方现在开始第一次发送序号为" +i+ "的数据分组 ");retimesi+;if (i!=0)for (int k=0;k<3;k+)/ 表示至少成功发送并确认了一个数据分组s.windowsignk+;/ 这种情况下滑动窗口向前移动!System. out .println();System. out .println(" 当前窗口内的分组情况为:");/ 显示当前窗口内数据包情况fo

18、r (intp=0;p<3;p+)if (s.windowsignp<=6),.System. out .println(" 第"+p+ " 号窗口里面存放的是序号为 "+s. windowsignp+ " 的马上待发送的数据分组!" );elseSystem. out .println(" 第"+p+ " 号窗口已经空了,并且后续窗口、发送方没有要发送的数据分组了!" );System. out .println();int ran= newRandom().nextInt(3);intrandelay=new Random().nextInt(5);s.time();/ 计时开始( 2 秒时间)senddelay (randelay);/ 设置随机值,模拟数据传输延迟if (ran!=1)re.receive(s. sign i,s);/ 设置随机值,模拟数据丢包过程else System. out .println(&

温馨提示

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

评论

0/150

提交评论