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

上传人:夺命阿水 文档编号:499595 上传时间:2023-08-03 格式:DOCX 页数:23 大小:235.03KB
返回 下载 相关 举报
ARQ协议模拟实现课程设计报告.docx_第1页
第1页 / 共23页
ARQ协议模拟实现课程设计报告.docx_第2页
第2页 / 共23页
ARQ协议模拟实现课程设计报告.docx_第3页
第3页 / 共23页
ARQ协议模拟实现课程设计报告.docx_第4页
第4页 / 共23页
ARQ协议模拟实现课程设计报告.docx_第5页
第5页 / 共23页
点击查看更多>>
资源描述

《ARQ协议模拟实现课程设计报告.docx》由会员分享,可在线阅读,更多相关《ARQ协议模拟实现课程设计报告.docx(23页珍藏版)》请在课桌文档上搜索。

1、课程设计报告学院:*专业名称:软件工程课程名称:网络技术课程设计课程代码:*所在班级:*学号:*姓名:fccc*c*c课题名称:ARQ协议模拟实现任课老师:*完成时间:2023第1章试验介绍11.l试验目的1第2章协议介绍12.1停止等待协议的简洁介绍(ARQ)12.2停等协议中相关事务的介绍12.3连续ARQ协议简述22. 3.1介绍23. 3.2*i2第3章试验环境34. 1试验环境3第4章停止等待ARQ协议35. 1试验内容34.2试验步骤44.3停等协议的模拟实现44.4试验结果9第5章连续ARQ协议125.1试验内容125.2试验设计及分析125.2.1窗口机制总体设计及分析125.

2、2.2协议选择及分析135.2.3发送方与接收方设计流程135.3程序测试18引言ARQ协议中,发送方每发送一个字符便要启动计时器,在规定时间内,若发送方未收到接收方返回的确认信息,则认为超时,需重发原字符。经过思索,我通过for循环反复读取file2文件实现了这确定时功能,而循环的次数则确定定时器的时间。此外还可利用c+语言自带的timeO函数来实现计时功能。此外,为便利读取中间结果,file2文件的内容每次都会更新,并且接受简洁的字符代表困难的字符串,这些简化都使程序更加简洁,但并未影响整个模拟功能的实现。为了更加流畅地更新、利用文件中的数据,senderO函数调用了receiver()函

3、数,以刚好对文件数据进行接收端的相应处理,以供发送端运用。从而模拟实现整个发送接收过程。第1章试验介绍1. 1试验目的(1)驾驭停止等待协议的基本原理(2)理解数据链路层的主要功能(数据出错限制,数据重复限制,数据丢失限制等等)(3)分析简洁的协议数据单元(4)驾驭停止等待协议的运行机制(5)了解连续ARQ协议(6)驾驭滑动窗口的工作机制第2章协议介绍2. 1停止等待协议简洁介绍(ARQ):停止等待协议是数据链路层的几个协议中最基本的协议,是数据链路层各种协议的基础。此试验是基于winsock编程,是在VC+6.0的windows界面下和限制台下实现的。它接受客户机/服务器(C/S)模型。停止

4、等待协议就是通过双方的收发数据而达到相互通信的目的。在通信时,当收方收到一个正确的数据帧后,便会向发送方发送一个确认帧ACK,表示发送的数据正确接收。当发送方收到确认帧后才能发送一个新的数据帧,这样就实现了接收方对发送方的流量限制。由于通信线路质量各方面的影响,数据帧从发送方到接收方传输的过程中可能会出现差错。为了保证数据的正确性和完整性,接收方在收到数据后,会用确定的方法对接收到的数据进行差错检验,所以接收方很简洁检测出收到的数据帧是否出现差错。当接收方发觉收到的数据出现差错时,就会向发送方发送一个否认帧NAK,表示对方发送的数据错误。发送方会依据接收方发来的信息做出相应的操作。接受这样的有

5、效的检错机制,数据链路层可以对上面的网络层供应了牢靠的传输的服务。2. 2停等协议中相关事务的介绍帧丢失:有时,链路上的噪声干扰很严峻,或者由于其他的一些缘由,接收方收不到发送方发送过来的数据帧,这种状况称为数据帧丢失。发生数据帧丢失时,接收方自然不会向发送方发送任何应答帧。假如发送方要等收到收方的应答信息后再发送下一个数据帧,那么双方将恒久等下去,这样就出现了死锁现象。为了解决这个问题,可在发送方发送完一个数据帧后,就启动一个超时定时器。若到了超时定时器所设置的重发时间仍收不到收方的任何应答帧,则发送方就重传前面所发送的这一数据帧。假如在重传时间内收到确认信息,则将超时定时器清零并停止计时。

6、一般的时间设置为略大于“从发完数据帧到收到确认帧所需的平均时间二帧重复:若丢失的是应答帧,则超时重发将会使接收方收到两个同样的数据帧。由于接收方无法识别重复的数据帧,因而在接收方收到的数据中出现了一种接收序号差错,称为重复帧。要解决这个问题,必需使每一个数据帧带上不同的发送序号。若接收方收到序号相同的数据帧,就表明出现了重复帧。这时接收方应当丢弃这个重复帧,同时向发送方发送一个确认帧。因为接收方这时已经知道发送方没有收到上一次发送的确认帧。大家都知道,任何一个编号系统的序号所占用的比特数应是有限的。经过一段时间,发送序号就可重复。运用序号占用的比特数越少,数据传输的额外开销就越少。对于停等协议

7、,由于每发送一个数据帧就停止等待,用一个比特来编号就够了,也就是说序号轮番运用O和葭帧出错:数据在传输的过程中,不行能保证100%的正确传输,而错误的数据帧对于接收方来说是没有什么意义的。为了避开收到错误的数据帧,接收方在收到数据帧后,就会接受确定的机制对收到的数据帧进行校验,当校验数据正确时,会向高层传送该帧,反之,则丢弃该帧,从而对上面的网络层供应了传输的服务。2. 3连续ARQ协议简述2.1.1 介绍问退n帧(go-back-n)GBN,以及选择性重传(SeIeCtiVerePeat)ARQ,两种协议是滑动窗口技术与请求重发技术的结合,由于窗口尺寸开到足够大时,帧在线路上可以连续地流淌,

8、因此又称其为连续ARQ协议。连续重发请求ARQ方案是指发送方可以连续发送一系列信息帧,即不用等前一帧被确认便可接着发送下一帧,效率大大提高。但在这种重发请求方案中,须要在发送方设置一个较大的缓冲存储空间(称作重发表),用以存放若干待确认的信息帧。当发送方收到对某信息帧的确认帧后,便可从重发表中将该信息帧删除。所以,连续重发请求ARQ方案的链路传输效率大大提高,但相应地须要更大的缓冲存储空间。在这一协议中,当发送站点发送完一个数据帧后,不是停下来等待应答帧,而是可以连续再发送若干个数据帧。假如在此过程中又收到了接收端发来的应答帧,那么还可以接着发送数据帧。由于削减了等待时间,整个通信的吞吐量就提

9、高了。ARQ代表的是自动重传请求(AmoRepeatreQuest,ARQ),而GBN与选择重传都属于其中。其中BGN的接收窗口是1,且具有累计确认的特点。而选择重传没有累计确认的特点。2.1.2 特点与原理连续重发请求ARQ方案的特点如下:(1)发送方连续发送信息帧,而不必等待确认帧的返回;(2)在重发表中保存所发送的每个帧的备份;(3)重发表按先进先出(FIFO)队列规则操作;(4)接收方对每一个正确收到的信息帧返回一个确认帧,每一个确认帧包含一个惟一的序号,随相应的确认帧返回;(5)接收方保存一个接收次序表,包含最终正确收到的信息帧的序号。当发送方收到相应信息帧的确认后,从重发表中删除该

10、信息帧的备份;(6)当发送方检测出失序的确认帧(即第N号信息帧和第N+2号信息帧的确认帧已返回,而N+1号的确认帧未返同)后,使重发未被确认的信息帧图27连续ARQ协议工作原理第3章试验环境3. 1试验环境在ViSUalstudio环境下,接受c+程序设计语言,模拟实现ARQ协议。第4章停止等待ARQ协议4. 1试验内容(1) Pl模拟发送方:首先从界面读取待发送字符(每接受一个字符的输入),保存到文件filel.txt中,并启动计时器;(2) p2模拟接收方,它从filel.txt中查找是否有新字符到来,并供应模拟界面给用户选择:1、Ack-接收该字符2、NAK-)丢弃3、无反应一导致超时将

11、用户选择的结果记录到file2.txt中;接收的字符保存到file3.txt中;(3) PI等待接收方应答:读取file2.txt确定下面的操作:1、假如是ACK,则接着接收用户输入;2、假如是NAK,则重传该字符;3、假如超时仍没有新的ACK或NAK,则重传该字符。注:filel.txt要发送的串,file2.txt保存中间结果,file3.txt接受的串,由试验者自己生成。4.2试验步骤(1)编写receiver()函数模拟接收端的相应处理过程;(2)编写senderO函数模拟发送端相应处理过程,其中sender函数调用了receiver()函数;(3)编写主函数main()函数,调用Se

12、nder()和receiver()函数来实现整个发送接收过程,进而模拟了ARQ协议的实现。4.3停等协议的模拟实现ttincludettincludeinclude下面是两个函数原型voidreceiver(int,fstream&,fstream&,ofstream&);接收方voidsender(fstream&datafilel,fstreamdatafile2,ofstream&datafile3);发送方voidmain()(fstreamdatafilel,datafile2;ofstreamdatafile3;CoUt。下面起先数据的传输,留意:传输数据以“!”结束cndl;se

13、nder(datafilel,datafile2,datafile3);CoUt数据传输结束“endl;)接收端voidreceiver(inti,fstream&datafilel,fstreamdatafile2,ofstream&datafile3)(charr,re;datafilel.open(,/filelz,ios:outios:in);if(!datafilel)(COUt”文件打开失败!=A,&r=JZ)若读取的字符有效,即正确接受字符(datafile3.OPeri(filc3”,ios:app);if(!datafile3)(CoUt”文件打开失败!,endl;exit(

14、O);)datafile3r;将收到的字符写入文件filc3COUt字符已正确接收“cndl;CoUt。准备发送确认信息ACKKcndl;COUt请输入A,并以回车结束re;datafile2.open(z,file2z,ios:out);if(!datafile2)COUt”文件打开失败!endl;exit(O);datafilc2re;将确认信息写入file2)if(rZ)读取的字符无效,即接受字符出错(CoUt接收字符错误。Cnd1;COUt准备发送信息NAK”re;datafile3.OPen(file3);if(!datafile3)CoUt文件打开失败!endl;exit(O);d

15、atafilc3rc;返回出错信息,将N,写入file3)datafilel.close();datafile2.close();datafile3.close();)发送端voidsender(fstream&datafilel,fstream&datafile2,ofstreamdatafile3)(chars,st;longi=0;COUts;datafilel.open(zzfilel,z,ios:outIios:in);if(Jdatafilel)(COUt”文件打开失败!endl;exit(O);datafileks;发送信息,即将待发送的字符写入文件fileli+;COUt字符已

16、被发送Xendl;datafilel.close();receiver(i,datafilel,datafile2,datafile3);调用接收端进行相应操作while(l)if(s=!)break;for(intt=l;t=4;t+)起定时器的作用datafile2.open(zzfile2,ios:in);if(!datafile2)(COUt”文件打开失败!endl;exit(O);datafile2.get(st);datafile2.close();if(st=A)发送方收到接收方的确认信息ACK(COUt上一个字符已被接收!endl;CoUts;datafilel.OPen(fi

17、le1”,ios:outios:in);if(Jdatafilel)(COUt”文件打开失败!zzendl;exit(0);datafilels;将新的待发送字符写入fileli+;COUt字符已被发送endl;datafilel.close();receiver(i,datafilel,datafile2,datafile3);调用接收端进行相应操作break;if(st=N)发送方收到接收方的出错信息NAKCOUtX上一个字符出错!cndl;COUt现在需重新发送原字符cndl;datafilel.open(,zfilel,ios:outIios:in);if(!datafilel)(CO

18、Ut”文件打开失败!cndl;exit(0);datafilels;i+;CoUt”字符已被发送endl;datafilel.close();receiver(i,datafilel,datafile2,datafile3);调用接收端进行相应操作break;)COUt定时器超时,现重新发送原字符。endl;datafilel.OPen(file1”,ios:outios:in);if(Jdatafilel)(CoUt文件打开失败!endl;exit(0);datafilels;i+;CoUt“字符已被发送“送帧送触 2 I发拦收恸接0)(5)(6)接收确发送 认O号帧2号帧(7)(8)接收接

19、收确 I号帧认I号帧图5-27发送方和接收方状态示意图设计分析:(1)初始态,发送方没有帧发出,发送窗口前后沿相重合。接收方O号窗口打开,等待接收O号帧;(2)发送方打开O号窗口,表示已发出O帧但尚未确认返回信息。此时接收窗口状态不变;(3)发送方打开0、1号窗口,表示0、1号帧均在等待确认之列。至此,发送方打开的窗口数已达规定限度,在未收到新的确认返回帧之前,发送方将暂停发送新的数据帧。接收窗口此时状态仍未变;(4)接收方已收到0号帧,0号窗口关闭,1号窗口打开,表示准备接收1号帧。此时发送窗口状态不变;(5)发送方收到接收方发来的O号帧确认返回信息,关闭O号窗口,表示从重发表中删除O号帧。

20、此时接收窗口状态仍不变;(6)发送方接着发送2号帧,2号窗口打开,表示2号帧也纳入待确认之列。至此,发送方打开的窗口又已达规定限度,在未收到新的确认返回帧之前,发送方将暂停发送新的数据帧,此时接收窗口状态仍不变;(7)接收方已收到1号帧,1号窗口关闭,2号窗口打开,表示准备接收2号帧。此时发送窗口状态不变;(8)发送方收到接收方发来的1号帧收毕的确认信息,关闭1号窗口,表示从重发表中删除1号帧。此时接收窗口状态仍不变。5.2.2协议选择及分析在设计过程中,我主要运用了选择重传协议,该协议能很好地弥补了1比特滑动窗口协议和后退n协议的缺点,是比较完善的滑动窗口协议。在选择重传协议中,当接收方发觉

21、某帧出错后,其后接着送来的正确的帧虽然不能立刻递交给接收方的高层,但接收方仍可收下来,存放在一个缓冲区中,同时要求发送方重新传送出错的那一帧。一旦收到重新传来的帧后,就可以原已存于缓冲区中的其余帧一并按正确的依次递交高层。这种方法称为选择重发(SELECTICEREPEAT),其工作过程如图所示。明显,选择重发削减了奢侈,但要求接收方有足够大的缓冲区空间。5.2.3发送方与接收方设计流程与程序发送方和接收方的设计流程如下:发送方接收方图5-2-2发送方与接收方设计流程依据流程图的实现步骤,我编写了以下的代码。(1)发送方程序:本程序设有四个变量:一是窗口大小变量,二是第一帧序列号变量,三是最近

22、发送的帧变量,最终一个是最近收到的确认帧变量。Swpstatel.head=NULL;变量初始值为空Swpstatel.sendq=sendq-rear=(structsendq-slot*)malIoc(sizeof(structsendq_slot);if(!swpstatel.sendq)exit(1);sendq_rear-next=NULL;Printf(请输入窗口大小:);scanf(zz%ldz,&swpstatel.sws);输入窗口大小swpstatel.rws=swpstatel.sws;把窗口大小的值赋给变量if(swpstatel.sws0)(Printf(请输入第一帧

23、的序列号:);SCanf(%ld”,&swpstatel.hdr.seqnum);输入第一帧序列号swpstatel.nfe=swpstatel.hdr.seqnum;把第一帧的值放进缓冲池内sendp=(structsendq-slot*)malIoc(sizeof(structsendq-slot);if(!sendp)exit(1);sendp-msg=swpstatel.hdr.seqnum;sendp-timeout=l;sendp-next=NULL;sendq_rear-next=sendp;sendq_rear=sendp;-swpstatel.sws;swpstatel.lf

24、s=swpstatel.hdr.seqnum;最近发送的帧取值swpstatel.Iar=Swpstate1.hdr.seqnum;最近收到的确认帧取值do(while(swpstatel.swsO)当窗口大小大于0时,执行以下的循环(sendp=(structsendq-slot*)malIoc(sizeof(structsendq-slot);if(!sendp)exit(1);sendp-msg=swpstatel.lfs+1;假如输入的帧序号大于之前帧序号,那么窗口向前滑动sendp-timeout=l;时延为1sendp-next=NULL;sendq_rear-next=sendp

25、;sendq_rear=sendp;-swpstatel.sws;+swpstatel.lfs;swpstatel.hdr.acknum=O;/ACK清空swpstatel.hdr.flags=O;存储缓冲池清空Printf(最近收到的ACK的帧序号:ldn”,swpstatel.Iar);输出最近收到的ACK帧序号Printf(最近发送的帧序号(发送新帧后):%ldnz,swpstatel.Ifs);输出最近发送帧序号(2)接收方程序:图5-2-3数据包接收过程1、接收方的接收原则从总体上看是先推断输入的数据帧是否在接收范围之内,若是,则接着推断是否符合其他接收条件;若不是,则立即丢弃该数据

26、帧,不再进行其他条件的推断。structsendq_slot*sendq_rear,*sendp,*p3,*p4;设定变量structrecvq_slot*recvp,*recvq_rear,*pl,*p2;if(swpstatel.hdr.fIags=O)上次输入的数据帧被放置在缓存区,输入区被清空do假如接着接收数据帧则实施下面循环Printf(请输入收到的数据帧号:);scanf(%ld,&a);if(a=swpstatel.nfe&anext=NULL;swpstatel.head=recvp;elseif(swpstatel.head!=NULL)(recvp=(structrecv

27、q-slot*)malIoc(sizeof(structrecvq-slot);recvp-next=NULL;recvq_rear-next=recvp;recvq_rear=recvp;)else(Printf(所输数据不在接收窗口内!);break;跳出该循环)2、若输入数据帧在接收范围内则接着推断并进行以下循环。recvp-msg=a;if(recvp-msg=swpstatel.nfe)是否放入缓存推断recvp-received=l;elserecvp-received=O;一swpstatel.rws;if(recvp-received=l)数据帧被接收,则进行下面语句a=a-l

28、;doa=a+l;if(swpstatel.head=NULL)break;pl=swpstatel.head;flag=O;while(a!=pl-msg)&(pl-next!=NULL)(p2=pl;pl=pl-next;if(a=pl-msg)(fIag=I;if(pI=Swpstatel.head)swpstatel.head=swpstatel.head-next;elsep2-next=pl-next;swpstatel.nfe=a+l;swpstatel.hdr.acknum=a+l;swpstatel.hdr.fIags=I;while(flag=l);)printf(,ACK

29、号(期盼的下一帧的序号):%ldnz,swpstatel.nfe);Printf(没按序接受的序号:n);pl=swpstatel.head;whiIe(pl!=NULL)(Printf(%ldt”,pl-msg);pl=pl-next;)3、当接收完一个数据帧时,我们可以选择终止下面的接着接收,也可以选择接着接收。假如接着接收,那么程序跳到推断循环,接着推断是否接收下一个数据帧,原理与上面相当。whiIe(swpstatel.rwsO)&(b=l);if(swpstatel.hdr.fIags=I)p3=swpstatel.sendq-next;flag=O;while(swpstatel.

30、hdr.acknum)!=p3-msg&p3next!=NULL)p4=p3;p3=p3-next;if(swpstatel.hdr.acknum=p3-msg)(fIag=I;if(p3-msg=swpstatel.sendq-next-msg)swpstatel.sendq-next=p3;elseswpstatel.sendq-next=p3;swpstatel.sws=swpstatel.sws+(swpstatel.sendq-next-msg-swpstatel.Iar);Swpstatel.Iar=Swpstatel.sendq-next-msg;Swpstatel.hdr.Se

31、qnUnI=SWPStateLhdr.acknum;printf(,最近收到的ACK的帧序号(收到ACK后):%ldnz,Swpstatel.Iar);Printf(最近发送的帧序号(此时还未发送新的数据):%ldn,z,Swpstatel.Ifs);15.3程序测试下面我以窗口大小为11,第一帧序列号为3,做程序的测试。*H: Debug滑动0 口协议. exe4大帧Ac备鬻 口一的的s接 入入p序 一旧HKJHHflc八巨,111列吃耳:小s序数标序).、 后 M) 3 折-E华续接收帧?若是,输入1,若不是, 收静酒瞬输,3 展按序接婴岛序号:,续接收输若是,输入1,若不是, ,彷蚂的数

32、则号:4 CK例牌的白贞的序号)1 3 户按序接签M序号:,续接战若是4输入1,若不是,2瞥蠲牌篇j) s 7 性按序接曼的序号:卜续接收帧?若是,输入1,若不是,初人的他喇号:7CK细作的下一领的序号)1 8 日按序检英的序号:卜续接收帧?若是,输入1,若不是, 陶八蚓期螂再10 Rc喏(停的下L领的序号):8 忸:按序接曼品序号:Re华续接收帧?若是,输入1.若不是, 相视入螂的数则号:8 CK国舟的卡士旗的序号)1 9 心殳按序接受的序号:0输入0.输入0输入e.输入。.图5-3-1程序测试整体图(1)整体窗口展示,叮嘱行界面图5-3-2整体窗口展示(2)输入窗口大小及第一帧序列号践H:

33、Debug滑动窗口协议.exe后 帧3 3新:医11列即帧 小解序数 大帧Ac鹿 口 I询的到 人入收4 近近输 请官襄请图5-3-3信息设置输入(3)当输入的接收帧并不是ACK期吩的帧,那么依据滑动窗口协议该帧不被接收,且把该帧存放在缓冲区。ACKE遮件的E帧的序号):3没按序接爰的序号:图5-3-4帧不被接收的状况(4)当前面输入的都不是系统所期吩的帧,那么这些帧会始终被存放在缓冲区。直到输入下一个输入的帧的序号比前面输入的帧的序号大,且是系统所期吩的帧时,之前和当前输入的帧会一并被接收,缓冲区清空。接着接收叮嘱,进行新的帧的检测及接收。图5-3-5帧被接收的状况(5)若输入的帧超过了窗口大小,那么系统会显示该帧不在接收范围内,并拒绝接收。6列坪 小的Ke序 大帧Ac帧 口 一的的 入入收发近图5-3-6帧超出窗口大小范围号口此入.输 U 数蕃是 的在帧?的吗 y行 人数养结束语通过此次试验,我对ARQ协议的原理以及基本工作过程有了更深化的理解、驾驭。同时在确定程度上增加了我的独立编程实力和独立思索实力。越来更加觉,编程其实没那么难,但想成为高手也很不简洁。参考文献(1)计算机网络(第5版)谢希仁著电子工业出版社(2)李仁发,何彦.基于虚拟试验方法的滑动窗口协议分析J.系统仿真学报,2023,8(14):1026-1063.(3)特南鲍姆.计算机网络(第四版).清华出版

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 在线阅读 > 生活休闲


备案号:宁ICP备20000045号-1

经营许可证:宁B2-20210002

宁公网安备 64010402000986号