滑动窗口实验报告(优推内容)
基于滑动窗口法的智能开关动作时间动态预测
基于滑动窗口法的智能开关动作时间动态预测郑贵林;陈曦【摘要】电气设备投切过程中开关触头间会拉弧,导致触点碳化,也给电网带来一定冲击并影响电气负载的使用寿命.在交流过零点实现电气开关的合闸与分断,是克服传统电气开关存在合闸时对负载的电压冲击,分断时接触器被电弧烧灼的最佳手段,其技术的关键是保证电气开关过零点动作时间的精准性.该文在充分研究交流过零点检测和开关动作规律的基础上,介绍了电气开关交流过零点智能开关技术,提出基于滑动窗口法的开关精密动作时间动态检测算法.实验证明,该方法能可靠保证开关精准过零点合闸和分断,是智能机械开关交流过零点动态检测的理想解决方法.【期刊名称】《自动化与仪表》【年(卷),期】2014(029)008【总页数】4页(P61-64)【关键词】电弧;接触器;交流过零点;滑动窗口法;智能开关【作者】郑贵林;陈曦【作者单位】武汉大学动力与机械学院,武汉430072;武汉大学动力与机械学院,武汉430072【正文语种】中文【中图分类】TP23传统的电气开关在投切的过程中,由于电压直接加载在负载上产生电压冲击。
在负载上产生冲击性过渡过程,对负载和电网产生不良影响。
在切断过程中,开关也会产生电弧,给电网带来冲击,使得电网电压不稳定。
电弧会给电网中的电气设备造成影响,使设备的正常寿命降低。
此外,由于电弧的产生,传统开关触头会产生高压火花,进而产生大电流以及高温,使得开关触头融化变形,严重情形下会导致触头碳化,甚至开关触头烧灼到粘合状态,无法断开,后果严重。
传统的灭弧措施,不论是通过加强去游离,例如采用真空灭弧、油灭弧等方法;还是提高弧隙介质强度,例如采用特殊的金属材料作为灭弧触头[1-2],这类措施产生了一定的效果。
但是其成本居高不下,主要用于电厂、变电站等高压昂贵设备中,无法普及到一般低压电气设备中。
因此,本文根据电弧产生的原理,提出一种交流电压过零点投入,交流电流过零点开断的无电弧方法。
[VIP专享]滑动窗口协议实验SWP
-2-
2006年经省农业厅,南平市政府19批41准年,毛南泽平东农在校《与改建造阳我农们业的工学程习学》校一合文署中办,学把,这强句强原联指合治,学实态行度一的套话班古子为,今两用个,校从区哲的学管的理高体度制做,了从新而的使分学析校,的深办化学了规对模实,事办求学是实的力理都解有,长并足为的其发提历展出史,了的逐一经步个验发经教展典训成的告为注诉有释我着,们广指:泛出什发:么展“时空‘候间实坚和事持良’实好就事发是求展客是前观,景存党的在和闽着国北的家唯一的一切事一事业所物就集,会文第‘顺理一是利、个’发农问就展工题是;商,客什实贸实观么事为事事时求一求物候是体是的背是,地内离一面看部实个向待联事老全我系求话国们,是题招的即,,生学规党实和校律和事就。性国求业职,家是的业‘的一,教求事一语办育’业、,学明就就实出规显是会事自模不我遭求东最同们遇是汉大于去挫地班、高研折看固师等究。待所资教”同学著力育。时校《量和毛,、汉最中泽只学书雄学东有生河厚教对坚和间、育中持学献办,国实校王学不社事当传质同会求前》量点、是工。和就中,作书办在国党以中学于革和及称声职命人存赞誉业的民在刘高教分的的德的育析事问“综所无业题修合有不才学性工贯能好国作穿顺古家和着利,级任实前实重何事进事点事求,求中情是一是专都的旦。和必精背”省须神离其级靠。实意文自因事思明己而求是学完他是根校成才就据。。能必实而找然事这到遭求些中到索成国挫真绩革折理的命甚。取的至得规倒是律退得,。益制实于定事学出求校适是党合是政中马领国克导国思的情主坚的义强路世领线界导方观,针的得政根益策本于,要全指求体导,党中是员国马干革克部命思和走主教向义职胜的工利精的,髓辛实。勤事工求作是和是共中同国努革力命的实结践果经,验但的最高主度要总的结一和条概是括得,益中于国学革校命始和终建坚设持的实经事验求表是明的,原实则事,求可是以是说胜,利坚之持本实,事只求要是坚原持则实是事我求们是学,校我各们项党事就业会健永康远、立稳于定不和败谐之发地展。的重要保证。
数据链路层滑动窗口协议的设计与实现
数据链路层滑动窗口协议的设计与实现实验报告一、实验任务及内容利用所学数据链路层原理,设计一个滑动窗口协议并在仿真环境下编程实现有噪音信道环境下的可靠的双工通信。
信道模型为8000bps 全双工卫星信道,信道传播时延270 毫秒,信道误码率为10-5,信道提供字节流传输服务,网络层分组长度在240~256字节范围。
(1)实现有噪音信道环境下的无差错传输。
(2)运行程序并检查在信道没有误码和存在误码两种情况下的信道利用率。
(3)提高滑动窗口协议信道利用率,根据信道实际情况合理地为协议配置工作参数,包括滑动窗口的大小和重传定时器时限以及ACK 搭载定时器的时限。
实验环境Windows 7环境PC机,Microsoft Visual C++ 6.0 集成化开发环境二、协议设计协议的分层结构及层服务:包括物理层,数据链路层和网络层三层。
该实验主要设计数据链路层协议,为实现有噪声环境下高信道利用率传输,我们采用回退n帧(go back n)技术的协议。
发送方窗口大小为31;通过捎带确认来完成可靠的数据通信;出现信道误码导致收帧出错时,接受方丢弃所有后续帧,待定时器超时后发送方重发。
该层提供服务:从网络层接受要发送的数据包,将之分拆成数据帧;按一定的成帧方案完成分帧,加校验码,加ack等操作;进行适当的流量判断和拥塞控制;启动定时器将之传递给物理层。
数据帧经信道传送给接受方,接受方数据链路层执行与成帧相逆的操作;处理ack信息,终止定时器(或启动ack定时器,ack成帧传送);判断是否为欲接受数据,数据是否出错,提交给网络层。
退回N步工作原理示意图:实验所形成帧(成帧方案):DATA Framen+=========+========+========+===============+========+| KIND(1) | ACK(1) | SEQ(1) | DATA(240~256) | CRC(4) |+=========+========+========+===============+========+ACK Frame+=========+========+========+| KIND(1) | ACK(1) | CRC(4) |+=========+========+========+NAK Frame+=========+========+========+| KIND(1) | ACK(1) | CRC(4) |+=========+========+========+CRC校验和的多项式定义:本次实验采用的CRC校验方案为CRC-32,与IEEE802.3 以太网校验和生成多项式相同。
计算机网络--滑动窗口实验报告
计算机网络--滑动窗口实验报告计算机网络滑动窗口协议实验报告目录一、实验内容和实验环境描述(2)1.实验内容(2)2.实验目的(2)3.实验环境(2)二、协议设计(3)三、软件设计(4)Part A 选择重传协议1.数据结构(4)2.模块结构(6)3.算法流程(7)Part B gobackn协议 1.数据结构(8)2.模块结构(9)3.算法流程(10)四、实验结果分析(11)五、探究问题(13)六、实验总结与心得体会(14)一、实验内容和实验环境描述1.实验内容利用所学数据链路层原理,自己设计一个滑动窗口协议,在仿真环境下编程实现有噪音信道环境下两站点之间无差错双工通信。
信道模型为8000bps全双工卫星信道,信道传播时延270毫秒,信道误码率为10?5,信道提供字节流传输服务,网络层分组长度固定为 256 字节。
2.实验目的通过该实验,进一步巩固和深刻理解数据链路层误码检测的CRC校验技术,以及滑动窗口的工作机理。
滑动窗口机制的两个主要目的:(1)实现有噪音信道环境下的无差错传输;(2)充分利用传输信道的带宽。
在程序能够稳定运行并成功实现第一个目标之后,运行程序并检查在信道没有误码和存在误码两种情况下的信道利用率。
为实现第二个目标,提高滑动窗口协议信道利用率,需要根据信道实际情况合理地为协议配置工作参数,包括滑动窗口的大小和重传定时器时限以及 ACK 搭载定时器的时限。
3.实验环境Windows10环境PC机Microsoft Visual Studio 2017集成开发环境二、协议设计本次试验主要设计数据链路层,实验中分别设计了gobackn协议与选择重传协议。
主要涉及到的层次结构是物理层、数据链路层、网络层。
物理层:为数据链路层提供的服务为8000bps,270ms传播延时,10?5误码率的字节流传输通道。
数据链路层利用接口函数send_frame()和 recv_frame()从物理层发送和接收一帧。
滑动窗口协议的作用
滑动窗口协议的作用篇一:滑动窗口协议模拟实验8滑动窗口协议模拟一、实验目的1. 模拟实现滑窗协议在数据链路层上的数据传输过程,加深对滑窗协议的理解2. 掌握滑动窗口协议基本原理与基本算法;二、要求:1.掌握滑动窗口协议的概念、原理与基本算法;2.实现“选择性重传策略或连续自动重传策略(后退N帧)”的滑动窗口协议模拟程序;3.了解传输层和链路层滑动窗口协议的区别与联系及TCP中滑动窗口协议的实现原理。
三、实验原理滑窗协议工作原理由于停等协议要为每一个帧进行确认后才继续发送下一个帧,大大降低了信道利用率,因此又提出来回退N帧的滑窗协议。
回退N 帧协议中,发送方在发送完一个数据帧后,不停下来等待应答帧,而是连续发送若干个数据帧,即使在连续发送过程中收到了接收方发来的应答帧,也可以继续发送。
由于减少了等待时间,必然提高通信的吞吐量和信道利用率。
回退N帧的滑窗协议(GO-DACK-N)基本原理是,当接收方检测出错的信息帧后,丢弃出错帧后的所有信息帧,而不管这些帧是否正确。
待发送方收到对出错帧的否定应答(NAK)时,将重发从出错后的所有数据帧;若应答帧出错,则超时重发。
因此,发送方在每发完一个数据帧时都要设置超时计时器。
只要在所设置的计时器超时而仍未收到确认帧,就要重发相应的数据帧,若等不到1号帧的确认应答而重发1号数据帧时,虽然发送方已经发送完3号帧,但仍必须将1号帧及其以后的各帧全部进行重传。
因此,后退N 帧协议一方面因连续发送数据帧而提高了效率,但另一方面,在重传时又必须把原来已正确传送过的数据帧进行重传,这种做法又使传送率降低。
四、实验要求1.Windows XP环境下运行,程序在1~2台PC上运行。
2.具体实现的协议可以采用回退N帧技术或者选择性重发技术的协议。
3.采用.NET平台中的C#、C++或其他编程语言实现。
五、实验内容模拟滑窗协议的实现过程为;(1) 程序客户端线程发送连接请求。
(2) 服务器连接并返回连接信息。
滑动窗口协议实验报告
滑动窗口协议实验报告1. 引言滑动窗口协议是计算机网络中用于实现可靠数据传输的一种协议。
其核心思想是使用一个窗口来管理发送方和接收方之间的数据传输进程,通过滑动窗口的机制来实现流量控制和错误恢复。
本实验旨在通过编写滑动窗口协议的模拟程序,深入理解该协议的工作原理及其在数据传输中的应用。
2. 实验环境本次实验采用C++语言进行编程,并在Windows操作系统下进行测试。
3. 实验过程3.1 窗口大小的确定首先,我们需要确定滑动窗口的大小。
在实际应用中,窗口大小需要根据网络状况来调整,以保证传输效率。
本次实验中,我们设置窗口大小为5。
3.2 发送方逻辑实现发送方负责将数据分割为若干个数据包,并发送给接收方。
发送方需要维护发送窗口的起始位置和结束位置,在每次发送数据包后,将发送窗口向前滑动一格。
如果接收窗口收到接收方的确认信息,发送方将收到确认的数据包从发送窗口中移除,并将窗口向前滑动一格。
3.3 接收方逻辑实现接收方需要维护接收窗口的起始位置和结束位置。
当接收窗口收到数据包时,接收方首先检查数据包的顺序是否正确,如果顺序正确,则将数据包保存并发送确认信息给发送方。
接收方随后将接收窗口向前滑动一格,等待下一个数据包的到来。
3.4 测试与验证在实验过程中,我们通过模拟网络传输的延迟、丢包等情况来验证滑动窗口协议的可靠性。
通过调整滑动窗口的大小以及模拟网络传输的不同情况,我们可以观察到滑动窗口协议在不同场景下的性能表现。
4. 实验结果分析通过实验,我们观察到滑动窗口协议在正常网络传输情况下,能够实现高效的数据传输。
当网络传输出现延迟或丢包时,滑动窗口协议能够通过重传机制和流量控制策略,确保数据的可靠传输。
在窗口大小适当的情况下,滑动窗口协议能够最大化利用网络带宽,提高数据传输的效率。
5. 实验总结本次实验通过编写模拟程序,深入理解了滑动窗口协议的工作原理及其在数据传输中的应用。
滑动窗口协议通过窗口的滑动机制,实现了对数据传输过程的控制和管理,从而保证了数据的可靠性和传输效率。
实验一 滑动窗口协议实验
实验一滑动窗口协议实验◆实验目的:在NetRiver实验系统中,用C语言实现滑动窗口协议中的1比特滑动窗口协议和后退N帧协议,理解滑动窗口协议◆实验原理和说明:(1).窗口机制滑动窗口协议的基本原理就是在任意时刻,发送方都维持了一个连续的允许发送的帧的序号,称为发送窗口;同时,接收方也维持了一个连续的允许接收的帧的序号,称为接收窗口。
发送窗口和接收窗口的序号的上下界不一定要一样,甚至大小也可以不同。
不同的滑动窗口协议窗口大小一般不同。
发送方窗口内的序列号代表了那些已经被发送,但是还没有被确认的帧,或者是那些可以被发送的帧。
下面举一个例子(假设发送窗口尺寸为2,接收窗口尺寸为1):分析:①初始态,发送方没有帧发出,发送窗口前后沿相重合。
接收方0号窗口打开,等待接收0号帧;②发送方打开0号窗口,表示已发出0帧但尚确认返回信息。
此时接收窗口状态不变;③发送方打开0、1号窗口,表示0、1号帧均在等待确认之列。
至此,发送方打开的窗口数已达规定限度,在未收到新的确认返回帧之前,发送方将暂停发送新的数据帧。
接收窗口此时状态仍未变;④接收方已收到0号帧,0号窗口关闭,1号窗口打开,表示准备接收1号帧。
此时发送窗口状态不变;⑤发送方收到接收方发来的0号帧确认返回信息,关闭0号窗口,表示从重发表中删除0号帧。
此时接收窗口状态仍不变;⑥发送方继续发送2号帧,2号窗口打开,表示2号帧也纳入待确认之列。
至此,发送方打开的窗口又已达规定限度,在未收到新的确认返回帧之前,发送方将暂停发送新的数据帧,此时接收窗口状态仍不变;⑦接收方已收到1号帧,1号窗口关闭,2号窗口打开,表示准备接收2号帧。
此时发送窗口状态不变;⑧发送方收到接收方发来的1号帧收毕的确认信息,关闭1号窗口,表示从重发表中删除1号帧。
此时接收窗口状态仍不变。
若从滑动窗口的观点来统一看待1比特滑动窗口、后退n及选择重传三种协议,它们的差别仅在于各自窗口尺寸的大小不同而已。
滑动窗口协议
实验目的
实现滑动窗口协议中的1bit滑动窗口协议,提供系统调用接口函 数
实验原理
滑动窗口协议(Sliding Window Protocol),属于TCP协议 的一种应用,用于网络数据传输时的流量控制,以避免拥塞 的发生。该协议允许发送方在停止并等待确认前发送多个数 据分组。由于发送方不必每发一个分组就停下来等待确认, 因此该协议可以加速数据的传输,提高网络吞吐量。
帧丢失测试
帧丢失测试—发送端
帧丢失测试—接收端
发送及接收过程
同帧校验和错误类似,帧丢失错误同样会引发接收端回送 nak否定应答消息。不同的是,nak否定应答帧是在丢失帧 的下一帧收到后发出的。如图5所示,由于传输过程中2号帧 丢失,接收端在收到1号帧后,接下来收到了3号帧,这时, 接收端知道由于某种原因2号帧丢失了,于是立即发送了2号 帧的否定应答帧。在发送端收到该nak2帧后,也马上重传了 该帧,nak机制同样加快了对丢失帧的重传操作。
程序没有模拟信道发生随机错误的情况,如果需要读者可以使用伪随机 函数自己添加这部分模拟代码。
帧校验错测试
在做新的测试前,首先将发送端和接收端进行重置,即两端 都先停止再重新开始,然后再做后续测试(如果需要,停止 后可以修改相关参数)。
帧校验错测试—发送端
帧校验错测试—接收端
发送及接收过程
通过手工设置2号帧的校验和错误来模拟信道传输中的误码 情况。可以看到接收方在收到2号错误帧后马上向发送方回 送了一个nak2的否定应答帧,发送方在收到nak2后也立即 重传了该帧,因此nak机制加速了错误帧的重传过程(否则 如果接收方直接丢弃的话,就只能等到发送方2号帧的重发 定时器超时后进行重传)
发送程序界面,同样有4个功能区
滑动窗口协议
实验四滑动窗口协议1、实验目的(1)掌握滑动窗口协议的概念、原理与基本算法。
(2)理解3种典型的数据链路层滑动窗口协议:l位滑动窗口协议、使用退后n帧的滑动窗口协议与使用选择性重传的滑动窗口协议。
(3)了解传输层与数据链路层滑动窗口协议的区别与联系,了解TCP滑动窗口协议的实现原理。
2、实验要求编程实现使用选择性重传策略的滑动窗口协议模拟程序:(1)所有功能应可视,具有简单的界面。
(2)由一台PC向另一台PC发送数据包,界面中应动态显示数据帧的发送和接收情况,以表明协议模拟程序的正确运作过程。
(3)当发送方速度过快或帧丢失时,接收方应发送消息,要求暂停或者重传。
接收方应按序向网络层提交接收到的帧。
(4)发送方应可设置发送速度、滑动窗口数目、停止等待等的超时时间间隔以及发送类型(用于模拟信道错误如正常发送,帧校验错,帧丢失)等参数。
3、实验环境微机一台、Visual Studio 6.0集成开发环境。
4、实验相关知识滑动窗口协议的流量控制:发送方窗口内的序列号代表已经发送但尚未确认的帧,一旦窗口达到最大值,发送方的数据链路层必须强行关闭网络层直到有一帧缓冲区可用为止。
接收方数据链路层的窗口对应于允许接收的帧。
任何落在接收窗口之外的帧都不加说明地丢弃。
滑动窗口协议的差错控制:使用后退n帧技术:接收端丢弃出错帧后所有的帧,而不管这些帧是正确的还是出错的;对应于接收窗口的尺寸为1的情况;如果信道错误率高,将会浪费大量的带宽。
选择性重传策略:信道出错时,接收方将存储所有跟在坏帧之后的正确帧,并只要求发送方重传出错的帧;对应于接收窗口大于1的情况。
两种差错控制策略的收发过程比较:5 系统实施5.1程序的主要流程图5.2主要过程关于发送端网络层数据流量的模拟:为了使协议模拟尽量简化,事先做两个假设:假设1:发送方的网络层总有数据需要发送;假设2:接收方没有反向流量,因此不能捎带确认,每次等待辅助定时器超时之后发送一个单独的确认帧(ACK或NAK)。
滑动窗口实验报告
实验目的:了解滑动窗口技术的原理和应用,通过实验验证滑动窗口在信号处理、图像处理和文本分析等领域的有效性。
实验环境:操作系统:Windows 10编程语言:Python 3.8库:NumPy、Matplotlib、Pandas实验内容:1. 滑动窗口在信号处理中的应用2. 滑动窗口在图像处理中的应用3. 滑动窗口在文本分析中的应用实验一:滑动窗口在信号处理中的应用1. 实验目的通过实验验证滑动窗口在信号处理中的有效性,对信号进行平滑处理,减少噪声干扰。
2. 实验步骤(1)导入NumPy库,生成一个包含噪声的信号;(2)定义滑动窗口函数,实现信号的平滑处理;(3)绘制原始信号和经过滑动窗口处理后的信号;(4)分析实验结果。
3. 实验代码```pythonimport numpy as npimport matplotlib.pyplot as plt# 生成信号signal = np.sin(np.linspace(0, 10, 100)) + np.random.normal(0, 0.5, 100)# 定义滑动窗口函数def moving_average(data, window_size):weights = np.ones(window_size) / window_sizereturn np.convolve(data, weights, mode='valid')# 处理信号window_size = 5smoothed_signal = moving_average(signal, window_size)# 绘制信号plt.figure(figsize=(10, 5))plt.plot(signal, label='Original Signal')plt.plot(np.arange(window_size // 2, len(signal) - window_size // 2), smoothed_signal, label='Smoothed Signal')plt.legend()plt.show()```4. 实验结果实验结果表明,经过滑动窗口处理后的信号相对于原始信号更加平滑,噪声干扰得到了有效抑制。
实验一 滑动窗口协议实验
实验一滑动窗口协议实验◆实验目的:在NetRiver实验系统中,用C语言实现滑动窗口协议中的1比特滑动窗口协议和后退N帧协议,理解滑动窗口协议◆实验原理和说明:(1).窗口机制滑动窗口协议的基本原理就是在任意时刻,发送方都维持了一个连续的允许发送的帧的序号,称为发送窗口;同时,接收方也维持了一个连续的允许接收的帧的序号,称为接收窗口。
发送窗口和接收窗口的序号的上下界不一定要一样,甚至大小也可以不同。
不同的滑动窗口协议窗口大小一般不同。
发送方窗口内的序列号代表了那些已经被发送,但是还没有被确认的帧,或者是那些可以被发送的帧。
下面举一个例子(假设发送窗口尺寸为2,接收窗口尺寸为1):分析:①初始态,发送方没有帧发出,发送窗口前后沿相重合。
接收方0号窗口打开,等待接收0号帧;②发送方打开0号窗口,表示已发出0帧但尚确认返回信息。
此时接收窗口状态不变;③发送方打开0、1号窗口,表示0、1号帧均在等待确认之列。
至此,发送方打开的窗口数已达规定限度,在未收到新的确认返回帧之前,发送方将暂停发送新的数据帧。
接收窗口此时状态仍未变;④接收方已收到0号帧,0号窗口关闭,1号窗口打开,表示准备接收1号帧。
此时发送窗口状态不变;⑤发送方收到接收方发来的0号帧确认返回信息,关闭0号窗口,表示从重发表中删除0号帧。
此时接收窗口状态仍不变;⑥发送方继续发送2号帧,2号窗口打开,表示2号帧也纳入待确认之列。
至此,发送方打开的窗口又已达规定限度,在未收到新的确认返回帧之前,发送方将暂停发送新的数据帧,此时接收窗口状态仍不变;⑦接收方已收到1号帧,1号窗口关闭,2号窗口打开,表示准备接收2号帧。
此时发送窗口状态不变;⑧发送方收到接收方发来的1号帧收毕的确认信息,关闭1号窗口,表示从重发表中删除1号帧。
此时接收窗口状态仍不变。
若从滑动窗口的观点来统一看待1比特滑动窗口、后退n及选择重传三种协议,它们的差别仅在于各自窗口尺寸的大小不同而已。
基于滑动窗口的行人检测技术研究的开题报告
基于滑动窗口的行人检测技术研究的开题报告一、研究背景随着计算机视觉技术的发展和深度学习技术的应用,行人检测技术已经越来越广泛地应用于视频监控、交通管理、安防检测等领域。
目前,行人检测技术主要分为基于传统特征的方法和基于深度学习的方法。
基于传统特征的方法需要手动设计特征,无法处理复杂场景的变化,例如遮挡、尺度变化、光照变化等。
而基于深度学习的方法则可以自动学习特征,更适用于处理复杂场景。
但是深度学习方法需要大量的数据进行训练,因此需要解决数据集缺乏的问题。
基于滑动窗口的行人检测技术是一种基于传统特征的方法。
它将图像分割成多个重叠的窗口,然后通过分类器对每个窗口进行分类,最终将所有的分类结果整合起来得到检测结果。
该方法已经得到广泛应用,但是在处理大尺度图像时,计算量和计算时间的消耗较大,因此需要对算法进行改进和优化。
二、研究目标本研究旨在利用滑动窗口的行人检测技术,实现高效、准确的行人检测,并针对算法中存在的问题进行改进和优化,提高算法的检测精度和效率,在实际应用中具有较高的稳定性和可靠性。
三、研究内容1. 分析滑动窗口算法的原理,探究其检测精度和效率的影响因素。
2. 结合深度学习技术,优化分类器设计,提高行人检测的精度。
3. 研究滑动窗口算法在处理大尺度图像时的问题,并提出相应的优化方法。
4. 利用公开数据集进行实验验证,评估算法的检测精度和效率。
四、研究意义1. 对于行人检测技术进行深入研究和探索,掌握行人检测技术的基本原理和应用。
2. 结合深度学习技术,提高行人检测的准确率和鲁棒性,为实际应用提供更好的支持。
3. 优化滑动窗口算法设计,提高算法处理大尺度图像时的效率和精度。
4. 为视频监控、交通管理、安防检测等领域提供更加智能化、高效化的行人检测解决方案。
五、研究方法1. 阅读相关论文,了解滑动窗口行人检测技术的基本原理和应用领域。
2. 设计滑动窗口行人检测算法,并探究算法中的关键问题和影响因素。
滑动窗口协议实验报告
数据链路层滑动窗口协议实验报告1实验任务对实际系统中的协议分层和协议软件的设计与实现有基本的认识。
2实验内容利用所学数据链路层原理,自己设计一个滑动窗口协议并在仿真环境下编程实现有噪音信道环境下的可靠的双工通信。
信道模型为8000bps 全双工卫星信道,信道传播时延270 毫秒,信道误码率为10-5,信道提供字节流传输服务,网络层分组长度在240~256字节范围。
通过该实验,进一步巩固和深刻理解数据链路层的字节填充方式的成帧技术,误码检测的CRC 校验技术,以及滑动窗口的工作机理。
滑动窗口机制的两个主要目标:(1) 实现有噪音信道环境下的无差错传输; (2)充分利用传输信道的带宽。
在程序能够稳定运行并成功实现第一个目标之后,运行程序并检查在信道没有误码和存在误码两种情况下的信道利用率。
为实现第二个目标,提高滑动窗口协议信道利用率,需要根据信道实际情况合理地为协议配置工作参数,包括滑动窗口的大小和重传定时器时限以及ACK 搭载定时器的时限。
这些参数的设计,需要充分理解滑动窗口协议的工作原理并利用所学的理论知识,经过认真的推算,计算出最优取值,并通过程序的运行进行验证。
对实际系统中的协议分层和协议软件的设计与实现有基本的认识。
3编程环境利用仿真环境下所提供的物理层服务和定时器机制为网络层提供服务。
8.1程序的总体结构设数据链路层通信的两个站点分别为站点A和站点B,仿真环境利用WindowsXP环境下的TCP协议和Socket客户端/服务器机制构建两个站点之间的通信,其中,站点A为服务器端,站点B为客户端。
编译、链接之后最终生成的可执行程序(.exe文件)为字符界面命令行程序(不是图形界面程序)。
可执行程序文件仅有一份,设为datalink.exe,在WindowsXP 的两个DOS 窗口中使用不同的命令行参数启动两个进程,分别仿真站点A和站点B。
8.2实验环境所提供的文件和编译运行方法实验环境使用Visual C++ 6.0系统datalink.dsw,datalink.dsp:Microsoft VC6.0的工程文件,包括Win32 Debug和Win32 Release两种配置。
实验三:滑动窗口协议的实现
实验三滑动窗口协议的实现实验目的理解滑动窗口协议对连续ARQ协议的改进,及其在流量控制中的意义实验内容在Visual C++环境中,通信的双方在应用中根据滑动窗口协议的思想进行流量控制。
需要处理正常数据与应答、出错数据、丢失数据、丢失应答等各种情况,并进行统计。
要求提供图形化输出,具体可参考实验要求中的详细说明。
实验要求1.任何一个节点都具备发送和接收的功能,主操作界面如图1。
图1 主界面发送窗口的大小在发送参数中设置,发送时,界面上的发送窗口动态变化,对应当前已发送的数据,图中,黄色表示不在当前发送窗口中的序号;绿色表示在发送窗口中已经发送了的数据序号;蓝色表示在发送窗口中,还没有发送的数据序号。
接收窗口也需要动态表示当前的可接收序号(蓝色表示)。
2.发送文件1)设置发送参数在中输入文件的接收方IP地址,点击图1的“发送参数设置”按钮,出现图2的界面,对停等协议的发送方参数进行设定。
图2 设置发送参数2)选择发送文件从图1的点击“浏览”,出现图3的弹出窗口,可从本机选择需要发送的文件,要求文件大于1M字节。
图3 选择发送的文件3)发送文件选定文件后点击“发送”按钮,发送数据的信息在图1 显示,包括所有分组的传输信息。
4)根据确认状态,完成下一步操作ACK:正确接收,已收到确认-------发送下一个数据分组未ACK:未收到确认信息------在到达设置的超时时间后仍未收到确认,则重新发送原分组NAK:收到否定确认-----直接重传原来的分组5)发送完成,显示统计信息统计信息可包括:文件总长度,发送的分组数目,收到ACK、NAK等的次数,超时重发次数、错误重发次数等相关信息。
6)保存发送过程明细记录点击图1左下方的按钮,调用类似图3的界面,将发送的明细信息保存到文件中,以便查看。
3.接收文件当节点作为信息的接收方,首先可以选择两种应答方式:自动应答和手动应答。
1)在收到某个用户的第一个分组时,给出如图4的接收提示。
滑动窗口协议实验报告
滑动窗口协议实验报告篇一:实验二滑动窗口协议实验报告2<滑动窗口协议的模拟>项目设计报告作者:完成日期:签收人:签收日期:1 需求分析实验目的:加深对滑动窗口协议的理解实验任务:实现对于滑动窗口协议的模拟实验环境:PC机操作系统:Windows XP开发环境:Microsoft Visual C++ ,可以使用MFC类库问题重述界面要求:项目要求的所有功能应可视,要有简单的界面。
由一台PC(或线程)向另一台PC (或线程)发送数据包时,界面应显示出双方帧个数的变化,帧序号,发送和接受速度,暂停或重传提示等,界面中必须动态显示数据帧的发送和接受情况,包括在相应的窗口详细显示相应的ACK和其他收发数据帧后发出的消息,以表明模拟协议的正确运作过程。
在各种情况下,接受方和发送方窗口应实时显示帧的发送和接受情况,包括序号,时间戳,内容等。
以及窗口的填充和清空情况。
网络接口要求:两台机器或是一台机器中两个独立的线程模拟发送方与接受方,接收数据的端口初始应为监听状态。
发送方向接受方发起连接,成功后开始发送数据。
接受方要求:接受方应由固定大小的滑动窗口,并对收到信息缓存。
当发送方速度过快或帧丢失(超时),接受方应发送消息,要求暂停或是重传(停---等协议)。
接受方要求按序向网络层提交收到的帧。
发送方要求:发送方发送速度可以调节,并可以暂停或是重发。
发送方重传时可仅重传需要的帧。
可指定滑动窗口数目和要发送的帧的总数,停等的超时时间间隔以及发送类型(正常发送,错序发送,以及缺帧,丢帧的现象),发送速率等参数。
2 概要设计原理概述发送方和接受方都维持了一个窗口,窗口内部包含了那些可以接受的序列号。
发送方的窗口大小从0开始,以后可以增大到某一个预设的最大值。
由于发送方可能在将来的某个时刻重传未被确认的帧,所以它必须把已经送出去的帧保留一段时间,直到他知道接受方已经接受了这些帧。
当第n帧的确认到来时,第n-1,第n-2等也都被自动地确认了。
(完整word版)滑动窗口协议报告 (2)
滑动窗口协议设计报告滑动窗口协议设计1、引言随着网络的不断壮大,用户数量、信息量的需求不断增加,网络负荷越来越重。
此时,我们迫切需要一种机制来控制网络的流量,减少网络拥堵的几率,提高传输的效率。
因此,一种名为滑动窗口的协议应运而生。
滑动窗口协议,是TCP使用的一种流量控制方法。
该协议允许发送方在停止并等待确认前可以连续发送多个分组。
由于发送方不必每发一个分组就停下来等待确认,因此该协议可以加速数据的传输。
经测试证明,该协议还能有效地解决TCP的高协议处理开销和UDP的低可靠性之间的矛盾。
2、实验目的基本原理2.1 窗口机制滑动窗口协议的基本原理就是在任意时刻,发送方都维持了一个连续的允许发送的帧的序号,称为发送窗口;同时,接收方也维持了一个连续的允许接收的帧的序号,称为接收窗口。
发送窗口和接收窗口的序号的上下界不一定要一样,甚至大小也可以不同。
不同的滑动窗口协议窗口大小一般不同。
发送方窗口内的序号代表了那些已经被发送,但是还没有被确认的帧,或者是那些可以被发送的帧。
接受方为其窗口内的每一个序号保留了一个缓冲区。
与每个缓冲区相关联的还有一位,用来指明该缓冲区是满的还是空的。
3、实验原理TCP滑动窗口用来暂存两台计算机问要传送的数据分组。
每台运行TCP协议的计算机有两个滑动窗口:一个用于数据发送,另一个用于数据接收。
发送端待发数据分组在缓冲区排队等待送出。
被滑动窗口框入的分组,是可以在未收到接收确认的情况下最多送出的部分。
滑动窗口左端标志X的分组,是已经被接收端确认收到的分组。
随着新的确认到来,窗口不断向右滑动4、实验代码#include<stdio.h>#include <stdlib.h>#include <windows.h>//加这个头文件#include <windowsx.h>#include <iostream>#include <winsock.h>#include<conio.h>#include<time.h>#include <math.h>#define NULL 0#define MAX_LENGTH 2000#define RECEIVE_MAX_LENGTH 1500#define SEND_MAX_LENGTH 1500#define TIMEOUT 1#define WSA_WAIT_TIMEOUT -1#define MAXPOOL 100#define SLEEPMS 1000#define SOCKET_DISCONN 0#pragma comment(lib,"ws2_32.lib")#pragma warning(disable:4996)typedef enum { data = 1, ack, nak, tout } frame_kind; //帧类型CRITICAL_SECTION gCS;int socketClient;int ret;typedef struct frame_head{frame_kind kind; //帧类型unsigned int seq; //序列号unsigned int ack; //确认号unsigned char data[MAX_LENGTH]; //数据}Head;typedef struct frame{frame_head head; //帧头unsigned int size; //数据的大小} Frame;typedef struct framenode //队列节点类型{frame head_data;struct framenode *next;} Framenode;typedef struct{Framenode *front; //队头指针Framenode *rear; //队尾指针} LinkQueue;void InitLine(LinkQueue *q){q->front = q->rear =NULL;}int QueueEmpty(LinkQueue *q){return q->front == NULL && q->rear == NULL; }frame QueueFront(LinkQueue *q){if (QueueEmpty(q)){printf("队列为空!\n");Sleep(SLEEPMS);exit(0);}return q->front->head_data;}int QueueLen(LinkQueue *q){if (QueueEmpty(q)){return 0;}int num = 0;Framenode *p = q->front;while (p != NULL){num++;p = p->next;}return num;}void GetFrameFromHost(LinkQueue *q){if (QueueLen(q) >= MAXPOOL){printf("data %d 已准备好\n", q->front->head_data.head.seq);return;}Framenode *p = (Framenode *)malloc(sizeof(Framenode));memset(p->head_data.head.data, 0, MAX_LENGTH);srand((unsigned)time(NULL));p->head_data.size = rand() % MAX_LENGTH; // 帧大小随机生成memset(p->head_data.head.data, '1', p->head_data.size);p->head_data.head.ack = -1;p->head_data.head.kind = data;p->head_data.head.seq = 0;p->next = NULL;if (QueueEmpty(q))q->front = q->rear = p; // 首帧是待发送的帧else{p->head_data.head.seq = (q->rear->head_data.head.seq + 1) % MAXPOOL;q->rear->next = p;q->rear = p;}printf("从主机得到:data %d,放入缓存\n", p->head_data.head.seq);GetFrameFromHost(q); // 由于实验需要,假设主机有足够多的数据帧要发送}void DeLine(LinkQueue *q){Framenode *p = NULL;if (QueueEmpty(q)){printf("队列为空!\n");}else{p = q->front;q->front = p->next;if (q->rear == p) q->rear = NULL;printf("发送data %d, %d 成功!从缓存中删除\n", p->head_data.head.seq, p->head_data.size);free(p);p = NULL;}}void main(){printf("建立连接 ... \n");Begin:WORD wVersionRequested;DWORD WINAPI ReceiveFun(LPVOID pParam);WSADATA wsaData; //初始化socket库wVersionRequested = MAKEWORD(1, 1); //两个byte型合并成一个WORD型int err = WSAStartup(wVersionRequested, &wsaData);if (err != 0){Sleep(SLEEPMS);return;}if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1){WSACleanup(); //中止Windows Sockets服务 WSAStartup()成对使用Sleep(SLEEPMS);return;}socketClient = socket(AF_INET, SOCK_STREAM, 0);//监听的套接字SOCKADDR_IN clientadd;clientadd.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");clientadd.sin_family = AF_INET;clientadd.sin_port = htons(7001);//设置连接端的IP、端口if (SOCKET_ERROR ==connect(socketClient, (SOCKADDR*)&clientadd, sizeof(SOCKADDR))) //连接{WSACleanup();Sleep(SLEEPMS);goto Begin;}char getData[RECEIVE_MAX_LENGTH];memset(getData, 0, RECEIVE_MAX_LENGTH); //清零if (recv(socketClient, getData, RECEIVE_MAX_LENGTH, 0) == SOCKET_ERROR) //接受printf("接受连接提示信息出错!\n");}else{printf("%s\n", getData);}char sendData[SEND_MAX_LENGTH];memset(sendData, 0, SEND_MAX_LENGTH);strcpy(sendData, "你好接收方,我是发送方!");if (SOCKET_ERROR == send(socketClient, sendData, strlen(sendData) + 1, 0)) //发送{printf("发送连接提示信息出错!\n");WSACleanup();closesocket(socketClient);Sleep(SLEEPMS);return;}printf("按任意键继续!\n");while (!kbhit()) {}; //等待开始Sleep(SLEEPMS);printf("1bit滑动窗口协议:发送方,发送窗口=1\n");LinkQueue QueueQ;InitLine(&QueueQ);frame packetsend; //dataframe packetreceive; // ack,nakunsigned long tick = GetTickCount();int ret = 0;HANDLE hThread;while (1){GetFrameFromHost(&QueueQ); //从主机取数据帧memset(&packetsend, 0, sizeof(packetsend));Sleep(SLEEPMS);printf("\n");packetsend = QueueFront(&QueueQ); //取数据帧ret = send(socketClient, (char *)&packetsend, sizeof(packetsend), 0);//发送dataif (ret == SOCKET_ERROR){printf("发送数据出错!\n");continue;}printf("发送数据帧:data %d, %d\n", packetsend.head.seq, packetsend.size);const unsigned long timeOut = 5 * 1000; //设置超时计时器 5秒超时memset(&packetreceive, 0, sizeof(packetreceive));Sleep(SLEEPMS);printf("\n");InitializeCriticalSection(&gCS); // 初始化临界区hThread = CreateThread(NULL, 0, ReceiveFun, (LPVOID)&packetreceive, 0, NULL);int r = WaitForMultipleObjects(1, &hThread, TRUE, timeOut);DeleteCriticalSection(&gCS); //与InitializeCriticalSection(&gCS);成对使用if (ret == SOCKET_ERROR || ret == SOCKET_DISCONN){printf("接受出错!Press any key to continue\n");while (!kbhit()) {};continue;}if (r == WSA_WAIT_TIMEOUT) //判断超时{TerminateThread(hThread, 0); //终止线程printf("超时重传:data %d, %d\n", packetsend.head.seq, packetsend.size);}else if (packetsend.head.seq == packetreceive.head.ack){srand((unsigned)time(NULL));switch (rand() % 5) //假定产生随机结果,20%的概率超时{case 0:printf("接收方发送回复超时(ack丢失模拟):%d\n", packetsend.head.seq);printf("超时重传:data %d, %d\n", packetsend.head.seq, packetsend.size);break;default:if (packetreceive.head.kind == ack){printf("接受ack帧:ack %d\n", packetreceive.head.ack);DeLine(&QueueQ);}else if (packetreceive.head.kind == nak){printf("接受nak帧:nak %d\n", packetsend.head.seq);}break;}}else printf("帧序号出错: %d\n", packetreceive.head.ack);if (GetTickCount() - tick > 20 * TIMEOUT) //设置时间20秒{printf("持续时间20s. 按q退出,其他键继续\n");int kbc = getch();if (kbc == 'q' || kbc == 'Q')break;}}printf("按任意键退出!\n");while (!kbhit()) {};Sleep(SLEEPMS);printf("谢谢使用!\n");WSACleanup();closesocket(socketClient);Sleep(SLEEPMS);}DWORD WINAPI ReceiveFun(LPVOID pArg){EnterCriticalSection(&gCS);//进入critical sectionframe *packetreceive = (frame *)pArg;ret = recv(socketClient, (char *)packetreceive, sizeof(*packetreceive), 0);LeaveCriticalSection(&gCS); //线程用毕,离开critical sectionreturn ret;}#include<stdio.h>#include <stdlib.h>#include <windows.h>//加这个头文件#include <windowsx.h>#include <iostream>#include <winsock.h>#include<conio.h>#include<time.h>#include <math.h>#define NULL 0#define MAX_LENGTH 2000#define RECEIVE_MAX_LENGTH 1500#define SEND_MAX_LENGTH 1500#define TIMEOUT 1#define WSA_WAIT_TIMEOUT -1#define MAXPOOL 100#define SLEEPMS 1000#define SOCKET_DISCONN 0#pragma comment(lib,"ws2_32.lib")#pragma warning(disable:4996)typedef enum { data = 1, ack, nak, tout } frame_kind; //帧类型CRITICAL_SECTION gCS;int socketClient;int ret;typedef struct frame_head{frame_kind kind; //帧类型unsigned int seq; //序列号unsigned int ack; //确认号unsigned char data[MAX_LENGTH]; //数据}Head;typedef struct frame{frame_head head; //帧头unsigned int size; //数据的大小} Frame;typedef struct framenode //队列节点类型{frame head_data;struct framenode *next;} Framenode;typedef struct{Framenode *front; //队头指针Framenode *rear; //队尾指针} LinkQueue;void InitLine(LinkQueue *q){q->front = q->rear = NULL;}int QueueEmpty(LinkQueue *q){return q->front == NULL && q->rear == NULL; }frame QueueFront(LinkQueue *q){if (QueueEmpty(q)){printf("队列为空!\n");Sleep(SLEEPMS);exit(0);}return q->front->head_data;}int QueueLen(LinkQueue *q){if (QueueEmpty(q)){return 0;}int num = 0;Framenode *p = q->front;while (p != NULL){num++;p = p->next;}return num;}int GetFrameFromHost(LinkQueue *q){if (QueueLen(q) >= MAXPOOL){printf("准备接受:data %d \n", q->front->head_data.head.seq);return q->front->head_data.head.seq;}Framenode *p = (Framenode *)malloc(sizeof(Framenode));memset(p->head_data.head.data, 0, MAX_LENGTH);p->head_data.head.ack = -1;p->head_data.head.seq = 0;p->next = NULL;if (QueueEmpty(q))q->front = q->rear = p;else{p->head_data.head.seq = (q->rear->head_data.head.seq + 1) % MAXPOOL;q->rear->next = p;q->rear = p;}return GetFrameFromHost(q);}int DeLine(LinkQueue *q, frame *pf, unsigned int curw) //假设数据帧送往主机是足够快的{Framenode *p = NULL;if (curw == q->front->head_data.head.seq)p = q->front;elsep = q->rear;if (p->head_data.head.ack != -1) //假定数据已经提交主机{printf("向主机交付data %d, %d 成功!\n", p->head_data.head.ack, p->head_data.size);}memset(p->head_data.head.data, 0, MAX_LENGTH);memcpy(p->head_data.head.data, pf->head.data, pf->size);p->head_data.size = pf->size;p->head_data.head.ack = pf->head.seq; //保存发送帧序号}frame QueueAnswer(LinkQueue *q, unsigned int curw){if (curw == q->front->head_data.head.seq){return q->front->head_data;}else{return q->rear->head_data;}}void main(){Begin:WORD wVersionRequested;WSADATA wsaData; //初始化socket库wVersionRequested = MAKEWORD(1, 1); //两个byte型合并成一个WORD型int err = WSAStartup(wVersionRequested, &wsaData);//使用sockets之前要调用一次if (err != 0){Sleep(SLEEPMS);return;}if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1){WSACleanup();//中止Windows Sockets服务 WSAStartup()成对使用Sleep(SLEEPMS);}SOCKET socksrv = socket(AF_INET, SOCK_STREAM, 0);//监听的套接字SOCKADDR_IN socketadd;socketadd.sin_addr.S_un.S_addr = htonl(INADDR_ANY); //监听连接socketadd.sin_family = AF_INET;socketadd.sin_port = htons(7001); //设置端口if (SOCKET_ERROR == bind(socksrv, (SOCKADDR*)&socketadd, sizeof(SOCKADDR))) {printf("绑定出错!\n");WSACleanup();Sleep(SLEEPMS);return;}if (SOCKET_ERROR == listen(socksrv, 5)){printf("监听出错!");WSACleanup();Sleep(SLEEPMS);return;}SOCKADDR_IN sockclient;int len = sizeof(SOCKADDR);SOCKET sockconn = accept(socksrv, (SOCKADDR*)&sockclient, &len);//建立连接的套节字if (INVALID_SOCKET == sockconn){printf("建立连接出错!\n");WSACleanup();Sleep(SLEEPMS);}char sendData[SEND_MAX_LENGTH];memset(sendData, 0, SEND_MAX_LENGTH);sprintf(sendData, "%s", "你好发送方,我是接受方!");if (SOCKET_ERROR == send(sockconn, sendData, strlen(sendData) + 1, 0)){printf("发送连接提示信息出错!\n");WSACleanup();closesocket(sockconn);Sleep(SLEEPMS);return;}char getData[RECEIVE_MAX_LENGTH];memset(getData, 0, RECEIVE_MAX_LENGTH);recv(sockconn, getData, RECEIVE_MAX_LENGTH, 0);printf("%s\n", getData);printf("1bit滑动窗口协议:接收方,接收窗口=1\n");LinkQueue QueueQ;InitLine(&QueueQ);frame packetreceive; //dataframe packetsend; // ack,nakint curw = GetFrameFromHost(&QueueQ);//初始化接收窗口int ret = 0;while (1){memset(&packetreceive, 0, sizeof(packetreceive));Sleep(SLEEPMS);printf("\n");ret = recv(sockconn, (char *)&packetreceive, sizeof(packetreceive), 0);if (ret == SOCKET_ERROR || ret == SOCKET_DISCONN){if (ret == SOCKET_ERROR){printf("连接出错!自动连接!\n");continue;}else{printf("连接已断开,按q退出,其他键等待新的连接\n");int kbc = getch();if (kbc == 'q' || kbc == 'Q')break;else{WSACleanup();closesocket(sockconn);Sleep(SLEEPMS);goto Begin;}}}srand((unsigned)time(NULL));switch (rand() % 5) //假定产生随机结果,20%的概率校验错误或接收发送方超时{case 0:printf("接受数据帧:data %d, %d,校验错误,丢弃(数据帧出错模拟)\n", packetreceive.head.seq, packetreceive.size);memset(&packetsend, 0, sizeof(packetsend));memcpy(&packetsend, &packetreceive, sizeof(packetreceive));packetsend.head.ack = packetreceive.head.seq;packetsend.head.seq = curw;packetsend.head.kind = nak;printf("发送否认帧:nak %d\n", packetreceive.head.seq);break;case 1:packetsend.head.kind = tout;printf("发送方发送数据超时(数据帧丢失模拟):%d\n", packetreceive.head.seq);break;default:printf("接受数据帧:data %d, %d,校验正确\n", packetreceive.head.seq, packetreceive.size);if (packetreceive.head.seq == (QueueAnswer(&QueueQ, curw)).head.ack){printf("上一帧的重发,丢弃,直接发送确认帧:ack %d\n", packetreceive.head.seq);}else{printf("新的数据帧:data %d, %d,放入缓存\n", packetreceive.head.seq, packetreceive.size);curw = DeLine(&QueueQ, &packetreceive, curw); //将新帧保存待送往主机memset(&packetsend, 0, sizeof(packetsend));packetsend = QueueAnswer(&QueueQ, curw); //待发送的确认帧printf("发送确认帧:ack %d\n", packetreceive.head.seq);}packetsend.head.kind = ack;break;}if (packetsend.head.kind == tout) continue; //发送方使用多线程判断超时ret = send(sockconn, (char *)&packetsend, sizeof(packetsend), 0);if (ret == SOCKET_ERROR){printf("发送ack或nak出错!自动连接!\n");continue;}}printf("按任意键退出!\n");while (!kbhit()) {};Sleep(SLEEPMS);cprintf("谢谢使用!\n");WSACleanup();closesocket(sockconn);Sleep(SLEEPMS);}5、实验截图6、实验分析该滑动窗口协议模拟程序还有进一步完善的余地,例如可以对以下一些地方进行改进:(1)改模拟程序通过命令行来实行,缺少形象直观的界面,希望日后可以设计比较简单明了的界面来展示程序的主要模拟功能。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
滑动窗口实验报告(含源码)
一、实验目的
1.实现一个数据链路层协议的数据传送部分。
2.更好地理解数据链路层协议中的“滑动窗口”技术的基本工作
原理。
3.掌握计算机网络协议的基本实现技术。
二、实验要求
在一个数据链路层的模拟实现环境中,用C语言实现下两个数据链路层协议。
1.1比特滑动窗口协议
2.回退N帧滑动窗口协议
三、实验内容
充分理解滑动窗口协议,根据滑动窗口协议,模拟滑动窗口协议中发送端的功能,对系统发送的帧进行缓存并加入窗口等待确认,并在超时或者错误时对部分帧进行重传。
编写停等及退回N滑动窗口协议函数,响应系统的发送请求、接收帧消息以及超时消息,并根据滑动窗口协议进行相应处理。
四、源代码及注释
#include "sysinclude.h"
#include <iostream>
using namespace std;
extern void SendFRAMEPacket(unsigned char* pData, unsigned int len);
//1比特滑动窗口
#define WINDOW_SIZE_STOP_WAIT 1
//回退N帧协议
#define WINDOW_SIZE_BACK_N_FRAME 4
//缓存区大小
#define BUFFER_SIZE 50
typedef enum {DATA,ACK,NAK} Frame_kind;
//帧头
typedef struct Frame_head
{
Frame_kind kind;
unsigned int seq;
unsigned int ack;
unsigned char data[100];
};
//帧
typedef struct Frame
{
Frame_head head;
unsigned int size;
};
//缓存区
Frame buffer[BUFFER_SIZE];
//当前希望确认的帧,最近缓存的帧,下一次要发送的帧
unsigned int expect_frame = 0, last_buffered_frame = 0, next_frame = 0;
/*
* 停等协议测试函数
*/
int stud_slide_window_stop_and_wait(char *pBuffer, int bufferSize, UINT8 messageType)
{
Frame_head* p = (Frame_head*)pBuffer;
//unsigned int frameNum = ntohl(*(unsigned int*)pBuffer);
switch (messageType)
{
//网络层要发送一帧数据时
case MSG_TYPE_SEND : {
//缓存当前要发送的帧
buffer[last_buffered_frame % BUFFER_SIZE].head = *p;
buffer[last_buffered_frame % BUFFER_SIZE].size = bufferSize;。