




已阅读5页,还剩19页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
课程设计报告学 院:*专业名称:软件工程课程名称:网络技术课程设计课程代码:*所在班级:*学 号:*姓 名:*课题名称: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实验内容.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文件的内容每次都会更新,并且采用简单的字符代表复杂的字符串,这些简化都使程序更加简洁,但并未影响整个模拟功能的实现。为了更加流畅地更新、利用文件中的数据,sender()函数调用了receiver()函数,以及时对文件数据进行接收端的相应处理,以供发送端使用。从而模拟实现整个发送接收过程。第1章实验介绍11实验目的(1)掌握停止等待协议的基本原理(2)理解数据链路层的主要功能(数据出错控制,数据重复控制,数据丢失控制等等)(3)分析简单的协议数据单元(4)掌握停止等待协议的运行机制(5)了解连续ARQ协议(6)掌握滑动窗口的工作机制第2章协议介绍2. 1停止等待协议简单介绍(ARQ): 停止等待协议是数据链路层的几个协议中最基本的协议,是数据链路层各种协议的基础。此实验是基于winsock编程,是在VC+6.0的windows界面下和控制台下实现的。它采用客户机/服务器(C/S)模型。停止等待协议就是通过双方的收发数据而达到相互通信的目的。在通信时,当收方收到一个正确的数据帧后,便会向发送方发送一个确认帧ACK,表示发送的数据正确接收。当发送方收到确认帧后才能发送一个新的数据帧,这样就实现了接收方对发送方的流量控制。由于通信线路质量各方面的影响,数据帧从发送方到接收方传输的过程中可能会出现差错。为了保证数据的正确性和完整性,接收方在收到数据后,会用一定的方法对接收到的数据进行差错检验,所以接收方很容易检测出收到的数据帧是否出现差错。当接收方发现收到的数据出现差错时,就会向发送方发送一个否认帧NAK,表示对方发送的数据错误。发送方会根据接收方发来的信息做出相应的操作。采用这样的有效的检错机制,数据链路层可以对上面的网络层提供了可靠的传输的服务。2. 2停等协议中相关事件的介绍帧丢失:有时,链路上的噪声干扰很严重,或者由于其他的一些原因,接收方收不到发送方发送过来的数据帧,这种情况称为数据帧丢失。发生数据帧丢失时,接收方自然不会向发送方发送任何应答帧。如果发送方要等收到收方的应答信息后再发送下一个数据帧,那么双方将永远等下去,这样就出现了死锁现象。为了解决这个问题,可在发送方发送完一个数据帧后,就启动一个超时定时器。若到了超时定时器所设置的重发时间tout仍收不到收方的任何应答帧,则发送方就重传前面所发送的这一数据帧。如果在重传时间tout内收到确认信息,则将超时定时器清零并停止计时。tout一般的时间设置为略大于“从发完数据帧到收到确认帧所需的平均时间”。帧重复:若丢失的是应答帧,则超时重发将会使接收方收到两个同样的数据帧。由于接收方无法识别重复的数据帧,因而在接收方收到的数据中出现了一种接收序号差错,称为重复帧。要解决这个问题,必须使每一个数据帧带上不同的发送序号。若接收方收到序号相同的数据帧,就表明出现了重复帧。这时接收方应当丢弃这个重复帧,同时向发送方发送一个确认帧。因为接收方这时已经知道发送方没有收到上一次发送的确认帧。大家都知道,任何一个编号系统的序号所占用的比特数应是有限的。经过一段时间,发送序号就可重复。使用序号占用的比特数越少,数据传输的额外开销就越少。对于停等协议,由于每发送一个数据帧就停止等待,用一个比特来编号就够了,也就是说序号轮流使用0和1。帧出错:数据在传输的过程中,不可能保证100%的正确传输,而错误的数据帧对于接收方来说是没有什么意义的。为了避免收到错误的数据帧,接收方在收到数据帧后,就会采用一定的机制对收到的数据帧进行校验,当校验数据正确时,会向高层传送该帧,反之,则丢弃该帧,从而对上面的网络层提供了传输的服务。2. 3连续ARQ协议简述2.3.1介绍 回退n帧(go-back-n)GBN,以及选择性重传(selective repeat)ARQ,两种协议是滑动窗口技术与请求重发技术的结合,由于窗口尺寸开到足够大时,帧在线路上可以连续地流动,因此又称其为连续ARQ协议。连续重发请求ARQ方案是指发送方可以连续发送一系列信息帧,即不用等前一帧被确认便可继续发送下一帧,效率大大提高。但在这种重发请求方案中,需要在发送方设置一个较大的缓冲存储空间(称作重发表),用以存放若干待确认的信息帧。当发送方收到对某信息帧的确认帧后,便可从重发表中将该信息帧删除。所以,连续重发请求ARQ方案的链路传输效率大大提高,但相应地需要更大的缓冲存储空间。在这一协议中,当发送站点发送完一个数据帧后,不是停下来等待应答帧,而是可以连续再发送若干个数据帧。如果在此过程中又收到了接收端发来的应答帧,那么还可以接着发送数据帧。由于减少了等待时间,整个通信的吞吐量就提高了。ARQ代表的是自动重传请求(Auto Repeat reQuest,ARQ),而GBN与选择重传都属于其中。其中BGN的接收窗口是1,且具有累计确认的特点。而选择重传没有累计确认的特点。2.3.2特点与原理 连续重发请求ARQ方案的特点如下:(1)发送方连续发送信息帧,而不必等待确认帧的返回;(2)在重发表中保存所发送的每个帧的备份;(3)重发表按先进先出(FIFO)队列规则操作;(4)接收方对每一个正确收到的信息帧返回一个确认帧,每一个确认帧包含一个惟一的序号,随相应的确认帧返回;(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中,并启动计时器;(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()函数模拟接收端的相应处理过程;(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 &datafile3);/发送方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) 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)/读取的字符无效,即接受字符出错 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=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:in);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,datafile2,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定时器超时,现重新发送原字符。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); /输入第一帧序列号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; /最近发送的帧取值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=sendp; -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处理在接收队列中的包(如果是普通包要判断序号,或者进行拆包,组包操作)结束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(请输入收到的数据帧号:); 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-msg=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.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、当接收完一个数据帧时,我们可以选择终止下面的继续接收,也可以选择继续接收。如果继续接收,那么程序跳到判断循环,继续判断是否接收下一个数据帧,原理与上面相当。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
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 重庆科技职业学院《毒理学基础》2023-2024学年第二学期期末试卷
- 西安建筑科技大学华清学院《多元社会与全球化(商务世界中的跨文化交际)》2023-2024学年第二学期期末试卷
- 湖南化工职业技术学院《技术及其应用》2023-2024学年第二学期期末试卷
- 昆明文理学院《生物统计附试验设计》2023-2024学年第二学期期末试卷
- 文华学院《水工程实验技术》2023-2024学年第二学期期末试卷
- 台州职业技术学院《中医内科见习及病案训练(二)》2023-2024学年第一学期期末试卷
- 湛江幼儿师范专科学校《特殊儿童教育》2023-2024学年第二学期期末试卷
- 可克达拉职业技术学院《汉语知识百科》2023-2024学年第二学期期末试卷
- 货物运输框架合同书
- 劳务分包合同钢筋工
- 全球卫生合作国际援助与医疗外交的重要性培训课件
- 七星瓢虫课件
- 2024年英才计划笔试化学
- MySQL数据库考试试题及答案精编
- 2023研发费用加计扣除课件
- 国家开放大学《小城镇建设》形考任务1-4参考答案
- 曾国藩人生修炼日课
- 2022年全国小学生天文知识竞赛考试题库(含答案)
- 竣工结算审计服务投标方案
- 深入浅出Serverless:技术原理与应用实践课件
- 贵州省师范大学贵安新区附属初级中学八年级下学期期中考试语文卷(含解析)
评论
0/150
提交评论