




已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验一 滑动窗口协议实验u 实验目的:在NetRiver实验系统中,用C语言实现滑动窗口协议中的1比特滑动窗口协议和后退N帧协议,理解滑动窗口协议u 实验原理和说明:(1).窗口机制滑动窗口协议的基本原理就是在任意时刻,发送方都维持了一个连续的允许发送的帧的序号,称为发送窗口;同时,接收方也维持了一个连续的允许接收的帧的序号,称为接收窗口。发送窗口和接收窗口的序号的上下界不一定要一样,甚至大小也可以不同。不同的滑动窗口协议窗口大小一般不同。发送方窗口内的序列号代表了那些已经被发送,但是还没有被确认的帧,或者是那些可以被发送的帧。下面举一个例子(假设发送窗口尺寸为2,接收窗口尺寸为1):分析:初始态,发送方没有帧发出,发送窗口前后沿相重合。接收方0号窗口打开,等待接收0号帧;发送方打开0号窗口,表示已发出0帧但尚确认返回信息。此时接收窗口状态不变;发送方打开0、1号窗口,表示0、1号帧均在等待确认之列。至此,发送方打开的窗口数已达规定限度,在未收到新的确认返回帧之前,发送方将暂停发送新的数据帧。接收窗口此时状态仍未变;接收方已收到0号帧,0号窗口关闭,1号窗口打开,表示准备接收1号帧。此时发送窗口状态不变;发送方收到接收方发来的0号帧确认返回信息,关闭0号窗口,表示从重发表中删除0号帧。此时接收窗口状态仍不变;发送方继续发送2号帧,2号窗口打开,表示2号帧也纳入待确认之列。至此,发送方打开的窗口又已达规定限度,在未收到新的确认返回帧之前,发送方将暂停发送新的数据帧,此时接收窗口状态仍不变;接收方已收到1号帧,1号窗口关闭,2号窗口打开,表示准备接收2号帧。此时发送窗口状态不变;发送方收到接收方发来的1号帧收毕的确认信息,关闭1号窗口,表示从重发表中删除1号帧。此时接收窗口状态仍不变。若从滑动窗口的观点来统一看待1比特滑动窗口、后退n及选择重传三种协议,它们的差别仅在于各自窗口尺寸的大小不同而已。1比特滑动窗口协议:发送窗口=1,接收窗口=1;后退n协议:发窗口1,接收窗口1;选择重传协议:发送窗口1,接收窗口1。(2).1比特滑动窗口协议当发送窗口和接收窗口的大小固定为1时,滑动窗口协议退化为停等协议(stopandwait)。该协议规定发送方每发送一帧后就要停下来,等待接收方已正确接收的确认(acknowledgement)返回后才能继续发送下一帧。由于接收方需要判断接收到的帧是新发的帧还是重新发送的帧,因此发送方要为每一个帧加一个序号。由于停等协议规定只有一帧完全发送成功后才能发送新的帧,因而只用一比特来编号就够了。其发送方和接收方运行的流程图如图所示。(3).后退n协议由于停等协议要为每一个帧进行确认后才继续发送下一帧,大大降低了信道利用率,因此又提出了后退n协议。后退n协议中,发送方在发完一个数据帧后,不停下来等待应答帧,而是连续发送若干个数据帧,即使在连续发送过程中收到了接收方发来的应答帧,也可以继续发送。且发送方在每发送完一个数据帧时都要设置超时定时器。只要在所设置的超时时间内仍收到确认帧,就要重发相应的数据帧。如:当发送方发送了N个帧后,若发现该N帧的前一个帧在计时器超时后仍未返回其确认信息,则该帧被判为出错或丢失,此时发送方就不得不重新发送出错帧及其后的N帧。从这里不难看出,后退n协议一方面因连续发送数据帧而提高了效率,但另一方面,在重传时又必须把原来已正确传送过的数据帧进行重传(仅因这些数据帧之前有一个数据帧出了错),这种做法又使传送效率降低。由此可见,若传输信道的传输质量很差因而误码率较大时,连续测协议不一定优于停止等待协议。此协议中的发送窗口的大小为k,接收窗口仍是1。(4).选择重传协议在后退n协议中,接收方若发现错误帧就不再接收后续的帧,即使是正确到达的帧,这显然是一种浪费。另一种效率更高的策略是当接收方发现某帧出错后,其后继续送来的正确的帧虽然不能立即递交给接收方的高层,但接收方仍可收下来,存放在一个缓冲区中,同时要求发送方重新传送出错的那一帧。一旦收到重新传来的帧后,就可以原已存于缓冲区中的其余帧一并按正确的顺序递交高层。这种方法称为选择重发(SELECTICE REPEAT),其工作过程如图所示。显然,选择重发减少了浪费,但要求接收方有足够大的缓冲区空间。u 实验代码以及代码说明:实现代码如下:#include sysinclude.h#include using std : deque;using std : cout;using std : endl;using namespace std;extern void SendFRAMEPacket(unsigned char* pData, unsigned int len);#define WINDOW_SIZE_STOP_WAIT 1#define WINDOW_SIZE_BACK_N_FRAME 4 /* the max windows size */typedef enum data, ack, nak frame_kind;/* define the structure of frame and frame head */typedef struct frame_head frame_kind kind;unsigned int seq;unsigned int ack;unsigned char data100;typedef struct frame frame_head head;unsigned int size;/* define the buffer zone */struct StoreType frame *pfrm;unsigned int sz;deque mQue;deque mQue2;bool sendWinFull = false;int counter = 0;/* 停等协议测试函数*/int stud_slide_window_stop_and_wait(char *pBuffer, int bufferSize, UINT8 messageType)unsigned int ack;unsigned int num;StoreType s;/* by the messagetype to decide */switch(messageType) case MSG_TYPE_TIMEOUT:num = ntohl(*(unsigned int *)pBuffer);s = mQue.front();/* if the seq is OK,send it */if (num = (* s.pfrm).head.seq) SendFRAMEPacket(unsigned char *)(s.pfrm), s.sz);break;case MSG_TYPE_SEND:/* prepare a new frame */s.pfrm = new frame;(*s.pfrm) = *(frame *)pBuffer;s.sz = bufferSize;mQue.push_back(s);/* send all the data in buffer */if (!sendWinFull) s = mQue.front();SendFRAMEPacket(unsigned char *)(s.pfrm), s.sz);sendWinFull = true;break;case MSG_TYPE_RECEIVE:/* receive ack */ack = ntohl(frame *)pBuffer)-head.ack);if (mQue.size() != 0) s = mQue.front();if (ntohl(s.pfrm-head.seq) = ack) /* receive right ack seq number */mQue.pop_front();s = mQue.front();/?SendFRAMEPacket(unsigned char *)s.pfrm), s.sz);/* send frames again */ else sendWinFull = true; /* databuffer is empty */break;return 0;/* 回退n帧测试函数*/int stud_slide_window_back_n_frame(char *pBuffer, int bufferSize, UINT8 messageType)int ack;int num;int j;/* var used in loop as number */int k;StoreType s;/* next is to choose from the vars */switch (messageType) case MSG_TYPE_TIMEOUT:num = ntohl(*(unsigned int *)pBuffer); /* data change */for (j = 0; j mQue2.size() & j WINDOW_SIZE_BACK_N_FRAME; j+) s = mQue2j;if (*s.pfrm).head.seq = num)break;for (k = j; k WINDOW_SIZE_BACK_N_FRAME & k mQue2.size(); k+) s = mQue2k;SendFRAMEPacket(unsigned char *)(s.pfrm), s.sz);/* resend frames */break;case MSG_TYPE_SEND:s.pfrm = new frame;(*s.pfrm) = *(frame *)pBuffer;s.sz = bufferSize;mQue2.push_back(s);if (counter head.ack;/* receive correct ack */for (j = 0; j WINDOW_SIZE_BACK_N_FRAME & j mQue2.size(); j+)s = mQue2j;if (ack = (*s.pfrm).head.seq) break;if (j mQue2.size() & j WINDOW_SIZE_BACK_N_FRAME)for (k = 0; k = j; k+) mQue2.pop_front();counter-; /* reset cuounter */k = counter;for (; k WINDOW_SIZE_BACK_N_FRAME & k mQue2.size() & counter head.ack)相同,继续
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 表格式北师大版六年级数学上册教案
- 设备供货进度计划和保证项目完成的具体措施
- 从职业规划到岗位发展的全流程指导
- 2025年android下载!Android基础面试常常死在这几个问题上值得收藏!-android 批量下载 面试
- 建筑施工特种作业-桥(门)式起重机司机真题库-9
- 山东英语写作题目及答案
- 溶液稀释类题目及答案
- 2023-2024学年云南省昆明市高二下学期期末质量检测数学试题(解析版)
- 2023-2024学年山东省日照市高二下学期期末考试数学试题(解析版)
- 2025届贵州省安顺市高三适应性检测(三模)语文试题(解析版)
- 北京市顺义区2023-2024学年六年级下学期数学期末试卷(含答案)
- JG/T 283-2010膨胀玻化微珠轻质砂浆
- 电力法规考试试题及答案
- 2025昆明医科大学海源学院辅导员考试试题及答案
- 路沿石购销合同模板
- 谁是消费“领头羊”:人口周期改变消费模式221mb
- 2024福建省闽投深海养殖装备租赁有限责任公司招聘7人笔试参考题库附带答案详解
- 2025年江西省赣州市八年级中考模拟预测生物试题(含答案)
- 车牌过户协议书范本
- 火灾自动报警系统故障应急预案
- 《拓印新貌》教学课件-2024-2025学年沪书画版(五四学制)(2024)初中美术六年级下册
评论
0/150
提交评论