Exp1滑动窗口协议实验报告

上传人:壹****1 文档编号:489501142 上传时间:2022-08-14 格式:DOCX 页数:5 大小:21.22KB
返回 下载 相关 举报
Exp1滑动窗口协议实验报告_第1页
第1页 / 共5页
Exp1滑动窗口协议实验报告_第2页
第2页 / 共5页
Exp1滑动窗口协议实验报告_第3页
第3页 / 共5页
Exp1滑动窗口协议实验报告_第4页
第4页 / 共5页
Exp1滑动窗口协议实验报告_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《Exp1滑动窗口协议实验报告》由会员分享,可在线阅读,更多相关《Exp1滑动窗口协议实验报告(5页珍藏版)》请在金锄头文库上搜索。

1、Exp1 滑动窗口协议 实验报告【实验目标】l 理解和掌握“滑动窗口”技术。l 基于计算机网络实验系统NetRiver进行。l NetRiver系统提供了各实验的上下文和接口函数,利用C/C+编程语言实现典型协议的核心部分。l 使用NetRiver系统完成程序代码的编译、调试和测试,验证协议实现的正确性。【实验原理】1-bit滑动窗口协议1-bit滑动窗口协议中,需要保证发送窗口大小不超过1。我们用ack_expected表示发送窗口下界,即希望得到确认的帧号;用window_size表示当前发送窗口的大小。当有事件到达时,根据事件的类型进行相应处理:l 超时事件:此时pBuffer指向的UI

2、NT32类型存储的是主机序的序列号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滑动窗口协议相

3、比,主要的区别在于窗口大小的不同,以及处理超时事件时,应从超时的帧开始进行连续发送。其他事件的处理则没有不同。【实验中遇到的问题】起始编号实验中帧号从1开始编号,而不是通常认为的0。静态变量由于两个函数将被分别连续调用,故不适合使用全局变量,否则将出现未初始化的现象。这里我使用了函数内的静态变量来保证合适的初始值。实验系统不稳定实验过程中挺经常遇到服务器超时的现象,而且有时同一个程序运行两次也会有不同的结果。一个经验性的做法是在程序中增加一些cout语句,实践上能够保证结果正确,但具体原因尚不清楚。【源代码】#include sysinclude.h#include using namespa

4、ce 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;/数据;/ 完

5、整帧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

6、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),

7、 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

8、 (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;sta

9、tic 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 -

10、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);

11、while (ack = ack_expected) / 如果是等待的帧buffDeque.pop_front();-window_size;+ack_expected;if (buffDeque.size() 0 & window_size WINDOW_SIZE_BACK_N_FRAME) / 尝试发送s = buffDequewindow_size+;SendFRAMEPacket(unsigned char *)(s.pframe), s.len);break;case MSG_TYPE_RESEND:seq = *(UINT32 *)pBuffer);/ 给出主机序default:break;return 0; /

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 商业合同/协议

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号