欢迎来到天天文库
浏览记录
ID:31830668
大小:63.50 KB
页数:12页
时间:2019-01-20
《exp1_滑动窗口协议_实验报告.docx》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Exp1滑动窗口协议实验报告【实验目标】l理解和掌握“滑动窗口”技术。l基于计算机网络实验系统NetRiver进行。lNetRiver系统提供了各实验的上下文和接口函数,利用C/C++编程语言实现典型协议的核心部分。l使用NetRiver系统完成程序代码的编译、调试和测试,验证协议实现的正确性。【实验原理】1-bit滑动窗口协议1-bit滑动窗口协议中,需要保证发送窗口大小不超过1。我们用ack_expected表示发送窗口下界,即希望得到确认的帧号;用window_size表示当前发送窗口的大小。当有事件到达时,根据事件的类型进行相应处理:
2、l超时事件:此时pBuffer指向的UINT32类型存储的是主机序的序列号seq,将seq与当前窗口区间[ack_expected,ack_expected+windoe_size)进行比较,从seq开始连续进行发送。l网络层发送事件:此时网络层想要发送一个新帧,pBuffer指向的是网络层准备好的帧,我们将该帧放入缓冲队列,并在发送窗口未满时进行1次发送。l帧到达事件:此时我们收到了一个帧,通过ntohl将其确认号转化成主机序ack,然后对比ack是否等于ack_expected,若是则发送窗口下界加1,此时若还有帧在缓冲区则尝试进行1次发
3、送,发送窗口上界加1。回退n帧滑动窗口协议回退n帧滑动窗口协议和1-bit滑动窗口协议相比,主要的区别在于窗口大小的不同,以及处理超时事件时,应从超时的帧开始进行连续发送。其他事件的处理则没有不同。【实验中遇到的问题】起始编号实验中帧号从1开始编号,而不是通常认为的0。静态变量由于两个函数将被分别连续调用,故不适合使用全局变量,否则将出现未初始化的现象。这里我使用了函数内的静态变量来保证合适的初始值。实验系统不稳定实验过程中挺经常遇到服务器超时的现象,而且有时同一个程序运行两次也会有不同的结果。一个经验性的做法是在程序中增加一些cout语句,
4、实践上能够保证结果正确,但具体原因尚不清楚。【源代码】#include"sysinclude.h"#includeusingnamespacestd;externvoidSendFRAMEPacket(unsignedchar*pData,unsignedintlen);#defineWINDOW_SIZE_STOP_WAIT1#defineWINDOW_SIZE_BACK_N_FRAME4//帧类型typedefenum{data,ack,nak}frame_kind;//帧头typedefstructframe_head{f
5、rame_kindkind;//帧类型unsignedintseq;//序号unsignedintack;//确认号unsignedchardata[100];//数据};//完整帧typedefstructframe{frame_headhead;//帧头unsignedintsize;//数据的大小};//队列元素typedefstructstore_elm{frame*pframe;//帧头unsignedintlen;//数据长度};/**停等协议测试函数*/intstud_slide_window_stop_and_wait(cha
6、r*pBuffer,intbufferSize,UINT8messageType){//发送缓冲区staticdequebuffDeque;staticUINT32window_size=0;staticUINT32ack_expected=1;//起始编号为1UINT32seq,ack;store_elms;switch(messageType){caseMSG_TYPE_TIMEOUT:seq=*((UINT32*)pBuffer);//给出主机序if(ack_expected<=seq&&seq7、ted+window_size){for(UINT32i=seq-ack_expected;i8、IZE_STOP_WAIT){//尝试发送s=buffDeque[window_size++];SendFRAMEPacket((unsignedchar*)(s.
7、ted+window_size){for(UINT32i=seq-ack_expected;i8、IZE_STOP_WAIT){//尝试发送s=buffDeque[window_size++];SendFRAMEPacket((unsignedchar*)(s.
8、IZE_STOP_WAIT){//尝试发送s=buffDeque[window_size++];SendFRAMEPacket((unsignedchar*)(s.
此文档下载收益归作者所有