计算机网络原理实验七传输层可靠传输协议GBN编程实验报告.docx

上传人:b****4 文档编号:3595367 上传时间:2022-11-24 格式:DOCX 页数:9 大小:304.47KB
下载 相关 举报
计算机网络原理实验七传输层可靠传输协议GBN编程实验报告.docx_第1页
第1页 / 共9页
计算机网络原理实验七传输层可靠传输协议GBN编程实验报告.docx_第2页
第2页 / 共9页
计算机网络原理实验七传输层可靠传输协议GBN编程实验报告.docx_第3页
第3页 / 共9页
计算机网络原理实验七传输层可靠传输协议GBN编程实验报告.docx_第4页
第4页 / 共9页
计算机网络原理实验七传输层可靠传输协议GBN编程实验报告.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

计算机网络原理实验七传输层可靠传输协议GBN编程实验报告.docx

《计算机网络原理实验七传输层可靠传输协议GBN编程实验报告.docx》由会员分享,可在线阅读,更多相关《计算机网络原理实验七传输层可靠传输协议GBN编程实验报告.docx(9页珍藏版)》请在冰豆网上搜索。

计算机网络原理实验七传输层可靠传输协议GBN编程实验报告.docx

计算机网络原理实验七传输层可靠传输协议GBN编程实验报告

计算机网络原理实验七、传输层可靠传输协议GBN编程实验报告

实验七、传输层可靠传输协议GBN编程实验报告

序号:

姓名:

学号:

成绩指导老师:

一、实验目的:

1、通过编写实现一个简单可靠的数据传输协议GBN的发送和接收代码,模拟可靠数据传输

2、理解TCP协议可靠传输的差错检测、重传、累计确认、定时器的可靠传输策略。

二、实验原理:

在GBN中,发送端不需要在接收到上一个数据包的ACK后才发送下一个数据包,而是可以连续发送数据包。

在发送端发送数据包的过程中,如果接收到对应已发送的某个数据包的NACK,则发送端将NACK对应的某个数据包进行重发,然后再将该数据包之后的数据包依次进行重发。

三、结果分析:

本次试验中采用java语言进行程序编写

代码注释:

(一)Sender类

importjava.util.Timer;

publicclassSenderextendsThread{

publicintwindowsize=3;//发送方窗口长度设为3

publicString[]data={"data1","data2","data3",

"data4","data5","data6","data7"};//模拟七个数据包

publicintsign[]={0,1,2,3,4,5,6};//为7个数据包标号

publicintlocalack=-1;//保存最近收到的ACK

publicTimerslitime=null;//定时器(这里定为2秒)

publicintswitches=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("发送方开始发送分组数据!

");

}

publicvoidgetack(intack){

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;//标志初始化为0

litime=newTimers();

Timerlimit=newTimer();

limit.schedule(litime,0,100);

}

}

(二)Receiver类

importjava.util.Random;

publicclassReceiverextendsThread{

publicintlastdata;

publicSendersender;

publicvoidrun(Senders){

sender=s;

System.out.println("接收方开始接收分组数据!

");

}

voidreceive(intdata,Senders){

sender=s;//发送方的参数传递

System.out.println("接收方收到了序号为"+data+"的分组!

");

if(data!

=0){

if(data==lastdata+1){

//数据包序号校验,若连续则是正确/所期待的

System.out.println("该数据分组正是接收方所期待的,接收方接受了它并准备回送对应的ACK!

");

lastdata=data;//更新本地保存的数据包序号变量

respond(lastdata);//回送该正确接收的数据包对应的ACK

}

else{

System.out.println("该数据分组不是接收方所期待的,该分组将被丢弃,接收方准备回送最后接受的数据分组对应的ACK!

");

respond(lastdata);//若不是所期待的数据包则丢弃并且重发上一次的ACK

}

}

else{

System.out.println("该数据分组正是接收方所期待的,接收方接受了它并准备回送对应的ACK!

");

lastdata=data;

respond(lastdata);//首次接收数据包并且回送ACK

}

}

voidrespond(intack){//回送指定序号的ACK

if(sender.litime.limit<20){//判断是否超时(2秒)

ack=lastdata;//获取本场保存的数据包序号

sender.getack(ack);

}

else{

System.out.println("计时超时!

(未丢包但是时间超过2秒)发送方准备重发序号为"+ack+"的数据分组!

");

sender.switches=1;//如果超时,设置超时状态并显示警告

}

}

}

(三)Timers类

importjava.util.TimerTask;

publicclassTimersextendsTimerTask{

publicintswitches;

publicintlimit;

publicvoidrun(){

if(limit<20)limit++;//计时2秒

else{

switches=-1;

this.cancel();

}//开关为-1表示超时,并且停止计时器

}

publicTimers(){

switches=0;//启动计时器时全部初始化

limit=0;

}

}

(四)GBN类

import.*;

importjava.util.Random;

importjava.io.*;

publicclassGBNextendsThread{

staticvoidsenddelay(intx)throwsInterruptedException{

if(x==1){sleep(300);System.out.println("发送数据分组时发生延迟:

300毫秒!

");}

elseif(x==2){sleep(750);System.out.println("发送数据分组时发生延迟:

750毫秒!

");}

elseif(x==3){sleep(1200);System.out.println("发送数据分组时发生延迟:

1200毫秒!

");}

elseif(x==4){sleep(3000);System.out.println("发送数据分组时发生延迟:

3000毫秒!

");}

else;

}

publicstaticvoidmain(String[]args)throwsIOException,InterruptedException{

Senders=newSender();

Receiverre=newReceiver();

s.start();//发送端启动

re.run(s);//接收端启动

sleep(1000);//延迟处理

int[]retimes=newint[7];//计算每个分组被发送的次数

for(inti=0;i<7;i++)retimes[i]=0;//数据包顺次发送

for(inti=0;i<=s.sign.length;i++){

while(i>s.localack+1){//尚有未确认的数据包,重发!

System.out.println("发送方开始重新发送序号为"+(s.localack+1)+"的数据分组");

retimes[s.localack+1]++;

intran=newRandom().nextInt(3);

intrandelay=newRandom().nextInt(5);

s.time();

senddelay(randelay);//设置随机值,模拟数据传输延迟

if(ran!

=1)re.receive(s.localack+1,s);//设置随机值,模拟数据丢包过程

elseSystem.out.println("序号为"+(s.localack+1)+"的分组在传给接收方途中发生了丢包!

");

}

if(i!

=s.sign.length){

System.out.println();

System.out.println("发送方现在开始第一次发送序号为"+i+"的数据分组");

retimes[i]++;

if(i!

=0){

for(intk=0;k<3;k++){//表示至少成功发送并确认了一个数据分组

s.windowsign[k]++;//这种情况下滑动窗口向前移动!

}

}

System.out.println();

System.out.println("当前窗口内的分组情况为:

");//显示当前窗口内数据包情况

for(intp=0;p<3;p++){

if(s.windowsign[p]<=6)

System.out.println("第"+p+"号窗口里面存放的是序号为"+s.windowsign[p]+"的马上待发送的数据分组!

");

else

System.out.println("第"+p+"号窗口已经空了,并且后续窗口、发送方没有要发送的数据分组了!

");

}

System.out.println();

intran=newRandom().nextInt(3);

intrandelay=newRandom().nextInt(5);

s.time();//计时开始(2秒时间)

senddelay(randelay);//设置随机值,模拟数据传输延迟

if(ran!

=1)re.receive(s.sign[i],s);//设置随机值,模拟数据丢包过程

elseSystem.out.println("序号为"+i+"的分组在传给接收方途中发生了丢包!

");

}

}

System.out.println();System.out.println("以下是每个数据分组被发送过的次数的统计结果");

for(inti=0;i<7;i++)//显示关于每个数据包发送次数的统计表

System.out.println("序号为"+i+"的数据分组被发送过的次数为:

"+retimes[i]);

System.exit(0);

}

}

 

结果截图:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1