欢迎来到天天文库
浏览记录
ID:39696114
大小:21.25 KB
页数:6页
时间:2019-07-09
《滑动窗口实验报告》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、滑动窗口实验报告(含源码)一、实验目的1.实现一个数据链路层协议的数据传送部分。2.更好地理解数据链路层协议中的“滑动窗口”技术的基本工作原理。3.掌握计算机网络协议的基本实现技术。二、实验要求在一个数据链路层的模拟实现环境中,用C语言实现下两个数据链路层协议。1.1比特滑动窗口协议2.回退N帧滑动窗口协议三、实验内容充分理解滑动窗口协议,根据滑动窗口协议,模拟滑动窗口协议中发送端的功能,对系统发送的帧进行缓存并加入窗口等待确认,并在超时或者错误时对部分帧进行重传。编写停等及退回N滑动窗口协议函数,响应系统的发送请求、接收帧消息以及超时消息,并根据滑动窗
2、口协议进行相应处理。四、源代码及注释#include"sysinclude.h"#includeusingnamespacestd;externvoidSendFRAMEPacket(unsignedchar*pData,unsignedintlen);//1比特滑动窗口#defineWINDOW_SIZE_STOP_WAIT1//回退N帧协议#defineWINDOW_SIZE_BACK_N_FRAME4//缓存区大小#defineBUFFER_SIZE50typedefenum{DATA,ACK,NAK}Frame_kind;//
3、帧头typedefstructFrame_head{Frame_kindkind;unsignedintseq;unsignedintack;unsignedchardata[100];};//帧typedefstructFrame{Frame_headhead;unsignedintsize;};//缓存区Framebuffer[BUFFER_SIZE];//当前希望确认的帧,最近缓存的帧,下一次要发送的帧unsignedintexpect_frame=0,last_buffered_frame=0,next_frame=0;/**停等协议测试函数*/
4、intstud_slide_window_stop_and_wait(char*pBuffer,intbufferSize,UINT8messageType){Frame_head*p=(Frame_head*)pBuffer;//unsignedintframeNum=ntohl(*(unsignedint*)pBuffer);switch(messageType){//网络层要发送一帧数据时caseMSG_TYPE_SEND:{//缓存当前要发送的帧buffer[last_buffered_frame%BUFFER_SIZE].head=*p;buf
5、fer[last_buffered_frame%BUFFER_SIZE].size=bufferSize;//更新下次缓存的位置++last_buffered_frame;//如果当前有空闲的窗口可以用if(last_buffered_frame-expect_frame<=WINDOW_SIZE_STOP_WAIT){//发送缓存帧SendFRAMEPacket((unsignedchar*)pBuffer,(unsignedint)bufferSize);//窗口上界加1++next_frame;}return0;}//物理层收到一帧数据时caseM
6、SG_TYPE_RECEIVE:{//解码确认信号unsignedintack=ntohl(p->ack);//试探for(inti=expect_frame;i=exp_ack){//期望帧+1++expect_frame;//如果有缓存帧没发出if(next_frame7、endFRAMEPacket((unsignedchar*)(&buffer[next_frame%BUFFER_SIZE]),buffer[next_frame%BUFFER_SIZE].size);//窗口上界+1++next_frame;}//否则,无法继续发送帧,退出。等待下次再更新期望确认帧elsebreak;}}return0;}//超时caseMSG_TYPE_TIMEOUT:{//超时重发,把当前窗口内未确认的帧重发一遍for(inti=expect_frame;intohl(8、buffer[i%BUFFER_SIZE].head.seq))continue
7、endFRAMEPacket((unsignedchar*)(&buffer[next_frame%BUFFER_SIZE]),buffer[next_frame%BUFFER_SIZE].size);//窗口上界+1++next_frame;}//否则,无法继续发送帧,退出。等待下次再更新期望确认帧elsebreak;}}return0;}//超时caseMSG_TYPE_TIMEOUT:{//超时重发,把当前窗口内未确认的帧重发一遍for(inti=expect_frame;intohl(
8、buffer[i%BUFFER_SIZE].head.seq))continue
此文档下载收益归作者所有