




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
计算机网络选择重传协议实验报告《计算机网络》选择重传协议实验报告的帧内容转换而来;len,整型,为帧的当前长度。staticsend_frame_(Ucharfk,Ucharnext_frame,Ucharframe_expected,Packetout_buf[])作用:构造一个帧,并将其发送。参数:fk,字节类型,为帧的内容;next_frame,字节类型,为帧的编号;frame_expected,字节类型,为希望收到的帧的编号;out_buf,二维字节数组,为缓冲区。intmain(intargc,char*argv[])作用:主程式,包含选择重传协议的算法流程。参数:argc,整型,表示命令行参数的个数;argv,二维字符数组,表示参数内容。算法流程:StartStartSSwctihAcktimeoutDatatimeoutDatacomingNetworklayerreadyAcktimeoutDatatimeoutDatacomingNetworklayerreadyPPhy-layerreadyMakeackframeResetack_numCountcscFMakeackframeResetack_numCountcscFindframe-endGetpacket()SendthisframeNext_send=ack_expectedGet_num>0SSendthisframeNext_send=ack_expectedGet_num>0Send_data()Csc==0?Csc==0? YPhyready?breakPhyready?Phyready?breakPhyready?SendframeN YSendframe NS_seq=frameExpect?S_seq=frameExpect?Y YSendframePhy_ready=1SSendframePhy_ready=1Sentframe Y NPut_packet()Put_packet() NGet_num=nbufferedbreakBreakGet_num=nbufferedbreakBreakDealwithacknumberDealwithacknumberbreakbreakIn_lenIn_len=1Nbuffered<max_seqNbuffered<max_seqDisablenetworkDisablenetworkEnablenetwork(a)物理层:为数据链路层提供的服务为8000bps,270ms传播延时,10-5误码率的字节流传输通道。为了仿真实现上述服务质量的信道,利用在同一台计算机上TCPSocket完成两个站点之间的通信。由于同一台计算机上TCP通信传播时延短、传播速度快、没有误码,物理层仿真程序在发送端利用“令牌桶”算法限制发送速率以仿真8000bps线路;在接收端误码插入模块利用一个伪随机数“随机地”篡改从TCP收到的数据,使得所接收到的每个比特出现差错的概率为10-5;接收到的数据缓冲后延时270ms才提交给数据链路层程序,以仿真信道的传播时延特性。为了简化程序,省略了成帧功能,数据链路层利用接口函数send_frame()和recv_frame()发送和接收一帧。(b)数据链路层:发送方和接收方都维持一个窗口,窗口内部为可以接受的序列号。接收到的数据包被缓存起来,当按正确的顺序接收完毕后再提交给网络层。ACK信息通过数据帧捎带确认的方式传递,若遇到长时间无数据帧发送,则产生ACK超时事件(ACK_TIMEOUT),主动发送空的ACK帧。若长时间未收到ACK信息,则产生数据帧超时事件(DATA_TIMEOUT),发送方自动重传未确认帧;当出现帧丢失或校验错误时,接收方会主动发送NAK帧提示发送方立即重传。数据链路层通过物理层提供的函数来利用物理层提供的服务。通过get_packet()函数从网络层得到一个分组;当数据链路层成功接收到一个分组后,通过put_packet()函数提交给网络层。(c)网络层:利用数据链路层提供的“可靠的分组传输”服务,在站点A与站点B之间交换长度固定为256字节的数据分组。网络层把产生的分组交付数据链路层,并接受数据链路层提交来的数据分组。3.结果分析(1)描述你所实现的协议软件是否实现了有误码信道环境中无差错传输功能。我们的协议成功实现了有误码信道环境中无差错传输功能。如果收到一个损坏帧,在尚未发送否认确定的情况下,则捎带发送否定确认。并打印错误报告。如果已发送否定确认,则只打印错误报告,不重复发送否定确认。(2)程序的健壮性如何,能否可靠地长时间运行。 我们的程序成功连续运行半小时以上,并取得预定效果。具有足够的健壮性。(3)协议参数的选取:滑动窗口的大小,重传定时器的时限,ACK搭载定时器的时限,这些参数是怎样确定的?根据信道特性数据,分组层分组的大小,以及你的滑动窗口机制,给出定量分析,详细列举出选择这些参数值的具体原因。我们物理层提供的是字节流传输服务,使用字节填充技术成帧,分组长度为256字节。为了避免在有出错帧接收方要求重传时产生二义性,我们定义窗口大小为2^n-1,并且双方的窗口大小均为((MAX_SEQ+1)/2),这样的大小足够使用又不会有过于富余的空间浪费。滑动窗口的大小直接涉及到信道利用率和数据拥塞问题,若太大,数据发送过快将产生拥塞导致数据丢失,出错率增加,若太小则信道利用率降低,通过实验测试合适的窗口大小为16。重传定时器时限涉及到重传的响应时间,太小会导致频繁重传,太大则重传等待时间太久,经过我们的试验测试,选取重传定时器时限定为3000毫秒,ACK搭载定时器的时限为1000毫秒最合适。(4)理论分析:根据所设计的滑动窗口工作机制(Go-Back-N或者选择重传),推导出在无差错信道环境下分组层能获得的最大信道利用率;推导出在有误码条件下重传操作及时发生等理想情况下分组层能获得的最大信道利用率。给出理论推导过程。理论推导的目的是得到信道利用率的极限数据。为了简化有误码条件下的最大利用率推导过程,可以对问题模型进行简化,比如:假定超时重传的数据帧的回馈ACK帧可以100%正确传输,但是简化问题分析的这些假设必须不会对整个结论产生较大的误差。由于需要携带帧信息,所以最大信息利用率为,由于数据链路层提供的服务为8000bps,所以每传输一个字节耗时1ms,每帧的附加信息固定为10,耗时10ms,若出现转义字符还将增加时间。简化模型,假设信道上始终有数据需要传输。则在误码率为的信道上,100000个比特可发送个数据包,即每传送48个数据包将有1个出错。假设在限定时间内可以重传的该帧为正确帧,则每传送48个数据包需传送48+1+1=50次。所以信道利用率为而由于程序设计原因,当一个数据包超时后,常常需要重传多次造成信道浪费。若重传k次,则信道利用率为若重传10次,信道利用率为78.18%。若信道误码率为,则,即大约每5个帧就有一个出错,此时在ESC/FLAG模式下平均250个字符需要两倍的传输空间即极限值510,若平均每个错帧重传10次信道利用率的极值为(5)实验结果分析:你的程序运行实际达到了什么样的效率,比对理论推导给出的结论,有没有差距?给出原因。有没有改进的办法?如果没有时间把这些方法付诸编程实施,介绍你的方案。由实验结果可以看出,窗口大小是16时信道利用率最高,与理论最大值最接近。与理论窗口最佳值一致。在洪泛模式下,信道利用率与理论值接近。而在其他情况下负载有时较轻,所以信道利用率相比理论值较低。(6)存在的问题:在“表3性能测试记录表”中给出了几种测试方案,在测试中你的程序有没有失败,或者,虽未失败,但表现出来的性能仍有差距,你的程序中还存在哪些问题?实验顺利进行,每次测试得到的数据都比较接近,但和理论值相比信道利用率较低,这与信道的负载有关。实验结果:测试最佳窗口尺寸:窗口大小为16,DATA_TIMER3000,ACK_TIMER1000序号命令说明运行时间(分钟)Selective算法线路利用率(%)AB1datalinkaudatalinkbu无误码信道数据传输3059.396.92datalinkadatalinkb站点A分组层平缓方式发出数据,站点B周期性交替发送100秒停发100秒3056.895.03datalinkafudatalinkbfu无误码信道,站点A和站点B的分组层都洪水式产生分组3096.896.44datalinkafdatalinkbf站点A/B的分组层都洪水式产生分组3091.393.65datalinkaf–ber1e-4datalinkbf–ber1e-4站点A/B的分组层都洪水式产生分组,线路误码率为10^-43073.275.5窗口大小为8,DATA_TIMER3000,ACK_TIMER1000序号命令说明运行时间(分钟)Selective算法线路利用率(%)AB1datalinkaudatalinkbu无误码信道数据传输3057.796.92datalinkadatalinkb站点A分组层平缓方式发出数据,站点B周期性交替发送100秒停发100秒3055.694.83datalinkafudatalinkbfu无误码信道,站点A和站点B的分组层都洪水式产生分组3096.996.94datalinkafdatalinkbf站点A/B的分组层都洪水式产生分组3095.595.05datalinkaf–ber1e-4datalinkbf–ber1e-4站点A/B的分组层都洪水式产生分组,线路误码率为10^-43075.073.2窗口大小为32,DATA_TIMER3000,ACK_TIMER1000序号命令说明运行时间(分钟)Selective算法线路利用率(%)AB1datalinkaudatalinkbu无误码信道数据传输3096.996.92datalinkadatalinkb站点A分组层平缓方式发出数据,站点B周期性交替发送100秒停发100秒3054.893.63datalinkafudatalinkbfu无误码信道,站点A和站点B的分组层都洪水式产生分组3096.997.04datalinkafdatalinkbf站点A/B的分组层都洪水式产生分组3090.690.25datalinkaf–ber1e-4datalinkbf–ber1e-4站点A/B的分组层都洪水式产生分组,线路误码率为10^-43050.052.3从测试结果比较得出,窗口最佳尺寸为16;ACK搭载定时器的时限定为1000毫秒,窗口大小为16,测试重传定时器时限DATA_TIMER2800,窗口大小为16,ACK_TIMER1000测试最佳DATA_TIMER取值序号命令说明运行时间(分钟)Selective算法线路利用率(%)AB1datalinkaudatalinkbu无误码信道数据传输3055.393.92datalinkadatalinkb站点A分组层平缓方式发出数据,站点B周期性交替发送100秒停发100秒3049.688.73datalinkafudatalinkbfu无误码信道,站点A和站点B的分组层都洪水式产生分组3096.996.94datalinkafdatalinkbf站点A/B的分组层都洪水式产生分组3086.188.25datalinkaf–ber1e-4datalinkbf–ber1e-4站点A/B的分组层都洪水式产生分组,线路误码率为10^-43069.670.1DATA_TIMER3000,窗口大小为16,ACK_TIMER1000序号命令说明运行时间(分钟)Selective算法线路利用率(%)AB1datalinkaudatalinkbu无误码信道数据传输3059.396.92datalinkadatalinkb站点A分组层平缓方式发出数据,站点B周期性交替发送100秒停发100秒3056.895.03datalinkafudatalinkbfu无误码信道,站点A和站点B的分组层都洪水式产生分组3096.896.44datalinkafdatalinkbf站点A/B的分组层都洪水式产生分组3091.393.65datalinkaf–ber1e-4datalinkbf–ber1e-4站点A/B的分组层都洪水式产生分组,线路误码率为10^-43073.275.5DATA_TIMER3200,窗口大小为16,ACK_TIMER1000序号命令说明运行时间(分钟)Selective算法线路利用率(%)AB1datalinkaudatalinkbu无误码信道数据传输3058.096.82datalinkadatalinkb站点A分组层平缓方式发出数据,站点B周期性交替发送100秒停发100秒3055.890.33datalinkafudatalinkbfu无误码信道,站点A和站点B的分组层都洪水式产生分组3096.996.94datalinkafdatalinkbf站点A/B的分组层都洪水式产生分组3089.390.65datalinkaf–ber1e-4datalinkbf–ber1e-4站点A/B的分组层都洪水式产生分组,线路误码率为10^-43063.468.9DATA_TIMER3400,窗口大小为16,ACK_TIMER1000序号命令说明运行时间(分钟)Selective算法线路利用率(%)AB1datalinkaudatalinkbu无误码信道数据传输3056.996.82datalinkadatalinkb站点A分组层平缓方式发出数据,站点B周期性交替发送100秒停发100秒3054.889.93datalinkafudatalinkbfu无误码信道,站点A和站点B的分组层都洪水式产生分组3096.896.84datalinkafdatalinkbf站点A/B的分组层都洪水式产生分组3087.789.85datalinkaf–ber1e-4datalinkbf–ber1e-4站点A/B的分组层都洪水式产生分组,线路误码率为10^-43068.170.3从测试结果比较得出,DATA_TIMER=3000为最佳取值重传定时器时限定为3000毫秒,窗口大小为16,测试ACK搭载定时器的时限ACK=1000ms序号命令说明运行时间(分钟)Selective算法线路利用率(%)AB1datalinkaudatalinkbu无误码信道数据传输3059.396.92datalinkadatalinkb站点A分组层平缓方式发出数据,站点B周期性交替发送100秒停发100秒3056.895.03datalinkafudatalinkbfu无误码信道,站点A和站点B的分组层都洪水式产生分组3096.996.44datalinkafdatalinkbf站点A/B的分组层都洪水式产生分组3095.195.45datalinkaf–ber1e-4datalinkbf–ber1e-4站点A/B的分组层都洪水式产生分组,线路误码率为10^-43073.275.5ACK=1100ms序号命令说明运行时间(分钟)Selective算法线路利用率(%)AB1datalinkaudatalinkbu无误码信道数据传输3068.496.92datalinkadatalinkb站点A分组层平缓方式发出数据,站点B周期性交替发送100秒停发100秒3067.695.63datalinkafudatalinkbfu无误码信道,站点A和站点B的分组层都洪水式产生分组3096.996.94datalinkafdatalinkbf站点A/B的分组层都洪水式产生分组3095.195.05datalinkaf–ber1e-4datalinkbf–ber1e-4站点A/B的分组层都洪水式产生分组,线路误码率为10^-43072.576.3ACK=1200ms序号命令说明运行时间(分钟)Selective算法线路利用率(%)AB1datalinkaudatalinkbu无误码信道数据传输3055.996.92datalinkadatalinkb站点A分组层平缓方式发出数据,站点B周期性交替发送100秒停发100秒3057.194.93datalinkafudatalinkbfu无误码信道,站点A和站点B的分组层都洪水式产生分组3096.996.94datalinkafdatalinkbf站点A/B的分组层都洪水式产生分组3095.295.15datalinkaf–ber1e-4datalinkbf–ber1e-4站点A/B的分组层都洪水式产生分组,线路误码率为10^-43074.573.3ACK=1300ms序号命令说明运行时间(分钟)Selective算法线路利用率(%)AB1datalinkaudatalinkbu无误码信道数据传输3057.094.82datalinkadatalinkb站点A分组层平缓方式发出数据,站点B周期性交替发送100秒停发100秒3055.894.93datalinkafudatalinkbfu无误码信道,站点A和站点B的分组层都洪水式产生分组3097.096.84datalinkafdatalinkbf站点A/B的分组层都洪水式产生分组3095.195.05datalinkaf–ber1e-4datalinkbf–ber1e-4站点A/B的分组层都洪水式产生分组,线路误码率为10^-43071.474.4从测试结果比较得出,最佳ACK搭载定时器的时限为1100ms实验截图:(最佳参数)DATA_TIMER3000,窗口大小为16,ACK_TIMER1100datalinkaudatalinkbudatalinkadatalinkbdatalinkafudatalinkbfudatalinkafdatalinkbfdatalinkaf–ber1e-4datalinkbf–ber1e-44.研究和探索的问题1.CRC校验能力CRC校验码的检错能力很强,它除了能检查出离散错外,还能检查出突发错,CRC校验码具有以下检错能力:CRC校验码能检查出全部单个错;CRC校验码能检查出全部离散的二位错;CRC校验码能检查出全部奇数个错;CRC校验码能检查出全部长度小于或等于K位的突发错;CRC校验码能以[1-(1/2)K-1]的概率检查出长度为(K+1)位的突发错。由于本次试验过程的误码信道是一个比较固定的误码率,而在实际生活当中的误码率不是稳定的,可能会因为传输环境的不同,使得他的误码率波动比较大的,例如,下雨天和晴天,高噪声和低噪声的情况,传输的距离也是影响因素。对于这种动态的误码率的通信过程,可能需要其他的一些参数来控制基本参数值(窗口大小,重传时间等等)来完成。3.get_ms()如何实现C语言的time.h当中提供了一些关于时间操作的函数可以实现get_ms()函数。可以利用的函数有clock()函数原型为:clock_tclock()该函数返回程序开始执行后占用的处理器时间,如果无法获得占用时间则返回-1。因为我们计时的起点并不是程序开始之时,而是开始通信之时,所以需要一个静态变量start_time来记录通信起始的时间。然后在每次调用get_ms()后,获取当前的时间current_time。然后再返回start_time-current_time即可。4.对等协议实体之间的流量控制在我们设计的协议当中,流量的控制主要通过接收窗口,发送窗口还有确认机制来实现。因为有窗口大小的限制,发送方不会一次性发送过多信息导致接收方被信息洪流所淹没,导致信息丢失。这样可能会导致信道的利用率降低,但是如果合理的设计窗口大小,依然可以达到较高的信号利用率。5.实验总结和心得体会(1)完成本次实验的实际上机调试时间是多少?由于其他课业任务较多,日程安排紧张,完成本次试验代码的编写大约用了一周,每天晚上大约抽出1-2小时的时间。其中很大一部分时间是在程序框架的确定和debug.在这之后又花了5天,每晚1-2小时的时间用于测试协议参数的选取等问题。(2)编程工具方面遇到了哪些问题?包括Windows环境和VC软件的安装问题。这方面进展十分顺利。(3)编程语言方面遇到了哪些问题?包括C语言使用和对C语言操控能力上的问题。由于我们学习使用C语言时间较长,运用起来并没有什么阻碍。(4)协议方面遇到了哪些问题?包括协议机制的设计错误,发现协议死锁,或者不能正确工作,协议参数的调整等问题。由于我们缓冲区判断满溢的条件存在问题,缓冲区溢出时网络层依然没有被关闭,导致运行程序时发现数据帧“丢失”;在协议参数的选择上也花了较长时间。(5)开发库方面遇到了哪些问题?包括库程序中的BUG,库函数文档不够清楚导致误解,库函数在所提供的功能结构上的缺憾导致编程效率低下。这些问题或建议影响不同模块之间功能界限的划分。无法看到库函数的实现部分的代码,对各个参数的作用也没有详细清晰的说明,所以掌握这些函数花了较长时间,使用时也出现过很多错误。(6)总结本次实验,你在C语言方面,协议软件方面,理论学习方面,软件工程方面等哪些方面上有所提高? 通过这次试验,我们对数据链路层的选择重传协议的机制有了很深刻的了解。很多书本上不是很懂的讲义,在我们进行试验的过程中,通过对模拟结果的分析与思考都一点点的理解了。而且这次试验是我们第一次模拟通信,让我们学会了windows下观察网络收发数据包模拟环境的搭建。6.源程序清单#include<stdio.h>#include<string.h>#include"protocol.h"#defineDATA1#defineNAK2#defineACK3#defineDATA_TIMER3000#defineACK_TIMER1000#defineMAX_SEQ63#defineNR_BUFS((MAX_SEQ+1)/2)intno_nak=1;staticintphl_ready=0;structFRAME{unsignedcharkind;/*数据、确认、否定确认*/unsignedcharack;unsignedcharseq;unsignedchardata[PKT_LEN];unsignedintpadding;};staticintbetween(unsignedchara,unsignedcharb,unsignedcharc){ /*如果满足a<=b<c或其循环则返回真;否则返回假*/ return((a<=b)&&(b<c))||((c<a)&&(a<=b))||((b<c)&&(c<a));}staticvoidput_frame(unsignedchar*frame,intlen){//发送捎带确认帧的数据帧*(unsignedint*)(frame+len)=crc32(frame,len);send_frame(frame,len+4);phl_ready=0;}staticvoidsend_data_frame(unsignedcharfk,unsignedcharframe_nr,unsignedcharframe_expected,unsignedcharbuffer[NR_BUFS][PKT_LEN]){/*构造并发送数据、确认、否定确认帧*/ structFRAMEs;s.kind=fk;s.seq=frame_nr;s.ack=(frame_expected+MAX_SEQ)%(MAX_SEQ+1); if(fk==DATA){ memcpy(s.data,buffer[frame_nr%NR_BUFS],PKT_LEN); dbg_frame("SendDATA%d%d,ID%d\n",s.seq,s.ack,*(short*)s.data);put_frame((unsignedchar*)&s,3+PKT_LEN); start_timer(frame_nr%NR_BUFS,DATA_TIMER); } if(fk==NAK){ no_nak=0; dbg_frame("SendNAK%d\n",s.ack); put_frame((unsignedchar*)&s,3+PKT_LEN); } if(fk==ACK){ dbg_frame("SendACK%d\n",s.ack);put_frame((unsignedchar*)&s,3+PKT_LEN); } phl_ready=0; stop_ack_timer();}voidmain(intargc,char**argv){ intevent,arg;structFRAMEf;intlen=0; inti; staticunsignedcharack_expected=0; staticunsignedcharnext_frame_to_send=0; staticunsignedcharframe_expected=0; staticunsignedchartoo_far=NR_BUFS;staticunsignedcharnbuffered=0; intarrived[NR_BUFS]; staticunsignedcharout_buf[NR_BUFS][PKT_LEN]; staticunsignedcharin_buf[NR_BUFS][PKT_LEN];protocol_init(argc,argv);//初始化协议lprintf("DesignedbyCK~~,build:"__DATE__""__TIME__"\n"); for(i=0;i<NR_BUFS;i++) arrived[i]=0;//没有帧到达接收方enable_network_layer();//初始化 while(1){ event=wait_for_event(&arg);//等待下一事件 switch(event){ caseNETWORK_LAYER_READY://允许网络层发送数据帧 nbuffered++;//缓冲区数据帧数加一 get_packet(out_buf[next_frame_to_send%NR_BUFS]);//从网络层接收数据帧 send_data_frame(DATA,next_frame_to_send,frame_expected,out_buf);//发送数据帧 next_frame_to_send=(next_frame_to_send+1)%(MAX_SEQ+1);//发送窗口上界下移 break; casePHYSICAL_LAYER_READY://物理层空闲 phl_ready=1; break; caseFRAME_RECEIVED://接收方收到一个帧 len=recv_frame((unsignedchar*)&f,sizeoff);//帧长if(len<5||crc32((unsignedchar*)&f,len)!=0){//收到的帧损坏 if(no_nak)//如果没有发送NAK,则发送NAK要求重传(避免多次请求重发) send_data_frame(NAK,0,frame_expected,out_buf);//相对协议5不同,收到错误要求重传而不是直接abortdbg_event("****ReceiverError,BadCRCChecksum\n");//打印损坏报告break;//跳出switch语句 } if(f.kind==DATA){//收到一个数据帧 dbg_frame("RecvDATA%d%d,ID%d\n",f.seq,f.ack,*(short*)f.data);//打印收到帧完好 if((f.seq!=frame_expected)&&no_nak)//未按照顺序到达 send_data_frame(NAK,0,frame_expected,out_buf);//返回错误帧 else start_ack_timer(ACK_TIMER);//开启辅助计时器 if(between(frame_expected,f.seq,too_far)&&arrived[f.seq%NR_BUFS]==0){//数据帧落在窗口内 /*数据帧可能以任何顺序到达*/ arrived[f.seq%NR_BUFS]=1; memcpy(in_buf[f.seq%NR_BUFS],f.data,len-7); while(arrived[frame_expected%NR_BUFS]){//如果到达的帧落在接收窗上 /*数据帧通过并移动接收窗口*/ put_packet(in_buf[frame_expected%NR_BUFS],len-7);//将到达的数据帧发送
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度离职员工保密协议及竞业限制合同签订流程规范
- 二零二五年度知识产权保护合伙人合作协议范本
- 法律实务案例分析题及法律理论应用题卷
- 共享平台合作协议知识产权合作开发协议
- 高峰会议交流与合作备忘录
- 油漆劳务合同油漆工用工合同
- 基于大数据的农业现代化种植管理系统开发实践
- 企业形象策划及活动推广合作协议
- 精纺织品采购合同
- 高一英语动词时态对照分析教案
- 美甲基础理论精品专业课件
- 监护人考试试题含答案
- 冀教版四年级下册英语全册教学设计(经典,可直接打印使用)
- 高压变频器技术协议最终2.3日
- 保洁整改方案计划
- 新编地图学教程(第三版)毛赞猷_期末复习知识点总结
- 碘-淀粉比色法测定淀粉酶课件
- 经销商授权协议合同书(中英文对照)
- 初三化学公式大全
- 安装超载限制器方案
- 外科学总论--创伤ppt
评论
0/150
提交评论