GBN实验报告.docx
- 文档编号:24430397
- 上传时间:2023-05-27
- 格式:DOCX
- 页数:16
- 大小:186.71KB
GBN实验报告.docx
《GBN实验报告.docx》由会员分享,可在线阅读,更多相关《GBN实验报告.docx(16页珍藏版)》请在冰豆网上搜索。
GBN实验报告
<<计算机网络>>
实验报告
实验二
一、实验目的
理解滑动窗口协议的基本原理;
掌握GBN的工作原理;
掌握基于UDP设计并实现一个GBN协议的过程与技术。
二、实验环境
1.接入internet的实验主机
2.Windows10操作系统
3.java语言
三、实验意义
通过本实验,使学生能够对可靠数据传输原理有进一步的理解和掌握
四、实验背景
五、Go-Back-N的有限状态机模型表示如图3.1所示:
六、
七、(a)
八、
九、(b)
十、图3.1Go-Back-N的有限状态机模型(a)发送端(b)接受端
十一、实验内容
1)基于UDP设计一个简单的GBN协议,实现单向可靠数据传输(服务器到客户的数据传输)。
2)模拟引入数据包的丢失,验证所设计协议的有效性。
实验过程及结果:
客户端:
使用UDP协议向服务器端请求数据,接收服务器端发送的数据报并返回确认信息ACK。
具体实现:
1)接收数据。
接受来自服务器端的数据(recieveAck())
从数据中读出整形ack的值,base=ack加1.
如果base等于next,则停止计时,
否则,重新计时。
2)发送数据。
向服务器端发送传输数据DatagramPacket。
此时可设计丢包率来模拟数据丢包(丢包率10%)。
//if(Math.random()*10<1){
//nextSeq++;
//continue;
//}
发送完一分组后,nextseq++;
如果nextSeq==base,则一组(N个)已经发送接收完,重新计时。
服务器端:
使用UDP协议传输数据(比如传输一个文件),等待客户端的请求,接收并处理来自客户端的消息(如数据传输请求),当客户端开始请求数据时进入“伪连接”状态(并不是真正的连接,只是一种类似连接的数据发送的状态),将数据打包成数据报发送,然后等待客户端的ACK信息,同时启动计时器。
当收到ACK时,窗口滑动,正常发送下一个数据报,计时器重新计时;若在计时器超时前没有收到ACK,则全部重传窗口内的所以已发送的数据报。
在服务器端,我用exceptedSeq表示服务器端期待收到的编号,如果收到的编号是期待的,向客户端回复ack,exceptedSeq++。
否则,回复ack--,丢弃此数据。
源代码及注释:
GBNClient.Java:
packagebao3;
importjava.io.IOException;
import.DatagramPacket;
import.DatagramSocket;
import.InetAddress;
importjava.util.Random;
/**
*客户端
*/
publicclassGBNClient{
//初始化
privatefinalintport=80;
privateDatagramSocketdatagramSocket=newDatagramSocket();
privateDatagramPacketdatagramPacket;
privateInetAddressinetAddress;
privateModelmodel;
privatestaticGBNClientgbnClient;
privateTimertimer;
privateintnextSeq=1;
privateintbase=1;
privateintN=5;
publicGBNClient()throwsException{
model=newModel();
timer=newTimer(this,model);
model.setTime(0);
timer.start();
while(true){
//向服务器端发送数据
sendData();
//从服务器端接收ACK
recieveAck();
}
}
publicstaticvoidmain(String[]args)throwsException{
gbnClient=newGBNClient();
}
privatevoidsendData()throwsException{
inetAddress=InetAddress.getLocalHost();
while(nextSeq
//不发编号为5的数据,模拟数据丢失
if(nextSeq==5){
nextSeq++;
continue;
}
//设置丢包率
//if(Math.random()*10<1){
//nextSeq++;
//continue;
//}
StringclientData="客户端发送的数据编号:
"+nextSeq;
System.out.println("向服务器发送的数据:
"+nextSeq);
byte[]data=clientData.getBytes();
DatagramPacketdatagramPacket=newDatagramPacket(data,data.length,inetAddress,port);
datagramSocket.send(datagramPacket);
if(nextSeq==base){
//开始计时
model.setTime(3);
}
nextSeq++;
}
}
privatevoidrecieveAck()throwsIOException{
byte[]bytes=newbyte[4096];
datagramPacket=newDatagramPacket(bytes,bytes.length);
datagramSocket.receive(datagramPacket);
StringfromServer=newString(bytes,0,bytes.length);
intack=Integer.parseInt(fromServer.substring(fromServer.indexOf("ack:
")+4).trim());
base=ack+1;
if(base==nextSeq){
//停止计时器
model.setTime(0);
}else{
//开始计时器
model.setTime(3);
}
System.out.println("从服务器获得的数据:
"+fromServer);
System.out.println("\n");
}
/**
*超时数据重传
*/
publicvoidtimeOut()throwsException{
for(inti=base;i StringclientData="客户端重新发送的数据编号: "+i; System.out.println("向服务器重新发送的数据: "+i); byte[]data=clientData.getBytes(); DatagramPacketdatagramPacket=newDatagramPacket(data,data.length,inetAddress,port); datagramSocket.send(datagramPacket); } System.out.print("\n"); } } GBNServer.java: packagebao3; importjava.io.IOException; import.DatagramPacket; import.DatagramSocket; import.InetAddress; import.SocketException; /** *服务器端 */ publicclassGBNServer{ privatefinalintport=80; privateDatagramSocketdatagramSocket; privateDatagramPacketdatagramPacket; privateintexceptedSeq=1; publicGBNServer()throwsIOException{ try{ datagramSocket=newDatagramSocket(port); while(true){ //获取收到的数据 byte[]receivedData=newbyte[4096]; datagramPacket=newDatagramPacket(receivedData,receivedData.length); datagramSocket.receive(datagramPacket); Stringreceived=newString(receivedData,0,receivedData.length); System.out.println(received); //如果收到了预期的数据 if(Integer.parseInt(received.substring(received.indexOf("编号: ")+3).trim())==exceptedSeq){ //发送ack sendAck(exceptedSeq); System.out.println("服务端期待的数据编号: "+exceptedSeq); //期待值加1 exceptedSeq++; System.out.println('\n'); } else { System.out.println("服务端期待的数据编号: "+exceptedSeq); System.out.println("未收到预期数据"); //仍发送之前的ack sendAck(exceptedSeq-1); System.out.println('\n'); } } } catch(SocketExceptione){ e.printStackTrace(); } } publicstaticfinalvoidmain(String[]args)throwsIOException{ newGBNServer(); } //向客户端发送ack publicvoidsendAck(intack)throwsIOException{ Stringresponse="ack: "+ack; byte[]responseData=response.getBytes(); InetAddressresponseAddress=datagramPacket.getAddress(); intresponsePort=datagramPacket.getPort(); datagramPacket=newDatagramPacket(responseData,responseData.length,responseAddress,responsePort); datagramSocket.send(datagramPacket); } } Timer.java: packagebao3; publicclassTimerextendsThread{ privateModelmodel; privateGBNClientgbnClient; publicTimer(){ model=null; gbnClient=null; } publicTimer(GBNClientgbnClient,Modelmodel){ this.gbnClient=gbnClient; this.model=model; } @Override publicvoidrun(){ do{ inttime=model.getTime(); if(time>0){ try{ Thread.sleep(time*1000); System.out.println("\n"); if(gbnClient! =null){ System.out.println("GBN客户端等待ACK超时"); gbnClient.timeOut(); } model.setTime(0); }catch(InterruptedExceptione){ }catch(Exceptione){ } } }while(true); } } Model.java: packagebao3; publicclassModel{ publicvolatileinttime; publicsynchronizedintgetTime(){ returntime; } publicsynchronizedvoidsetTime(inttime){ this.time=time; } } 实验结果截图: Gbn测试数据包丢失概率0.1,假设5丢包测试截图如下: 客户端: 服务器端: 五、实验心得 1.理解了滑动窗口协议的基本原理; 2.基本掌握GBN的工作原理; 3.学会基于UDP设计并实现一个GBN协议的过程与技术。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- GBN 实验 报告