ARQ协议模拟实现课程设计报告

上传人:无*** 文档编号:89496212 上传时间:2022-05-13 格式:DOC 页数:24 大小:432.99KB
收藏 版权申诉 举报 下载
ARQ协议模拟实现课程设计报告_第1页
第1页 / 共24页
ARQ协议模拟实现课程设计报告_第2页
第2页 / 共24页
ARQ协议模拟实现课程设计报告_第3页
第3页 / 共24页
资源描述:

《ARQ协议模拟实现课程设计报告》由会员分享,可在线阅读,更多相关《ARQ协议模拟实现课程设计报告(24页珍藏版)》请在装配图网上搜索。

1、课程设计报告学 院:*专业名称:软件工程课程名称:网络技术课程设计课程代码:*所在班级:*学 号:*姓 名:*课题名称:ARQ协议模拟实现任课教师:*完成时间:2013目 录第1章 实验介绍.11. 1实验目的1第2章 协议介绍.1 2. 1停止等待协议的简单介绍(ARQ).1 2. 2停等协议中相关事件的介绍.1 2. 3连续ARQ协议简述.2 2. 3.1介绍.2 2. 3.2特点原理.2第3章 实验环境.33. 1实验环境3第4章 停止等待ARQ协议.3 4. 1实验内容.3 4. 2实验步骤.4 4. 3停等协议的模拟实现.4 4. 4实验结果.9第5章 连续ARQ协议.12 5. 1

2、实验内容.12 5. 2实验设计及分析.12 5. 2.1窗口机制总体设计及分析.12 5. 2.2协议选择及分析.13 5. 2.3发送方与接收方设计流程.13 5. 3程序测试.18引 言ARQ协议中,发送方每发送一个字符便要启动计时器,在规定时间内,若发送方未收到接收方返回的确认信息,则认为超时,需重发原字符。经过思考,我通过for循环反复读取file2文件实现了这一定时功能,而循环的次数则决定定时器的时间。此外还可利用c+语言自带的time()函数来实现计时功能。此外,为方便读取中间结果,file2文件的内容每次都会更新,并且采用简单的字符代表复杂的字符串,这些简化都使程序更加简洁,但

3、并未影响整个模拟功能的实现。为了更加流畅地更新、利用文件中的数据,sender()函数调用了receiver()函数,以及时对文件数据进行接收端的相应处理,以供发送端使用。从而模拟实现整个发送接收过程。第1章实验介绍11实验目的(1)掌握停止等待协议的基本原理(2)理解数据链路层的主要功能(数据出错控制,数据重复控制,数据丢失控制等等)(3)分析简单的协议数据单元(4)掌握停止等待协议的运行机制(5)了解连续ARQ协议(6)掌握滑动窗口的工作机制第2章协议介绍2. 1停止等待协议简单介绍(ARQ): 停止等待协议是数据链路层的几个协议中最基本的协议,是数据链路层各种协议的基础。此实验是基于wi

4、nsock编程,是在VC+6.0的windows界面下和控制台下实现的。它采用客户机/服务器(C/S)模型。停止等待协议就是通过双方的收发数据而达到相互通信的目的。在通信时,当收方收到一个正确的数据帧后,便会向发送方发送一个确认帧ACK,表示发送的数据正确接收。当发送方收到确认帧后才能发送一个新的数据帧,这样就实现了接收方对发送方的流量控制。由于通信线路质量各方面的影响,数据帧从发送方到接收方传输的过程中可能会出现差错。为了保证数据的正确性和完整性,接收方在收到数据后,会用一定的方法对接收到的数据进行差错检验,所以接收方很容易检测出收到的数据帧是否出现差错。当接收方发现收到的数据出现差错时,就

5、会向发送方发送一个否认帧NAK,表示对方发送的数据错误。发送方会根据接收方发来的信息做出相应的操作。采用这样的有效的检错机制,数据链路层可以对上面的网络层提供了可靠的传输的服务。2. 2停等协议中相关事件的介绍帧丢失:有时,链路上的噪声干扰很严重,或者由于其他的一些原因,接收方收不到发送方发送过来的数据帧,这种情况称为数据帧丢失。发生数据帧丢失时,接收方自然不会向发送方发送任何应答帧。如果发送方要等收到收方的应答信息后再发送下一个数据帧,那么双方将永远等下去,这样就出现了死锁现象。为了解决这个问题,可在发送方发送完一个数据帧后,就启动一个超时定时器。若到了超时定时器所设置的重发时间tout仍收

6、不到收方的任何应答帧,则发送方就重传前面所发送的这一数据帧。如果在重传时间tout内收到确认信息,则将超时定时器清零并停止计时。tout一般的时间设置为略大于“从发完数据帧到收到确认帧所需的平均时间”。帧重复:若丢失的是应答帧,则超时重发将会使接收方收到两个同样的数据帧。由于接收方无法识别重复的数据帧,因而在接收方收到的数据中出现了一种接收序号差错,称为重复帧。要解决这个问题,必须使每一个数据帧带上不同的发送序号。若接收方收到序号相同的数据帧,就表明出现了重复帧。这时接收方应当丢弃这个重复帧,同时向发送方发送一个确认帧。因为接收方这时已经知道发送方没有收到上一次发送的确认帧。大家都知道,任何一

7、个编号系统的序号所占用的比特数应是有限的。经过一段时间,发送序号就可重复。使用序号占用的比特数越少,数据传输的额外开销就越少。对于停等协议,由于每发送一个数据帧就停止等待,用一个比特来编号就够了,也就是说序号轮流使用0和1。帧出错:数据在传输的过程中,不可能保证100%的正确传输,而错误的数据帧对于接收方来说是没有什么意义的。为了避免收到错误的数据帧,接收方在收到数据帧后,就会采用一定的机制对收到的数据帧进行校验,当校验数据正确时,会向高层传送该帧,反之,则丢弃该帧,从而对上面的网络层提供了传输的服务。2. 3连续ARQ协议简述2.3.1介绍 回退n帧(go-back-n)GBN,以及选择性重

8、传(selective repeat)ARQ,两种协议是滑动窗口技术与请求重发技术的结合,由于窗口尺寸开到足够大时,帧在线路上可以连续地流动,因此又称其为连续ARQ协议。连续重发请求ARQ方案是指发送方可以连续发送一系列信息帧,即不用等前一帧被确认便可继续发送下一帧,效率大大提高。但在这种重发请求方案中,需要在发送方设置一个较大的缓冲存储空间(称作重发表),用以存放若干待确认的信息帧。当发送方收到对某信息帧的确认帧后,便可从重发表中将该信息帧删除。所以,连续重发请求ARQ方案的链路传输效率大大提高,但相应地需要更大的缓冲存储空间。在这一协议中,当发送站点发送完一个数据帧后,不是停下来等待应答帧

9、,而是可以连续再发送若干个数据帧。如果在此过程中又收到了接收端发来的应答帧,那么还可以接着发送数据帧。由于减少了等待时间,整个通信的吞吐量就提高了。ARQ代表的是自动重传请求(Auto Repeat reQuest,ARQ),而GBN与选择重传都属于其中。其中BGN的接收窗口是1,且具有累计确认的特点。而选择重传没有累计确认的特点。2.3.2特点与原理 连续重发请求ARQ方案的特点如下:(1)发送方连续发送信息帧,而不必等待确认帧的返回;(2)在重发表中保存所发送的每个帧的备份;(3)重发表按先进先出(FIFO)队列规则操作;(4)接收方对每一个正确收到的信息帧返回一个确认帧,每一个确认帧包含

10、一个惟一的序号,随相应的确认帧返回;(5)接收方保存一个接收次序表,包含最后正确收到的信息帧的序号。当发送方收到相应信息帧的确认后,从重发表中删除该信息帧的备份;(6)当发送方检测出失序的确认帧(即第N号信息帧和第N+2号信息帧的确认帧已返回,而N+1号的确认帧未返回)后,便重发未被确认的信息帧图2-1 连续ARQ协议工作原理第3章实验环境3. 1实验环境 在visual studio 环境下,采用c+程序设计语言,模拟实现ARQ协议。第4章停止等待ARQ协议4. 1实验内容(1)p1模拟发送方:首先从界面读取待发送字符(每接受一个字符的输入),保存到文件file1.txt中,并启动计时器;(

11、2)p2模拟接收方,它从file1.txt中查找是否有新字符到来,并提供模拟界面给用户选择: 1、 Ack-接收该字符 2、 NAK-丢弃 3、无反应-导致超时 将用户选择的结果记录到file2.txt中; 接收的字符保存到file3.txt 中;(3)p1等待接收方应答:读取file2.txt 决定下面的操作:1、如果是ACK,则继续接收用户输入;2、如果是NAK,则重传该字符;3、如果超时仍没有新的ACK或NAK,则重传该字符。注:file1.txt要发送的串, file2.txt保存中间结果, file3.txt接受的串,由实验者自己生成。4. 2 实验步骤(1)编写receiver()

12、函数模拟接收端的相应处理过程;(2)编写sender()函数模拟发送端相应处理过程,其中sender函数调用了receiver()函数;(3)编写主函数main()函数,调用sender()和receiver()函数来实现整个发送接收过程,进而模拟了ARQ协议的实现。4. 3停等协议的模拟实现#include #include #include /下面是两个函数原型void receiver(int ,fstream &,fstream &,ofstream &);/接收方void sender(fstream &datafile1,fstream &datafile2,ofstream &d

13、atafile3);/发送方void main()fstream datafile1,datafile2;ofstream datafile3;cout下面开始数据的传输,注意:传输数据以“!”结束endl; sender(datafile1,datafile2,datafile3);cout数据传输结束endl;/接收端void receiver(int i,fstream &datafile1,fstream &datafile2,ofstream &datafile3)char r,re;datafile1.open(file1,ios:out|ios:in);if(!datafile1

14、) cout文件打开失败!=A&r=Z)/若读取的字符有效,即正确接受字符 datafile3.open(file3,ios:app); if(!datafile3) cout文件打开失败!endl; exit(0); datafile3r;/将收到的字符写入文件file3 cout字符已正确接收endl; cout准备发送确认信息ACKendl; cout请输入A,并以回车结束re; datafile2.open(file2,ios:out); if(!datafile2) cout文件打开失败!endl; exit(0); datafile2re;/将确认信息写入file2 if(rZ)/

15、读取的字符无效,即接受字符出错 cout接收字符错误endl; cout准备发送信息NAKendl; coutre; datafile3.open(file3); if(!datafile3) cout文件打开失败!endl; exit(0); datafile3re;/返回出错信息,将N写入file3 datafile1.close(); datafile2.close(); datafile3.close();/发送端void sender(fstream &datafile1,fstream &datafile2,ofstream &datafile3)char s,st;long i=

16、0; cout整个信息输入以“!”结束;couts;datafile1.open(file1,ios:out|ios:in);if(!datafile1)cout文件打开失败!endl;exit(0);datafile1s;/发送信息,即将待发送的字符写入文件file1 i+;cout字符已被发送endl;datafile1.close();receiver(i,datafile1,datafile2,datafile3);/调用接收端进行相应操作while(1)if(s=!)break;for(int t=1;t=4;t+)/起定时器的作用datafile2.open(file2,ios:i

17、n);if(!datafile2) cout文件打开失败!endl; exit(0);datafile2.get(st);datafile2.close(); if(st=A)/发送方收到接收方的确认信息ACK cout上一个字符已被接收!endl; couts; datafile1.open(file1,ios:out|ios:in); if(!datafile1) cout文件打开失败!endl; exit(0); datafile1s;/将新的待发送字符写入file1 i+; cout字符已被发送endl; datafile1.close();receiver(i,datafile1,d

18、atafile2,datafile3);/调用接收端进行相应操作 break; if(st=N)/发送方收到接收方的出错信息NAK cout上一个字符出错!endl; cout现在需重新发送原字符endl; datafile1.open(file1,ios:out|ios:in); if(!datafile1) cout文件打开失败!endl; exit(0);datafile1s; i+; cout字符已被发送endl; datafile1.close(); receiver(i,datafile1,datafile2,datafile3);/调用接收端进行相应操作 break; cout定

19、时器超时,现重新发送原字符。endl; datafile1.open(file1,ios:out|ios:in); if(!datafile1) cout文件打开失败!endl; exit(0);datafile1s; i+; cout字符已被发送next=NULL;printf(请输入窗口大小:);scanf(%ld,&swpstate1.sws); /输入窗口大小swpstate1.rws=swpstate1.sws; /把窗口大小的值赋给变量if (swpstate1.sws0) printf(请输入第一帧的序列号:); scanf(%ld,&swpstate1.hdr.seqnum);

20、 /输入第一帧序列号swpstate1.nfe=swpstate1.hdr.seqnum; /把第一帧的值放进缓冲池内sendp=(struct sendq_slot*) malloc (size of(struct sendq_slot); if(!sendp) exit(1);sendp-msg=swpstate1.hdr.seqnum;sendp-timeout=1;sendp-next=NULL;sendq_rear-next=sendp;sendq_rear=sendp;-swpstate1.sws;swpstate1.lfs=swpstate1.hdr.seqnum; /最近发送的

21、帧取值swpstate1.lar=swpstate1.hdr.seqnum; /最近收到的确认帧取值dowhile(swpstate1.sws0) /当窗口大小大于0时,执行以下的循环sendp=(struct sendq_slot*)malloc(sizeof(struct sendq_slot); if(!sendp) exit(1); sendp-msg=swpstate1.lfs+1; /如果输入的帧序号大于之前帧序号,那么窗口向前滑动 sendp-timeout=1; /时延为1 sendp-next=NULL; sendq_rear-next=sendp; sendq_rear=s

22、endp; -swpstate1.sws; +swpstate1.lfs;swpstate1.hdr.acknum=0; /ACK清空swpstate1.hdr.flags=0; /存储缓冲池清空printf(最近收到的ACK的帧序号:%ldn,swpstate1.lar); /输出最近收到的ACK帧序号printf(最近发送的帧序号(发送新帧后):%ldn,swpstate1.lfs);/输出最近发送帧序号(2)接收方程序:收到的包是否含有Push标志?收到包的序号与等待接收的序号是否一致?收到包的序号在接收窗口范围内?NY直接提取数据,提前应用进程Y入接收队列YN处理在接收队列中的包(如果

23、是普通包要判断序号,或者进行拆包,组包操作)结束N图5-2-3 数据包接收过程1、接收方的接收原则从总体上看是先判断输入的数据帧是否在接收范围之内,若是,则继续判断是否符合其他接收条件;若不是,则马上丢弃该数据帧,不再进行其他条件的判断。struct sendq_slot *sendq_rear,*sendp,*p3,*p4; /设定变量struct recvq_slot *recvp,*recvq_rear,*p1,*p2; if(swpstate1.hdr.flags=0) /上次输入的数据帧被放置在缓存区,输入区被清空 do /如果继续接收数据帧则实施下面循环 printf(请输入收到的

24、数据帧号:); scanf(%ld,&a); if(a=swpstate1.nfe&anext=NULL; swpstate1.head=recvp; else if(swpstate1.head!=NULL) recvp=(struct recvq_slot*)malloc(sizeof(struct recvq_slot); recvp-next=NULL; recvq_rear-next=recvp; recvq_rear=recvp; else printf(所输数据不在接收窗口内!); break; /跳出该循环 2、若输入数据帧在接收范围内则继续判断并进行以下循环。 recvp-m

25、sg=a; if(recvp-msg=swpstate1.nfe) /是否放入缓存判断 recvp-received=1; else recvp-received=0; -swpstate1.rws; if(recvp-received=1) /数据帧被接收,则进行下面语句 a=a-1; do a=a+1; if(swpstate1.head=NULL) break; p1=swpstate1.head; flag=0; while(a!=p1-msg)&(p1-next!=NULL) p2=p1;p1=p1-next; if(a=p1-msg) flag=1; if(p1=swpstate1

26、.head) swpstate1.head=swpstate1.head-next; else p2-next=p1-next; swpstate1.nfe=a+1; swpstate1.hdr.acknum=a+1; swpstate1.hdr.flags=1; while(flag=1); printf(ACK号(期待的下一帧的序号):%ldn,swpstate1.nfe); printf(没按序接受的序号:n); p1=swpstate1.head; while(p1!=NULL) printf(%ldt,p1-msg); p1=p1-next; 3、当接收完一个数据帧时,我们可以选择终

27、止下面的继续接收,也可以选择继续接收。如果继续接收,那么程序跳到判断循环,继续判断是否接收下一个数据帧,原理与上面相当。while(swpstate1.rws0)&(b=1); if(swpstate1.hdr.flags=1) p3=swpstate1.sendq-next; flag=0; while(swpstate1.hdr.acknum)!=p3-msg&p3-next!=NULL) p4=p3;p3=p3-next; if(swpstate1.hdr.acknum=p3-msg) flag=1; if(p3-msg=swpstate1.sendq-next-msg) swpstat

28、e1.sendq-next=p3; else swpstate1.sendq-next=p3; swpstate1.sws=swpstate1.sws+(swpstate1.sendq-next-msg-swpstate1.lar); swpstate1.lar=swpstate1.sendq-next-msg; swpstate1.hdr.seqnum=swpstate1.hdr.acknum; printf(最近收到的ACK的帧序号(收到ACK后):%ldn,swpstate1.lar); printf(最近发送的帧序号(此时还未发送新的数据):%ldn,swpstate1.lfs); 5

29、. 3程序测试下面我以窗口大小为11,第一帧序列号为3,做程序的测试。图5-3-1 程序测试整体图(1)整体窗口展示,命令行界面图5-3-2 整体窗口展示(2) 输入窗口大小及第一帧序列号图5-3-3 信息设置输入(3)当输入的接收帧并不是ACK期待的帧,那么根据滑动窗口协议该帧不被接收,且把该帧存放在缓冲区。图5-3-4 帧不被接收的情况(4)当前面输入的都不是系统所期待的帧,那么这些帧会一直被存放在缓冲区。直到输入下一个输入的帧的序号比前面输入的帧的序号大,且是系统所期待的帧时,之前和当前输入的帧会一并被接收,缓冲区清空。继续接收命令,进行新的帧的检测及接收。图5-3-5 帧被接收的情况(5)若输入的帧超过了窗口大小,那么系统会显示该帧不在接收范围内,并拒绝接收。图5-3-6 帧超出窗口大小范围结束语通过此次试验,我对ARQ协议的原理以及基本工作过程有了更深入的理解、掌握。同时在一定程度上增强了我的独立编程能力和独立思考能力。越来越发现,编程其实没那么难,但想成为高手也很不容易。参考文献(1) 计算机网络 (第5版) 谢希仁著 电子工业出版社(2)李仁发,何彦. 基于虚拟实验方法的滑动窗口协议分析J. 系统仿真学报, 2002, 8 (14) : 1026 - 1063.(3)特南鲍姆. 计算机网络(第四版). 清华出版19

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!