




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、计算机网络实验报告(三) 编程实现可靠数据传输原理 GO-BACK-N(一)实验目的: 运用各种编程语言实现基于Go-Back-N 的可靠数据传输软件。通过本实验,使学生能够对可靠数据传输原理有进一步的理解和掌握。(2) 实验内容: (1).选择合适的编程语言编程实现基于Go-Back-N 的可靠数据传输软件。(2).在实际网络环境或模拟不可靠网络环境中测试和验证自己的可靠数据传输软件。(3) 实验原理:1.GBN协议含义:Go-Back-N ARQ中文翻译为后退N式ARQ、回退N式ARQ。该协议对传统的自动重传请求(ARQ,Automatic Repeat reQues)进行了改进,从而实现
2、了在接收到ACK之前能够连续发送多个数据包。在Go-Back-N ARQ中,发送端不需要在接收到上一个数据包的ACK后才发送下一个数据包,而是可以连续发送数据包。在发送端发送数据包的过程中,如果接收到对应已发送的某个数据包的NACK,则发送端将NACK对应的某个数据包进行重发,然后再将该数据包之后的数据包依次进行重发。后退N帧ARQ的图例:后退N帧ARQ就是从出错处重发已发出过的N个帧。2.Go-Back-N 的有限状态机模型表示如图所示:(a)(b)图3.1 Go-Back-N 的有限状态机模型(a)发送端 (b)接受端(4) 实验步骤: 在eclipse平台编写并调试GBN模拟java程序
3、,观察三组以上实验结果,验证程序可以正确模拟GBN的发送规则。(五)实验结果:以下为随机数模拟的某次发送情况:接收方开始接收分组数据!发送方开始发送分组数据!发送方现在开始第一次发送序号为0的数据分组当前窗口内的分组情况为:第0号窗口里面存放的是序号为1的马上待发送的数据分组!第1号窗口里面存放的是序号为2的马上待发送的数据分组!第2号窗口里面存放的是序号为3的马上待发送的数据分组!接收方收到了序号为0的分组!该数据分组正是接收方所期待的,接收方接受了它并准备回送对应的ACK!发送方收到了ACK,序号为0并且开始加以确认!发送方现在开始第一次发送序号为1的数据分组当前窗口内的分组情况为:第0号
4、窗口里面存放的是序号为2的马上待发送的数据分组!第1号窗口里面存放的是序号为3的马上待发送的数据分组!第2号窗口里面存放的是序号为4的马上待发送的数据分组!发送数据分组时发生 延迟:1200毫秒!接收方收到了序号为1的分组!该数据分组正是接收方所期待的,接收方接受了它并准备回送对应的ACK!发送方收到了ACK,序号为1并且开始加以确认!发送方现在开始第一次发送序号为2的数据分组当前窗口内的分组情况为:第0号窗口里面存放的是序号为3的马上待发送的数据分组!第1号窗口里面存放的是序号为4的马上待发送的数据分组!第2号窗口里面存放的是序号为5的马上待发送的数据分组!发送数据分组时发生延迟:750毫秒
5、!序号为2的分组在传给接收方途中发生了丢包!发送方开始重新发送序号为 2的数据分组发送数据分组时发生延迟:750毫秒!接收方收到了序号为2的分组!该数据分组正是接收方所期待的,接收方接受了它并准备回送对应的ACK!发送方收到了ACK,序号为2并且开始加以确认!发送方现在开始第一次发送序号为3的数据分组当前窗口内的分组情况为:第0号窗口里面存放的是序号为4的马上待发送的数据分组!第1号窗口里面存放的是序号为5的马上待发送的数据分组!第2号窗口里面存放的是序号为6的马上待发送的数据分组!发送数据分组时发生延迟:300毫秒!接收方收到了序号为3的分组!该数据分组正是接收方所期待的,接收方接受了它并准
6、备回送对应的ACK!发送方收到了ACK,序号为3并且开始加以确认!发送方现在开始第一次发送序号为4的数据分组当前窗口内的分组情况为:第0号窗口里面存放的是序号为5的马上待发送的数据分组!第1号窗口里面存放的是序号为6的马上待发送的数据分组!第2号窗口已经空了,并且后续窗口、发送方没有要发送的数据分组了!发送数据分组时发生延迟:750毫秒!接收方收到了序号为4的分组!该数据分组正是接收方所期待的,接收方接受了它并准备回送对应的ACK!发送方收到了ACK,序号为4并且开始加以确认!发送方现在开始第一次发送序号为5的数据分组当前窗口内的分组情况为:第0号窗口里面存放的是序号为6的马上待发送的数据分组
7、!第1号窗口已经空了,并且后续窗口、发送方没有要发送的数据分组了!第2号窗口已经空了,并且后续窗口、发送方没有要发送的数据分组了!发送数据分组时发生 延迟:1200毫秒!序号为5的分组在传给接收方途中发生了丢包!发送方开始重新发送序号为 5的数据分组序号为5的分组在传给接收方途中发生了丢包!发送方开始重新发送序号为 5的数据分组发送数据分组时发生 延迟:1200毫秒!接收方收到了序号为5的分组!该数据分组正是接收方所期待的,接收方接受了它并准备回送对应的ACK!发送方收到了ACK,序号为5并且开始加以确认!发送方现在开始第一次发送序号为6的数据分组当前窗口内的分组情况为:第0号窗口已经空了,并
8、且后续窗口、发送方没有要发送的数据分组了!第1号窗口已经空了,并且后续窗口、发送方没有要发送的数据分组了!第2号窗口已经空了,并且后续窗口、发送方没有要发送的数据分组了!发送数据分组时发生延迟:750毫秒!序号为6的分组在传给接收方途中发生了丢包!发送方开始重新发送序号为 6的数据分组发送数据分组时发生 延迟:3000毫秒!序号为6的分组在传给接收方途中发生了丢包!发送方开始重新发送序号为 6的数据分组发送数据分组时发生 延迟:3000毫秒!接收方收到了序号为6的分组!该数据分组正是接收方所期待的,接收方接受了它并准备回送对应的ACK!计时超时!(未丢包但是时间超过2秒)发送方准备重发序号为6
9、的数据分组!发送方开始重新发送序号为 6的数据分组发送数据分组时发生延迟:750毫秒!接收方收到了序号为6的分组!该数据分组不是接收方所期待的,该分组将被丢弃,接收方准备回送最后接受的数据分组对应的ACK!发送方收到了ACK,序号为6并且开始加以确认!当前窗口内的分组情况为:第0号窗口已经空了,并且后续窗口、发送方没有要发送的数据分组了!第1号窗口已经空了,并且后续窗口、发送方没有要发送的数据分组了!第2号窗口已经空了,并且后续窗口、发送方没有要发送的数据分组了!发送数据分组时发生延迟:300毫秒!序号为7的分组在传给接收方途中发生了丢包!以下是每个数据分组被发送过的次数的统计结果序号为0的数
10、据分组被发送过的次数为: 1序号为1的数据分组被发送过的次数为: 1序号为2的数据分组被发送过的次数为: 2序号为3的数据分组被发送过的次数为: 1序号为4的数据分组被发送过的次数为: 1序号为5的数据分组被发送过的次数为: 3序号为6的数据分组被发送过的次数为: 4(6) 问题总结:1. 编写GBN算法,要注意的是在模拟丢包的情况下,要在接收端阻止ack的回传和在发送端发现ack超时的情况下进行该包的重发,要注意整个7个包的传送组织结构和顺序;2. 进行模拟时,注意标注丢包及正确收到的flag值;3. 测试时应多运行几次,观察在各种随机传送情况下的总体的发送情况,来验证是否能满足GBN协议。
11、(7) 附录:java源代码:【GBN.java】import .*;import java.util.Random;import java.io.*;public class GBN extends Thread static void senddelay(int x) throws InterruptedException if(x=1) sleep(300); System.out.println(发送数据分组时发生延迟:300毫秒!); else if(x=2) sleep(750); System.out.println(发送数据分组时发生延迟:750毫秒!); else if(x=
12、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); /发送端启动 /接收端启动 /延迟
13、处理 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(); senddela
14、y(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+; for(int k=0;k3;k+) s.windowsignk+; System.out.println(
15、); System.out.println(当前窗口内的分组情况为:); for(int p=0;p3;p+) if(s.windowsignp=6) System.out.println(第+p+号窗口里面存放的是序号为+s.windowsignp+的马上待发送的数据分组!); else System.out.println(第+p+号窗口已经空了,并且后续窗口、发送方没有要发送的数据分组了!); System.out.println(); int ran=new Random().nextInt(3); int randelay=new Random().nextInt(5); s.tim
16、e(); /计时开始(2秒时间) senddelay(randelay); if(ran!=1) re.receive(s.signi,s); else System.out.println(序号为+i+的分组在传给接收方途中发生了丢包!); System.out.println();System.out.println(以下是每个数据分组被发送过的次数的统计结果); for(int i=0;i7;i+) /显示关于每个数据包发送次数的统计表 System.out.println(序号为+i+的数据分组被发送过的次数为: +retimesi); System.exit(0); 【Receive
17、r.java】public class Receiver extends Thread public 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)/数据包序号校验,若连续则是正确/所
18、期待的 System.out.println(该数据分组正是接收方所期待的,接收方接受了它并准备回送对应的ACK!); lastdata=data; /更新本地保存的数据包序号变量 respond(lastdata); /回送该正确接收的数据包对应的ACK else System.out.println(该数据分组不是接收方所期待的,该分组将被丢弃,接收方准备回送最后接受的数据分组对应的ACK!); respond(lastdata); /若不是所期待的数据包则丢弃并且重发上一次的ACK else System.out.println(该数据分组正是接收方所期待的,接收方接受了它并准备回送对应
19、的ACK!); lastdata=data; respond(lastdata); /首次接收数据包并且回送ACK void respond(int ack) if(sender.litime.limit20) ack=lastdata; sender.getack(ack); else System.out.println(计时超时!(未丢包但是时间超过2秒)发送方准备重发序号为+ack+的数据分组!); sender.switches=1; /如果超时,设置超时状态并显示警告 【Sender.java】import java.util.Timer;import java.util.Time
20、rTask;public class Sender extends Threadpublic int windowsize=3; /发送方窗口长度设为3public Stringdata=data1,data2,data3,data4,data5,data6,data7; /模拟七个数据包 public int sign=0,1,2,3,4,5,6; /为7个数据包标号public int localack=-1; public Timers litime=null; public int switches=0;public int windowsign;/当前窗口内待发的数据分组的序号public int acksign = 0; /为0表示收到正确ACK,为1表示收到错误的ACK,必须重发! public Sender() windowsign = new intwindowsize; /给窗口分配指定大小的空间 for(int i=0;i3
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 精装交付的购房合同范本
- 物业中介部租房合同范本
- 特色小镇项目的合同范本
- 电商入驻协议合同书范本
- 机器人售后维修合同范本
- 自愿放弃养老协议书模板
- 精装房定价出售合同范本
- 长山中学学生管理协议书
- 给老板签订保底合同范本
- 现金赠与避税协议书范本
- 风力发电风机基础施工方案
- 专职消防队和义务消防队的组织管理制度
- 卫生间防水补漏合同协议书模板
- 公租房运营管理服务方案(技术方案)
- 住宅区和住宅建筑通信配套工程技术标准 DG-TJ08-606-2022
- AQ/T 9009-2015 生产安全事故应急演练评估规范(正式版)
- 转让美容院店铺合同
- YC/T 613-2024烟草企业有限空间作业安全技术规范
- DZ∕T 0211-2020 矿产地质勘查规范 重晶石、毒重石、萤石、硼(正式版)
- 刮痧操作流程及评分标准
- 如何正确使用和佩戴劳动防护用品培训课件
评论
0/150
提交评论