网络基础学习知识原理实验报告(GBN)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
姓名:
班级:
学号:
教师:
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 Thread{
public int windowsize=3; //发送方窗口长度设为3
public String[] data={"data1","data2","data3",
"data4","data5","data6","data7"}; //模拟七个数据包
public int sign[]={0,1,2,3,4,5,6}; //为7个数据包标号
public int localack=-1; //保存最近收到的ACK
public Timers litime=null; //定时器(这里定为2秒)
public int switches=0; //超时标志,1为超时
public int windowsign[]; //当前窗口内待发的数据分组的序号public int acksign=0;
//为0表示收到正确ACK,为1表示收到错误的ACK,必须重发!
public Sender(){
windowsign=new int[windowsize];
//给窗口分配指定大小的空间
for(int i=0;i<3;i++)
windowsign[i]=sign[i]; //窗口初始化时存放前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;
}
else{
localack=ack; //表示正确确认了ACK