计算机网络-滑动窗口实验报告_第1页
计算机网络-滑动窗口实验报告_第2页
计算机网络-滑动窗口实验报告_第3页
计算机网络-滑动窗口实验报告_第4页
计算机网络-滑动窗口实验报告_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

计算机网络滑动窗口协议实验报告目录实验内容和实验环境描述 (2)实验内容 (2)实验目的(2)实验环境(2)协议设计(3)软件设计(4)PartA选择重传协议数据结构(4)模块结构(6)算法流程(7)PartBgobackn协议数据结构(8)模块结构(9)算法流程(10)实验结果分析(11)探究问题(13)实验总结与心得体会(14)一、实验内容和实验环境描述实验内容利用所学数据链路层原理,自己设计一个滑动窗口协议,在仿真环境下编程实现有噪音信道环境下两站点之间无差错双工通信。信道模型为8000bps全双工卫星信道,信道传播时延270毫秒,信道误码率为10-5实验目的通过该实验,进一步巩固和深刻理解数据链路层误码检测的CRC校验技术,以及滑动窗口的工作机理。滑动窗口机制的两个主要目的:(1)实现有噪音信道环境下的无差错传输;(2)充分利用传输信道的带宽。在程序能够稳定运行并成功实现第一个目标之后,运行程序并检查在信道没有误码和存在误码两种情况下的信道利用率。为实现第二个目标,提高滑动窗口协议信道利用率,需要根据信道实际情况合理地为协议配置工作参数,包括滑动窗口的大小和重传定时器时限以及ACK搭载定时器的时限。实验环境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.选择重传协议数据结构帧结构定义:typedefstruct{ unsignedcharkind; //类型FRAME_DATA、FRAME_ACK、FRAME_NAK seq_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)|+=========+========+========+全局变量定义boolno_nak=true; //nak发送标志staticintphl_ready=0; //物理层就绪标志常量定义帧类型:#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 //滑动窗口大小主函数变量定义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; //事件类型模块结构子函数定义及功能介绍staticintbetween(seq_nra,seq_nrb,seq_nrc)功能:判断某一帧是否落在窗口内参数:a、c分别为上下边界,b为需要判断的序号staticvoidput_frame(unsignedchar*frame,intlen)功能:计算校验和后添加至帧尾,并向物理层发送参数:frame指示需要计算的校验和的帧len表示该帧的长度staticvoidsend_data(unsignedcharfk,seq_nrframe_nr,seq_nrframe_expected,packetbuffer[])功能:向物理层发送数据帧参数:fk表示发送帧的类型frameframe_nr表示将要发送的帧的序号frame_expected表示接收窗口的下边界buffer[]表示发送方缓冲区子函数之间的调用关系c)调用b)进行帧的发送,其余函数之间无调用关系算法流程PartB.gobackn协议数据结构帧结构定义:typedefstruct{ unsignedcharkind; //类型FRAME_DATA、FRAME_ACK、FRAME_NAK seq_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)|+=========+========+========+全局变量定义staticintphl_ready=0; //物理层就绪标志常量定义帧类型:#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超时时间主函数变量定义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; //缓冲区内未上交的帧数目模块结构子函数定义及功能介绍staticintbetween(seq_nra,seq_nrb,seq_nrc)功能:判断某一帧是否落在窗口内参数:a、c分别为上下边界,b为需要判断的序号staticvoidput_frame(unsignedchar*frame,intlen)功能:计算校验和后添加至帧尾,并向物理层发送参数:frame指示需要计算的校验和的帧len表示该帧的长度staticvoidsend_data_frame(unsignedcharfk,seq_nrframe_nr,seq_nrframe_expected,packetbuffer[])功能:向物理层发送数据帧参数:fk表示发送帧的类型frameframe_nr表示将要发送的帧的序号frame_expected表示接收窗口的边界buffer[]表示发送方缓冲区staticvoidsend_ack_frame(unsignedcharfk,seq_nrframe_nr,seq_nrframe_expected,packetbuffer[])功能:向物理层发送ack帧参数:fk表示发送帧的类型frameframe_nr表示将要发送的帧的序号,此时为0frame_expected表示接收窗口的边界buffer[]表示发送方缓冲区子函数之间的调用关系与d)调用b)进行帧的发送,其余函数之间无调用关系算法流程实验结果分析描述你所实现的协议软件是否实现了有误码信道环境中无差错传输功能。Gobackn与选择重传协议均可实现有误码信道中的无差错传输功能;协议可以发现校验和错误,从而使发送端重传错误帧并且通过缓存可以实现数据帧顺序上交给网络层。程序的健壮性如何,能否可靠的运行较长时间。Gobackn与选择重传协议均可实现较长时间的可靠运行,并且协议效率较为稳定。协议参数的选取:滑动窗口大小的确定由于分组为固定长度256字节,再加上链路层成帧时,在数据帧前后添加的帧头(1字节的类型说明,1字节的帧序列号,1字节的ACK号)和帧尾(4字节的CRC32校验位),每个数据帧都是263字节,所以发送一帧的时间为:Tf=263*8/8000=263ms。线路延迟为Td=270ms,并且采用ack捎带回复技术。最好的情况下,设发送窗口大小为x,则为了获得更高的线路利用率,需求出满足Cr=Ws*Tf2(Tf+Td)=1的最小的Ws值,即为4 一般说来,窗口越大,同时可以发送的帧越多,效率会越高,但窗口太大可能导致:1.发送的帧太多,物理层排序的队列过长,严重时会出现物理层拥塞现象;2.误码率增加,从而造成很多帧要重传。但计算得到的4也不一定是最佳的值,因为接收方收到一帧后并不一定立即有数据回传,因而要等待一段时间。考虑到ACK定时,窗口大小应为[2*(发送时间+线路延迟)+ACK定时]/发送时间。通过设置不同的窗口大小比较其实际效率,发现一次最多发送的数据帧数目设为7时效率比较高,所以确定窗口大小为7。那么在gobackn协议中,MAX_SEQ为7,选择重传协议中,MAX_SEQ为15。ACK搭载定时器的确定当发送方一次性发送7帧时,接收方收到第一帧开始ACK计时,直到完整收到最后一帧所需的时间为6Tf+Td=1848ms。若想使发送方及时接收到ACK,那么定时器时间应小于1848ms,但不能过于小,故取中间值1000ms。重传定时器的确定从发送一帧到该帧的ACK被捎带回复所需的时间为2*(发送时间+线路延迟)。代入数据为1066ms。但考虑到实际情况中,接收方接收到后不一定立刻有数据帧回传,再加上回传数据可能在物理层排队队列中的等待时间,通过尝试不同的取值最终确定为3000ms理论分析根据上述分析,在无差错信道中,当发送窗口大于5时,信道的效率可以达到100%。但由于需要携带帧头、帧尾以及校验和信息,所以最大信道利用率约为256263而在差错率为10-5的信道中,100000bit可发送100000263实验结果分析性能测试记录表探究问题CRC校验能力。CRC码的生成多项式通常采用g(x)=(1+x)p(x)的形式,其中p(x)为本原多项式(primitivepolynomial)。CRC的验错能力可以分析如下:1)由于采用(1+x),所以码字多项式作为g(x)的倍数必定有偶数项,因此,所有奇数个错误可以被检验出来。2)双比特错误可以表示为xj+xk=xj(1+x3)生成多项式具有gx=1+g1x+get_ms()的实现c语言标准库time.h中提供了用一些关于时间操作的函数可以实现get_ms()函数。可以利用的函数有clock()函数。该函数返回程序开始执行后占用的处理器是时间,若无法获得占用时间则返回-1。但由于计时的起点是开始通信之时,故需要一个静态变量start_time来来记录通信起始时间,然后每次调用函数时,获取当前时间current_time,返回current_time-start_time。定时器设计start_timer()是对数据帧的定时,该定时时限的时间起点应该是该帧开始发送的时刻,所以要等到物理层排队序列低于50个字节,该帧可以发送才开始计时;而且是针对每个数据帧都有自己的一个定时器,所以参数里要有帧的序列号;在同一帧的一个定

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论