《2022年2022年计算机网络原理实验传输层可靠传输协议GBN编程实验报告 .pdf》由会员分享,可在线阅读,更多相关《2022年2022年计算机网络原理实验传输层可靠传输协议GBN编程实验报告 .pdf(12页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、实验七、 传输层可靠传输协议GBN 编程实验报告序号:姓名:学号:成绩指导老师:一、实验目的:1、通过编写实现一个简单可靠的数据传输协议GBN的发送和接收代码,模拟可靠数据传输2、理解 TCP协议可靠传输的差错检测、重传、累计确认、定时器的可靠传输策略。二、实验原理:在 GBN 中,发送端不需要在接收到上一个数据包的ACK 后才发送下一个数据包,而是可以连续发送数据包。在发送端发送数据包的过程中,如果接收到对应已发送的某个数据包的 NACK ,则发送端将NACK 对应的某个数据包进行重发,然后再将该数据包之后的数据包依次进行重发。三、结果分析:本次试验中采用java 语言进行程序编写代码注释:
2、(一) Sender 类import java.util.Timer; publicclass Sender extends Thread publicint windowsize=3; / 发送方窗口长度设为3 publicString data=data1,data2,data3, data4,data5,data6,data7; / 模拟七个数据包publicint sign=0,1,2,3,4,5,6; / 为7个数据包标号publicint localack=-1; / 保存最近收到的ACK public Timers litime=null ; / 定时器(这里定为2秒)publi
3、cint switches=0; / 超时标志, 1为超时publicint windowsign; / 当前窗口内待发的数据分组的序号publicint acksign=0; / 为0表示收到正确 ACK,为1表示收到错误的ACK,必须重发!名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 12 页 - - - - - - - - - public Sender() windowsign=new int windowsize; / 给窗口分配指定大小的空间for (int
4、 i=0;i3;i+) windowsigni=signi; / 窗口初始化时存放前3个序号 publicvoid run() System.out.println(发送方开始发送分组数据!); publicvoid getack( int ack) System.out.println(发送方收到了 ACK, 序号为 +ack+并且开始加以确认! ); if (ack!=localack+1) System.out.println(经验证,这不是发送方正期待的ACK,立刻重发序号为 +(localack+1)+的数据分组! ); acksign=1; else localack=ack; /
5、 表示正确确认了ACK acksign=0; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 12 页 - - - - - - - - - publicvoid time() switches=0; / 标志初始化为 0 litime=new Timers(); Timer limit=new Timer(); limit.schedule(litime, 0,100); (二) Receiver 类import java.util.Random; publicclass
6、 Receiver extends Thread publicint lastdata; public Sender sender; publicvoid 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) / 数据包序号校验,若连续则是正确/所期待的名师资料总结 - - -精
7、品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 12 页 - - - - - - - - - System.out.println(该数据分组正是接收方所期待的,接收方接受了它并准备回送对应的ACK!); lastdata=data; / 更新本地保存的数据包序号变量respond(lastdata); / 回送该正确接收的数据包对应的ACK else System.out.println(该数据分组不是接收方所期待的,该分组将被丢弃,接收方准备回送最后接受的数据分组对应的ACK!); respo
8、nd(lastdata); / 若不是所期待的数据包则丢弃并且重发上一次的ACK else System.out.println(该数据分组正是接收方所期待的,接收方接受了它并准备回送对应的ACK!); lastdata=data; respond(lastdata); / 首次接收数据包并且回送ACK void respond( int ack) / 回送指定序号的 ACK if (sender.litime.limit20) / 判断是否超时( 2秒)ack=lastdata; / 获取本场保存的数据包序号名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - -
9、 - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 12 页 - - - - - - - - - sender.getack(ack); else System.out.println(计时超时!(未丢包但是时间超过2秒)发送方准备重发序号为+ack+的数据分组! ); sender.switches=1; / 如果超时,设置超时状态并显示警告 (三) Timers 类import java.util.TimerTask; publicclass Timers extends TimerTask publicint switches; publicint l
10、imit; publicvoid run() if (limit20) limit+; / 计时2秒else switches=-1; this .cancel(); / 开关为 -1 表示超时,并且停止计时器 public Timers() 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 12 页 - - - - - - - - - switches=0; / 启动计时器时全部初始化limit=0; (四) GBN 类import .*; import java.uti
11、l.Random; import java.io.*; publicclass GBN extends Thread staticvoid 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=3) sleep(1200);System.out.println(发送数据分组时发
12、生延迟: 1200 毫秒! ); else if (x=4) sleep(3000);System.out.println(发送数据分组时发生延迟: 3000 毫秒! ); else ; publicstaticvoid main(String args) throws IOException, 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 12 页 - - - - - - - - - InterruptedException Sender s= new Sender(
13、); Receiver re=new Receiver(); s.start(); / 发送端启动re.run(s); / 接收端启动sleep(1000); / 延迟处理int retimes=newint 7; / 计算每个分组被发送的次数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 Ra
14、ndom().nextInt(3); intrandelay=new Random().nextInt(5); s.time(); senddelay(randelay); / 设置随机值,模拟数据传输延迟if (ran!=1) re.receive(s.localack+1,s); / 设置随机值,模拟数据丢包过程else System.out.println(序号为 +(s.localack+1)+的分组在名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 12 页 -
15、- - - - - - - - 传给接收方途中发生了丢包!); 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;p
16、3;p+) if (s.windowsignp=6) System.out.println(第+p+号窗口里面存放的是序号为 +s.windowsignp+的马上待发送的数据分组!); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 12 页 - - - - - - - - - elseSystem.out.println(第+p+号窗口已经空了,并且后续窗口、发送方没有要发送的数据分组了!); System.out.println(); int ran= new Ran
17、dom().nextInt(3); intrandelay=new Random().nextInt(5); s.time(); / 计时开始( 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+
18、) / 显示关于每个数据包发送次数的统计表System.out.println(序号为 +i+的数据分组被发送过的次数为:+retimesi); System.exit(0); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 12 页 - - - - - - - - - 结果截图 : 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 12 页 - - - - - - - - - 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 12 页 - - - - - - - - - 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 12 页 - - - - - - - - -