计算机网络原理实验七传输层可靠传输协议GBN编程实验报告Word文档下载推荐.docx
- 文档编号:17513117
- 上传时间:2022-12-06
- 格式:DOCX
- 页数:9
- 大小:304.46KB
计算机网络原理实验七传输层可靠传输协议GBN编程实验报告Word文档下载推荐.docx
《计算机网络原理实验七传输层可靠传输协议GBN编程实验报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《计算机网络原理实验七传输层可靠传输协议GBN编程实验报告Word文档下载推荐.docx(9页珍藏版)》请在冰豆网上搜索。
,"
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){
经验证,这不是发送方正期待的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;
接收方开始接收分组数据!
voidreceive(intdata,Senders){
//发送方的参数传递
接收方收到了序号为"
+data+"
的分组!
if(data!
=0){
if(data==lastdata+1){
//数据包序号校验,若连续则是正确/所期待的
该数据分组正是接收方所期待的,接收方接受了它并准备回送对应的ACK!
lastdata=data;
//更新本地保存的数据包序号变量
respond(lastdata);
//回送该正确接收的数据包对应的ACK
}
else{
该数据分组不是接收方所期待的,该分组将被丢弃,接收方准备回送最后接受的数据分组对应的ACK!
//若不是所期待的数据包则丢弃并且重发上一次的ACK
lastdata=data;
respond(lastdata);
//首次接收数据包并且回送ACK
voidrespond(intack){//回送指定序号的ACK
if(sender.litime.limit<
20){//判断是否超时(2秒)
ack=lastdata;
//获取本场保存的数据包序号
sender.getack(ack);
计时超时!
!
(未丢包但是时间超过2秒)发送方准备重发序号为"
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.io.*;
publicclassGBNextendsThread{
staticvoidsenddelay(intx)throwsInterruptedException{
if(x==1){sleep(300);
System.out.println("
发送数据分组时发生延迟:
300毫秒!
elseif(x==2){sleep(750);
750毫秒!
elseif(x==3){sleep(1200);
1200毫秒!
elseif(x==4){sleep(3000);
3000毫秒!
else;
publicstaticvoidmain(String[]args)throwsIOException,InterruptedException{
Senders=newSender();
Receiverre=newReceiver();
s.start();
//发送端启动
re.run(s);
//接收端启动
sleep(1000);
//延迟处理
int[]retimes=newint[7];
//计算每个分组被发送的次数
7;
i++)retimes[i]=0;
//数据包顺次发送
=s.sign.length;
i++){
while(i>
s.localack+1){//尚有未确认的数据包,重发!
发送方开始重新发送序号为"
+(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("
序号为"
的分组在传给接收方途中发生了丢包!
if(i!
=s.sign.length){
System.out.println();
发送方现在开始第一次发送序号为"
+i+"
retimes[i]++;
if(i!
=0){
for(intk=0;
k<
k++){//表示至少成功发送并确认了一个数据分组
s.windowsign[k]++;
//这种情况下滑动窗口向前移动!
}
}
System.out.println("
当前窗口内的分组情况为:
//显示当前窗口内数据包情况
for(intp=0;
p<
p++){
if(s.windowsign[p]<
=6)
第"
+p+"
号窗口里面存放的是序号为"
+s.windowsign[p]+"
的马上待发送的数据分组!
else
号窗口已经空了,并且后续窗口、发送方没有要发送的数据分组了!
//计时开始(2秒时间)
//设置随机值,模拟数据传输延迟
=1)re.receive(s.sign[i],s);
//设置随机值,模拟数据丢包过程
System.out.println();
以下是每个数据分组被发送过的次数的统计结果"
i++)//显示关于每个数据包发送次数的统计表
的数据分组被发送过的次数为:
"
+retimes[i]);
System.exit(0);
结果截图:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机网络 原理 实验 传输 可靠 协议 GBN 编程 报告