计算机网络--滑动窗口实验报告
本作品内容为计算机网络--滑动窗口实验报告,格式为 docx ,大小 234849 KB ,页数为 15页
('计算机网络滑动窗口协议实验报告目录一、实验内容和实验环境描述(2)1.实验内容(2)2.实验目的(2)3.实验环境(2)二、协议设计(3)三、软件设计(4)PartA选择重传协议1.数据结构(4)2.模块结构(6)3.算法流程(7)PartBgobackn协议1.数据结构(8)2.模块结构(9)3.算法流程(10)四、实验结果分析(11)五、探究问题(13)六、实验总结与心得体会(14)一、实验内容和实验环境描述1.实验内容利用所学数据链路层原理,自己设计一个滑动窗口协议在仿真环境下编程实现有噪音信道环境下两站点之间无差错双工通信。信道模型为8000bps全双工卫星信道,信道传播时延270毫秒,信道误码率为10−5,信道提供字节流传输服务,网络层分组长度固定为256字节。2.实验目的通过该实验,进一步巩固和深刻理解数据链路层误码检测的CRC校验技术,以及滑动窗口的工作机理。滑动窗口机制的两个主要目的:(1)实现有噪音信道环境下的无差错传输;(2)充分利用传输信道的带宽。在程序能够稳定运行并成功实现第一个目标之后,运行程序并检查在信道没有误码和存在误码两种情况下的信道利用率。为实现第二个目标,提高滑动窗口协议信道利用率,需要根据信道实际情况合理地为协议配置工作参数,包括滑动窗口的大小和重传定时器时限以及ACK搭载定时器的时限。3.实验环境Windows10环境PC机MicrosoftVisualStudio2017集成开发环境二、协议设计本次试验主要设计数据链路层,实验中分别设计了gobackn协议与选择重传协议。主要涉及到的层次结构是物理层、数据链路层、网络层。物理层:为数据链路层提供的服务为8000bps,270ms传播延时,10−5误码率的字节流传输通道。数据链路层利用接口函数send_frame()和recv_frame()从物理层发送和接收一帧。网络层:利用数据链路层提供的“可靠的分组传输”服务,在站点A与站点B之间交换长度固定为256字节的数据分组。网络层把产生的分组交付数据链路层,并接受数据链路层提交来的数据分组。数据链路层:通过get_packet()函数从网络层得到一个分组,将之组装成帧,向物理层发送,启动计时器;进行适当的流量控制;数据帧经信道传送给接收方;接收方数据链路层终止定时器(或启动ack定时器),判断数据是否出错,若正确的话,是否为欲接受数据。若所受到的数据帧是期待接受的数据帧,则通过put_packet()函数将其缓冲区内缓存的数据依序提交给网络层。可靠通信的实现:通过捎带确认来完成可靠的数据通信。在选择重传协议中:1)出现信道误码导致收帧出错时,若未发送过该帧的NAK则接收方发NAK帧要求发送方重传;若已经发送过NAK,则等待定时器超时后发送方重发;2)当收到的帧位于接收窗口内,但不是接收窗口下边界的一帧时,将该帧进行缓存,待窗口下边界的帧到来后依序递交给网络层;3)接收方无数据传送导致发送方无法收到捎带确认时,接收方ACK定时器超时,构造ACK帧单独传送。在gobackn协议中:1)出现信道误码导致收帧出错时,等待定时器超时后发送方重发;2)当收到的帧不是期望收到的数据帧时,不做处理,等待定时器超时后发送方重发;3)接收方无数据传送导致发送方无法收到捎带确认时,接收方ACK定时器超时,构造ACK帧单独传送。三、软件设计PartA.选择重传协议1.数据结构1)帧结构定义:typedefstruct{unsignedcharkind;//类型FRAME_DATA、FRAME_ACK、FRAME_NAKseq_nrack;//ack序号seq_nrseq;//帧序号packetdata;//数据域unsignedintpadding;//填充部分保存CRC校验和}frame;各类帧格式如下DATAFrame+=========+========+========+===============+========+KIND(1)SEQ(1)ACK(1)DATA(240~256)CRC(4)+=========+========+========+===============+========+ACKFrame+=========+========+========+KIND(1)ACK(1)CRC(4)+=========+========+========+NAKFrame+=========+========+========+KIND(1)ACK(1)CRC(4)+=========+========+========+2)全局变量定义boolno_nak=true;//nak发送标志staticintphl_ready=0;//物理层就绪标志3)常量定义帧类型:#defineFRAME_DATA1#defineFRAME_ACK2#defineFRAME_NAK3发生事件类型:#defineNETWORK_LAYER_READY0#definePHYSICAL_LAYER_READY1#defineFRAME_RECEIVED2#defineDATA_TIMEOUT3#defineACK_TIMEOUT4其他内容:#defineMAX_SEQ15//序号最大值#defineDATA_TIMER3850//数据帧超时时间#defineACK_TIMER1000//ack超时时间#defineNR_BUFS8//滑动窗口大小4)主函数变量定义seq_nrack_expected;//发送窗口下边界seq_nrnext_frame_to_send;//发送窗口上边界seq_nrframe_expected;//接收窗口下边界seq_nrtoo_far;//接收窗口上边界seq_nrnbuffered;//缓冲区内未上交的帧数目packetin_buf[NR_BUFS];//接收缓冲区packetout_buf[NR_BUFS];//发送缓冲区boolarrived[NR_BUFS];//标志缓冲区是否空闲或该帧是否到达inti;//i计数变量intarg,len=0;//len帧长度arg获得事件相关信息framer;//数据帧intevent;//事件类型2.模块结构1)子函数定义及功能介绍a)staticintbetween(seq_nra,seq_nrb,seq_nrc)功能:判断某一帧是否落在窗口内参数:a、c分别为上下边界,b为需要判断的序号b)staticvoidput_frame(unsignedcharframe,intlen)功能:计算校验和后添加至帧尾,并向物理层发送参数:frame指示需要计算的校验和的帧len表示该帧的长度c)staticvoidsend_data(unsignedcharfk,seq_nrframe_nr,seq_nrframe_expected,packetbuffer[])功能:向物理层发送数据帧参数:fk表示发送帧的类型frameframe_nr表示将要发送的帧的序号frame_expected表示接收窗口的下边界buffer[]表示发送方缓冲区2)子函数之间的调用关系c)调用b)进行帧的发送,其余函数之间无调用关系3.算法流程PartB.gobackn协议1.数据结构1)帧结构定义:typedefstruct{unsignedcharkind;//类型FRAME_DATA、FRAME_ACK、FRAME_NAKseq_nrack;//ack序号seq_nrseq;//帧序号packetdata;//数据域unsignedintpadding;//填充部分保存CRC校验和}frame;各类帧格式如下DATAFrame+=========+========+========+===============+========+KIND(1)SEQ(1)ACK(1)DATA(240~256)CRC(4)+=========+========+========+===============+========+ACKFrame+=========+========+========+KIND(1)ACK(1)CRC(4)+=========+========+========+NAKFrame+=========+========+========+KIND(1)ACK(1)CRC(4)+=========+========+========+2)全局变量定义staticintphl_ready=0;//物理层就绪标志3)常量定义帧类型:#defineFRAME_DATA1#defineFRAME_ACK2#defineFRAME_NAK3发生事件类型:#defineNETWORK_LAYER_READY0#definePHYSICAL_LAYER_READY1#defineFRAME_RECEIVED2#defineDATA_TIMEOUT3#defineACK_TIMEOUT4其他内容:#defineMAX_SEQ7//序号最大值#defineDATA_TIMER2400//数据帧超时时间#defineACK_TIMER500//ack超时时间4)主函数变量定义intevent,arg;//event事件类型arg获得事件相关信息framef;//数据帧intlen=0;//len帧长度inti;//i计数变量seq_nrnext_frame_to_send;//发送窗口上边界seq_nrack_expected;//发送窗口下边界seq_nrframe_expected;//接收窗口值packetbuffer[MAX_SEQ+1];//数据帧缓存区seq_nrnbuffered;//缓冲区内未上交的帧数目2.模块结构1)子函数定义及功能介绍a)staticintbetween(seq_nra,seq_nrb,seq_nrc)功能:判断某一帧是否落在窗口内参数:a、c分别为上下边界,b为需要判断的序号b)staticvoidput_frame(unsignedcharframe,intlen)功能:计算校验和后添加至帧尾,并向物理层发送参数:frame指示需要计算的校验和的帧len表示该帧的长度c)staticvoidsend_data_frame(unsignedcharfk,seq_nrframe_nr,seq_nrframe_expected,packetbuffer[])功能:向物理层发送数据帧参数:fk表示发送帧的类型frameframe_nr表示将要发送的帧的序号frame_expected表示接收窗口的边界buffer[]表示发送方缓冲区d)staticvoidsend_ack_frame(unsignedcharfk,seq_nrframe_nr,seq_nrframe_expected,packetbuffer[])功能:向物理层发送ack帧参数:fk表示发送帧的类型frameframe_nr表示将要发送的帧的序号,此时为0frame_expected表示接收窗口的边界buffer[]表示发送方缓冲区2)子函数之间的调用关系d)与d)调用b)进行帧的发送,其余函数之间无调用关系3.算法流程四、实验结果分析1.描述你所实现的协议软件是否实现了有误码信道环境中无差错传输功能。Gobackn与选择重传协议均可实现有误码信道中的无差错传输功能;协议可以发现校验和错误,从而使发送端重传错误帧并且通过缓存可以实现数据帧顺序上交给网络层。2.程序的健壮性如何,能否可靠的运行较长时间。Gobackn与选择重传协议均可实现较长时间的可靠运行,并且协议效率较为稳定。3.协议参数的选取:1)滑动窗口大小的确定由于分组为固定长度256字节,再加上链路层成帧时,在数据帧前后添加的帧头(1字节的类型说明,1字节的帧序列号,1字节的ACK号)和帧尾(4字节的CRC32校验位),每个数据帧都是263字节,所以发送一帧的时间为:Tf=2638/8000=263ms。线路延迟为Td=270ms,并且采用ack捎带回复技术。最好的情况下,设发送窗口大小为x,则为了获得更高的线路利用率,需求出满足Cr=Ws∗Tf2(Tf+Td)=1的最小的Ws值,即为4.05,向上取整为5。一般说来,窗口越大,同时可以发送的帧越多,效率会越高,但窗口太大可能导致:1.发送的帧太多,物理层排序的队列过长,严重时会出现物理层拥塞现象;2.误码率增加,从而造成很多帧要重传。但计算得到的4也不一定是最佳的值,因为接收方收到一帧后并不一定立即有数据回传,因而要等待一段时间。考虑到ACK定时,窗口大小应为[2(发送时间+线路延迟)+ACK定时]/发送时间。通过设置不同的窗口大小比较其实际效率,发现一次最多发送的数据帧数目设为7时效率比较高,所以确定窗口大小为7。那么在gobackn协议中,MAX_SEQ为7,选择重传协议中,MAX_SEQ为15。2)ACK搭载定时器的确定当发送方一次性发送7帧时,接收方收到第一帧开始ACK计时,直到完整收到最后一帧所需的时间为6Tf+Td=1848ms。若想使发送方及时接收到ACK,那么定时器时间应小于1848ms,但不能过于小,故取中间值1000ms。3)重传定时器的确定从发送一帧到该帧的ACK被捎带回复所需的时间为2(发送时间+线路延迟)。代入数据为1066ms。但考虑到实际情况中,接收方接收到后不一定立刻有数据帧回传,再加上回传数据可能在物理层排队队列中的等待时间,通过尝试不同的取值最终确定为3000ms4.理论分析根据上述分析,在无差错信道中,当发送窗口大于5时,信道的效率可以达到100%。但由于需要携带帧头、帧尾以及校验和信息,所以最大信道利用率约为256263×100%=97.34%。而在差错率为10−5的信道中,100000bit可发送100000263∗8=48个数据包,期中有一个将会出错。假设在限定时间内重传的该帧为正确帧,并且回传的ACK帧不会出错,那么每传送48个数据帧需要传送50个帧的时间,故利用率为48∗25650∗263×100%=93.44%5.实验结果分析性能测试记录表五、探究问题1.CRC校验能力。CRC码的生成多项式通常采用g(x)=(1+x)p(x)的形式,其中p(x)为本原多项式(primitivepolynomial)。CRC的验错能力可以分析如下:1)由于采用(1+x),所以码字多项式作为g(x)的倍数必定有偶数项,因此,所有奇数个错误可以被检验出来。2)双比特错误可以表示为xj+xk=xj(1+x(k−j)),由于p(x)为本原多项式,可以整除p(x)的最小(k-j)的值为n,所以,所有双比特错误可以被检验出来。3)生成多项式具有g(x)=1+g1x+g2x2+…+gn−k−1xn−k−1+xn−k的形式,所以所有个数小于或等于(n-k)的错误都不可能整除g(x),即可被检验出来。2.get_ms()的实现c语言标准库time.h中提供了用一些关于时间操作的函数可以实现get_ms()函数。可以利用的函数有clock()函数。该函数返回程序开始执行后占用的处理器是时间,若无法获得占用时间则返回-1。但由于计时的起点是开始通信之时,故需要一个静态变量start_time来来记录通信起始时间,然后每次调用函数时,获取当前时间current_time,返回current_time-start_time。3.定时器设计start_timer()是对数据帧的定时,该定时时限的时间起点应该是该帧开始发送的时刻,所以要等到物理层排队序列低于50个字节,该帧可以发送才开始计时;而且是针对每个数据帧都有自己的一个定时器,所以参数里要有帧的序列号;在同一帧的一个定时器到时之前重新调用该函数,说明重传这帧,要从头开始计时;start_ack_timer()是对ACK回传的计时,它应该从一帧到达接收方开始,也就是调用该函数的时刻;在没有超时之前,重新调用该函数,一定是其它帧的ACK回传计时,所以不影响原来的计时。4.对等协议实体间的流量控制流量的控制主要通过接收窗口、发送窗口还有确认机制来实现。因为窗口大小有限制,发送方不会一次性发送过多信息导致接收方被信息流所淹没,从而导致信息丢失。虽然这样做可能导致信道的利用率降低,但如果设计合理的窗口大小,依旧可以达到较高的信道利用率。六、实验总结与心得体会1.实际上机时间完成本次实验的两个代码的编写大约6个小时,其中大部分时间在于阅读实验指导书,熟悉物理层和网络层的接口以及与输出相关的函数。之后对于debug以及参数的设计方面花费了两天的时间。2.编程工具在VS环境的安装方面并没有遇到什么问题,但在打开示例工程时发生了项目版本不一致导致编译时无法识别标准库。经查阅资料,需进行如下操作:项目->datalink属性->常规->SDK版本->修改为10.0.16299.0,并且项目->datalink属性->C/C++->常规->调试信息格式->修改为程序数据库(/Zi)3.编程语言对C语言较为熟悉,但对于宏的定义与应用较为陌生,例如:__FILE__,__LINE__,__DATE__,__TIME__等,经过本次实验,对宏有了一些新的认知。4.协议调试相关问题遇到了DOS窗口并不发送数据并且无错误报告、直接退出的情况,经检查过后发现部分变量未进行初始化,导致直接退出,添加初始化后协议正确。5.开发库问题开发库中函数的具体实现未提供,对各个参数的说明也有些模糊,故掌握其用法花了较长时间。6.收获通过这次实验对和滑动窗口协议有了进一步的了解,同时也初步学习到了在现有库的基础上进行程序开发的方法,锻炼了根据运行日志去发现问题、解决问题的能力。',)
提供计算机网络--滑动窗口实验报告会员下载,编号:1700774716,格式为 docx,文件大小为15页,请使用软件:wps,office word 进行编辑,PPT模板中文字,图片,动画效果均可修改,PPT模板下载后图片无水印,更多精品PPT素材下载尽在某某PPT网。所有作品均是用户自行上传分享并拥有版权或使用权,仅供网友学习交流,未经上传用户书面授权,请勿作他用。若您的权利被侵害,请联系963098962@qq.com进行删除处理。