全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Exp1 滑动窗口协议 实验报告【实验目标】l 理解和掌握“滑动窗口”技术。l 基于计算机网络实验系统NetRiver进行。l NetRiver系统提供了各实验的上下文和接口函数,利用C/C+编程语言实现典型协议的核心部分。l 使用NetRiver系统完成程序代码的编译、调试和测试,验证协议实现的正确性。【实验原理】1-bit滑动窗口协议1-bit滑动窗口协议中,需要保证发送窗口大小不超过1。我们用ack_expected表示发送窗口下界,即希望得到确认的帧号;用window_size表示当前发送窗口的大小。当有事件到达时,根据事件的类型进行相应处理:l 超时事件:此时pBuffer指向的UINT32类型存储的是主机序的序列号seq,将seq与当前窗口区间ack_expected, ack_expected+windoe_size)进行比较,从seq开始连续进行发送。l 网络层发送事件:此时网络层想要发送一个新帧,pBuffer指向的是网络层准备好的帧,我们将该帧放入缓冲队列,并在发送窗口未满时进行1次发送。l 帧到达事件:此时我们收到了一个帧,通过ntohl将其确认号转化成主机序ack,然后对比ack是否等于ack_expected,若是则发送窗口下界加1,此时若还有帧在缓冲区则尝试进行1次发送,发送窗口上界加1。回退n帧滑动窗口协议回退n帧滑动窗口协议和1-bit滑动窗口协议相比,主要的区别在于窗口大小的不同,以及处理超时事件时,应从超时的帧开始进行连续发送。其他事件的处理则没有不同。【实验中遇到的问题】起始编号实验中帧号从1开始编号,而不是通常认为的0。静态变量由于两个函数将被分别连续调用,故不适合使用全局变量,否则将出现未初始化的现象。这里我使用了函数内的静态变量来保证合适的初始值。实验系统不稳定实验过程中挺经常遇到服务器超时的现象,而且有时同一个程序运行两次也会有不同的结果。一个经验性的做法是在程序中增加一些cout语句,实践上能够保证结果正确,但具体原因尚不清楚。【源代码】#include sysinclude.h#include 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/ 帧类型typedef enum data, ack, nak frame_kind;/ 帧头typedef struct frame_head frame_kindkind;/帧类型unsigned intseq;/序号unsigned intack;/确认号unsigned chardata100;/数据;/ 完整帧typedef struct frame frame_headhead;/帧头unsigned intsize;/数据的大小;/ 队列元素 typedef struct store_elm frame*pframe;/帧头unsigned intlen;/数据长度;/* 停等协议测试函数*/int stud_slide_window_stop_and_wait(char *pBuffer, int bufferSize, UINT8 messageType)/ 发送缓冲区static deque buffDeque;static UINT32 window_size = 0;static UINT32 ack_expected = 1;/ 起始编号为 1UINT32 seq, ack;store_elm s;switch (messageType) case MSG_TYPE_TIMEOUT:seq = *(UINT32 *)pBuffer);/ 给出主机序if (ack_expected = seq & seq ack_expected + window_size) for (UINT32 i = seq - ack_expected; i window_size; +i)SendFRAMEPacket(unsigned char *)(buffDequei.pframe), buffDequei.len);break;case MSG_TYPE_SEND:s.pframe = new frame;/ 缓存新帧*s.pframe = *(frame *)pBuffer;s.len = bufferSize;buffDeque.push_back(s);if (window_size head.ack);ack_expected = ntohl(buffDeque0.pframe-head.seq);if (ack = ack_expected) / 如果是等待的帧buffDeque.pop_front();-window_size;+ack_expected;if (buffDeque.size() 0 & window_size WINDOW_SIZE_STOP_WAIT) / 尝试发送s = buffDequewindow_size+;SendFRAMEPacket(unsigned char *)(s.pframe), s.len);break;default:break;return 0;/* 回退n帧测试函数*/int stud_slide_window_back_n_frame(char *pBuffer, int bufferSize, UINT8 messageType)/ 发送缓冲区static deque buffDeque;static UINT32 window_size = 0;static UINT32 ack_expected = 1;/ 起始编号为 1UINT32 seq, ack;store_elm s;cout message Type : (char) (0 + messageType) endl;switch (messageType) case MSG_TYPE_TIMEOUT:seq = *(UINT32 *)pBuffer);/ 给出主机序if (ack_expected = seq & seq ack_expected + window_size) for (UINT32 i = seq - ack_expected; i window_size; +i)SendFRAMEPacket(unsigned char *)(buffDequei.pframe), buffDequei.len);break;case MSG_TYPE_SEND:s.pframe = new frame;/ 缓存新帧*s.pframe = *(frame *)pBuffer;s.len = bufferSize;buffDeque.push_back(s);if (window_size head.ack);ack_expected = ntohl(buffDeque0.pframe-head.seq);while (ack = ack_expected) / 如果是等待的帧buffDeque.pop_front();-window_size;+ack_expected;if (buffDeque.size() 0 & window_size WINDOW_SIZE_BACK_N_FRAME) /
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 品牌线上推广完整策划方案范文
- 城市轨道交通安全管理方案实例
- 教师职业道德规范与师德建设方案
- 2026年数字证书申请代理合同
- 成人远程教育课程设计与实施方案
- 营销活动策划方案及效果评估工具
- 守信服务合同履行承诺书5篇
- 土建工程清包合同模板及风险提示
- 建筑施工人工智能发展方案评估方案
- 道路开挖施工测量方案
- GB/T 222-2025钢及合金成品化学成分允许偏差
- 国家安全教育高教-第六章坚持以经济安全为基础
- 《数学分析》课程教学大纲
- 北京导游考试口试导游词
- 楼道保洁标准作业规程
- 办公室办公用品领用登记表
- 新生儿溶血三项检测临床应用
- 2022年《国民经济行业分类》
- GB∕T 41441.1-2022 规模化畜禽场良好生产环境 第1部分:场地要求
- 税务知识培训PPT通用课件
- 电镀工艺流程讲解
评论
0/150
提交评论