




已阅读5页,还剩12页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
网络原理实验报告编程模拟GBN姓名: 班级:学号:教师: 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) 实验平台:Eclipse(3) 引用库函数:.net库、随机(Random)库、计时库(Timer)6. 类概览与描述(1) Sender类:继承于Thread(线程)类,模拟发送方的 一切功能,主要功能函数有:A Public void run()启动函数,标识开始发送数据包B Sender()构造函数,分配并初始化窗口值C Public void getack(in tack)ACK接收函数,接收接收方返回的ACK并进行验证是否为期待的ACK值(若不是,则重发)D Public void time()定时器函数,初始化定时,计时并记录超时与否的状态(2) Receiver类:继承于Thread(线程)类,模拟接收方的一切功能,主要功能函数有:A Public void run()启动函数,标识开始等待并接收数据包B Void Receive(int data,Sender s)数据包接收函数,功能强大!主要包括:接收数据包,验证数据包,判断与丢弃数据包等C Public void respond(int ack)ACK发送函数,发送当前接收到的最后一次正确的数据包对应的ACK(3) Timers类:继承于TimerTask(计时器)类,具有自定义定时与超时提醒的功能,主要功能函数有:A Public void run()启动函数,标识开始计时(这里预设的是2秒的时间),超时后提醒并且停止计时器B Public Timers()构造函数,清0计时器,等待下一次启动(4) GBN类:继承于Thread(线程)类,是主函数类,具有本程序的核心功能,这里先作一部分简单介绍,主要函数功能有:A Static void senddelay(int x) throws InterruptedExceptionPublic Timers()随机延迟函数,模拟数据包发送传输过程中的随机延迟,常用延迟值分别为:300ms, 750ms, 1200ms, 3000ms等B Public static void main(String args) throws IOException, InterruptedException()主函数,功能强大,主要包含以下几大方面: 开启发送端与接收端(包括计时器) 超时或者ACK不匹配等情况导致的发送方 重新发送数据包 (第一次)发送当前窗口内的数据包 随机函数模拟数据包发送过程中的丢包情况 实时更新与显示当前窗口内的数据包情况 统计每一个数据包被发送过的次数(含重发)并最终显示出来7. 代码展示与描述(一) Sender类import java.util.Timer;public class Sender extends Threadpublic int windowsize=3; /发送方窗口长度设为3public String data=data1,data2,data3,data4,data5,data6,data7; /模拟七个数据包public int sign=0,1,2,3,4,5,6;/为7个数据包标号public int localack=-1;/保存最近收到的ACKpublic Timers litime=null;/定时器(这里定为2秒)public int switches=0;/超时标志,1为超时public int windowsign; /当前窗口内待发的数据分组的序号public int acksign=0; /为0表示收到正确ACK,为1表示收到错误的ACK,必须重发!public Sender()windowsign=new intwindowsize; /给窗口分配指定大小的空间 for(int i=0;i3;i+)windowsigni=signi; /窗口初始化时存放前3个序号public void run()System.out.println(发送方开始发送分组数据!);public void getack(int ack)System.out.println(发送方收到了ACK,序号为+ack+并且开始加以确认!);if(ack!=localack+1)System.out.println(经验证,这不是发送方正期待的ACK,立刻重发序号为+(localack+1)+的数据分组!);acksign=1;elselocalack=ack;/表示正确确认了ACKacksign=0;public void time()switches=0;/标志初始化为0litime=new Timers();Timer limit=new Timer();limit.schedule(litime, 0,100);(二) Receiver类import java.util.Random;public class Receiver extends Threadpublic int lastdata;public Sender sender;public void run(Sender s)sender=s;System.out.println(接收方开始接收分组数据!);void receive(int data, Sender s)sender=s;/发送方的参数传递System.out.println(接收方收到了序号为+data+的分组!);if(data!=0)if(data=lastdata+1)/数据包序号校验,若连续则是正确/所期待的System.out.println(该数据分组正是接收方所期待的,接收方接受了它并准备回送对应的ACK!);lastdata=data;/更新本地保存的数据包序号变量respond(lastdata);/回送该正确接收的数据包对应的ACKelseSystem.out.println(该数据分组不是接收方所期待的,该分组将被丢弃,接收方准备回送最后接受的数据分组对应的ACK!);respond(lastdata); /若不是所期待的数据包则丢弃并且重发上一次的ACKelseSystem.out.println(该数据分组正是接收方所期待的,接收方接受了它并准备回送对应的ACK!);lastdata=data;respond(lastdata); /首次接收数据包并且回送ACKvoid respond(int ack) /回送指定序号的ACKif(sender.litime.limit20) /判断是否超时(2秒)ack=lastdata; /获取本场保存的数据包序号sender.getack(ack);elseSystem.out.println(计时超时!(未丢包但是时间超过2秒)发送方准备重发序号为+ack+的数据分组!);sender.switches=1;/如果超时,设置超时状态并显示警告(三) Timers类import java.util.TimerTask;public class Timers extends TimerTask public int switches;public int limit;public void run()if(limit20) limit+;/计时2秒else switches=-1;this.cancel(); /开关为-1表示超时,并且停止计时器public Timers()switches=0;/启动计时器时全部初始化limit=0;(四) GBN类import .*;import java.util.Random;import java.io.*;public class GBN extends Thread static void senddelay(int x) throws InterruptedExceptionif(x=1) sleep(300); System.out.println(发送数据分组时发生延迟:300毫秒!); else if(x=2) sleep(750); System.out.println(发送数据分组时发生延迟:750毫秒!);else if(x=3) sleep(1200);System.out.println(发送数据分组时发生延迟:1200毫秒!);else if(x=4) sleep(3000);System.out.println(发送数据分组时发生延迟:3000毫秒!); else; public static void main(String args) throws IOException, InterruptedException Sender s=new Sender();Receiver re=new Receiver();s.start();/发送端启动re.run(s);/接收端启动sleep(1000);/延迟处理int retimes=new int7; /计算每个分组被发送的次数for(int i=0;i7;i+) retimesi=0;/数据包顺次发送for(int i=0;is.localack+1)/尚有未确认的数据包,重发!System.out.println(发送方开始重新发送序号为+(s.localack+1)+的数据分组);retimess.localack+1+;int ran=new Random().nextInt(3);int randelay=new Random().nextInt(5);s.time();senddelay(randelay);/设置随机值,模拟数据传输延迟if(ran!=1) re.receive(s.localack+1,s);/设置随机值,模拟数据丢包过程else System.out.println(序号为+(s.localack+1)+的分组在传给接收方途中发生了丢包!);if(i!=s.sign.length)System.out.println();System.out.println(发送方现在开始第一次发送序号为+i+的数据分组);retimesi+;if(i!=0)for(int k=0;k3;k+)/表示至少成功发送并确认了一个数据分组s.windowsignk+;/这种情况下滑动窗口向前移动!System.out.println();System.out.println(当前窗口内的分组情况为:);/显示当前窗口内数据包情况for(int p=0;p3;p+)if(s.windowsignp=6)System.out.println(第+p+号窗口里面存放的是序号为+s.windowsignp+的马上待发送的数据分组!);elseSystem.out.println(第+p+号窗口已经空了,并且后续窗口、发送方没有要发送的数据分组了!);System.out.println();int ran=new Random().nextInt(3);int randelay=new Random().nextInt(5);s.time();/计时开始(2秒时间)senddelay(randelay);/设置随机值,模拟数据传输延迟if(ran!=1) re.receive(s.signi,s);/设置随机
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 酒店预订与旅游管理中介创新创业项目商业计划书
- 自然语言处理在智能法律文档审查中的应用创新创业项目商业计划书
- 虚拟现实文化遗产保护创新创业项目商业计划书
- 智能化城市安防监控创新创业项目商业计划书
- 游戏主播培训学院创新创业项目商业计划书
- 动物源性食品创新营销研究创新创业项目商业计划书
- 智能车辆自动驾驶技术创新创业项目商业计划书
- 游戏直播内容创新大赛创新创业项目商业计划书
- 2025年环境影响评价公众参与中的公众教育与实践指南
- 2025年消费与零售行业消费者信任度调查报告001
- 2025年科研项目经理专业知识考试题目答案解析
- 2025广东肇庆市怀集县卫生事业单位招聘102人笔试模拟试题及答案解析
- 青马考试题目及答案
- 2024-2025学年广东省深圳市南山区四年级(下)期末数学试卷
- 算力中心计算任务优化方案
- 劳务派遣工作知识培训课件
- AutoCAD电气工程制图 课件 项目1 低压配电柜的绘制与识图
- 无人机反制设备原理课件
- 北京市2025年普通高中学业水平等级性考试政治试题(解析版)
- 2025年村干部考试试题(含答案)
- 新华书店招聘面试题库全攻略:行业知识、技能与面试技巧
评论
0/150
提交评论