为了正常的体验网站,请在浏览器设置里面开启Javascript功能!
首页 > 接口与协议实验

接口与协议实验

2019-05-11 3页 doc 1MB 33阅读

用户头像 个人认证

王小宝007

暂无简介

举报
接口与协议实验XX大学协议与接口软件设计技术实验报告专业班级:学生姓名:学号(班内序号):年月日实验一停等式ARQ协议模拟实验[实验目的]1.通过停等式ARQ协议演示实验,学习OPNET开发环境的使用方法,初步掌握OPNET建模的基本过程。2.熟悉OPNET提供的协议算法开发工具,掌握在OPNET平台下实现协议状态机的方法。[实验环境]1.操作系统:WindowsXP,Windows2000,Windows98皆可;2.开发平台:OPNETModeler10.0;3.其他软件:Microsoftvisualc++6.0。[实验原理]停等式A...
接口与协议实验
XX大学与接口软件设计技术实验专业班级:学生姓名:学号(班内序号):年月日实验一停等式ARQ协议模拟实验[实验目的]1.通过停等式ARQ协议演示实验,学习OPNET开发环境的使用方法,初步掌握OPNET建模的基本过程。2.熟悉OPNET提供的协议算法开发工具,掌握在OPNET平台下实现协议状态机的方法。[实验环境]1.操作系统:WindowsXP,Windows2000,Windows98皆可;2.开发平台:OPNETModeler10.0;3.其他软件:Microsoftvisualc++6.0。[实验原理]停等式ARQ协议的工作原理:停等式ARQ协议是最简单和最基本的数据链路层协议,其特点是:发送端每发送一帧数据,将不能继续发送后续数据,而是等待接收端的确认帧或否认帧。接收端收到数据帧后经过检验如果没有发现出错,则向发送端返回一个确认帧(ACK),否则返回否认帧(NAK)。发送端收到ACK后取出下一帧发送,收到NAK则重发原来的数据帧。停等式ARQ的工作过程如图:停等式ARQ的工作过程[实验内容]一、设计思想:1.发送方和接收方的图:2.状态转移图:发送方:接收方:3.PDU的结构:Type:包的类型,Data、ACK或NAKSeqNum:数据包的序号,取值0或1AckNum:ACK或NAK帧的序号,取值0或1Corrupted:包是否出错的标记,0表示未出错,1表示出错Data:PDU的净负荷,长度符合指数分布二、实现:1.发送方和接收方的状态转移图:停等ARQ协议实验网络模型:发送方状态转移图:接收方状态转移图:2.PDU结构图:3.主要变量:发送方模块参数设置:接收方模块参数设置:4.核心程序:Sender模块:if(op_intrpt_type()==OPC_INTRPT_STRM)//发生ARVL事件{//停止定时钟op_intrpt_clear_self();//获取指向收到的数据包的指针pkt=op_pk_get(op_intrpt_strm());//判断该数据包的类型op_pk_nfd_get(pkt,"Type",&pktType);op_pk_nfd_get(pkt,"AckNum",&ack_num);op_pk_destroy(pkt);if(pktType==ACKPacket)//ACK{//判断ACK是否是当前帧的确认,不是则直接返回等待状态if(ack_num!=1-send_seq)return;//对新发送的包进行记录if(packet_saved!=NULL)op_pk_destroy(packet_saved);//删除缓存的包send_number++;send_seq=1-send_seq;if(send_number<total_pkt){//创建一个新的数据包pkt=op_pk_create_fmt("SWARQ_Full_Packet");op_pk_nfd_set(pkt,"Type",0);op_pk_nfd_set(pkt,"SeqNum",send_seq);op_pk_nfd_set(pkt,"Corrupted",0);data=op_pk_create(op_dist_outcome(dist));op_pk_nfd_set_pkt(pkt,"Data",data);//对数据包进行缓存packet_saved=op_pk_copy(pkt);}}elseif(pktType==NAKPacket)//NAK{pkt=op_pk_copy(packet_saved);}if(send_number<total_pkt){op_pk_send(pkt,STREAM_OUT);op_intrpt_schedule_self(op_sim_time()+wait_time,0);op_stat_write(pkt_sent,send_number);}}elseif(op_intrpt_type()==OPC_INTRPT_SELF)//发生TIMEOUT事件{if(packet_saved==NULL)//发送第一个数据包{//创建一个新的数据包pkt=op_pk_create_fmt("SWARQ_Full_Packet");op_pk_nfd_set(pkt,"Type",0);op_pk_nfd_set(pkt,"SeqNum",send_seq);op_pk_nfd_set(pkt,"Corrupted",0);data=op_pk_create(op_dist_outcome(dist));op_pk_nfd_set_pkt(pkt,"Data",data);//对数据包进行缓存packet_saved=op_pk_copy(pkt);op_pk_send(pkt,STREAM_OUT);op_intrpt_schedule_self(op_sim_time()+wait_time,0);//设置定时钟op_stat_write(pkt_sent,send_number);}else//超时重传数据包{pkt=op_pk_copy(packet_saved);op_pk_send(pkt,STREAM_OUT);op_intrpt_schedule_self(op_sim_time()+wait_time,0);//设置定时钟op_stat_write(pkt_sent,send_number);}}Receiver模块:packet_rcvd++;pkt=op_pk_get(op_intrpt_strm());op_pk_nfd_get(pkt,"SeqNum",&seqnum);if(recv_seq!=seqnum)//收到的数据帧不是所期待的{op_pk_destroy(pkt);pkt=op_pk_create_fmt("SWARQ_Full_Packet");//创建响应帧op_pk_nfd_set(pkt,"Type",ACKPacket);op_pk_nfd_set(pkt,"Corrupted",0);op_pk_nfd_set(pkt,"AckNum",recv_seq);}else//收到的数据帧是所期望的{op_pk_nfd_get(pkt,"Corrupted",&iserror);//检测数据帧是否有错op_pk_destroy(pkt);pkt=op_pk_create_fmt("SWARQ_Full_Packet");//创建响应帧if(iserror==0)//数据帧没错时,返回ACK响应{recv_seq=1-recv_seq;op_pk_nfd_set(pkt,"Type",ACKPacket);packet_rcvd_suc++;}elseif(iserror==1)//数据帧有错时,返回NAK响应op_pk_nfd_set(pkt,"Type",NAKPacket);op_pk_nfd_set(pkt,"Corrupted",0);op_pk_nfd_set(pkt,"AckNum",recv_seq);}op_pk_send(pkt,STREAM_OUT);三、仿真曲线图:PacketError/PacketDropped/PacketSent[思考问题]1.示例程序中PDU的设计是否最优?如果不是,如何进行修改?答:不是最优。它的缺陷是一次只能确认一个数据包,速度太慢,影响数据传送速度,因此可以改为一次可以确认多个数据包以提高链路使用率以及数据传输速率。2.示例程序中状态转移图的“init”状态是否可以与“idle”状态合并,为什么?答:不能。因为两个状态的作用不同,init状态是初始化参数;idle状态是等待新的数据帧。[学习心得]本实验在刚开始做的时候不了解是干什么的,第一天去了后软件安装了一早上,然后按照那个老师给的开始学习这个实验要做的内容,并且利用一下午的时间通过老师做好的实验观察了停等式ARQ协议的状态转换等过程,进一步的加深了我对于这个协议的印象和理解。在此过程中,我们9班的同学们一起协同合作和老师一起探讨了这个实验中涉及到的源代码,并且实实在在的理解了这个实验的运行过程,感觉到非常开心,希望以后还可以有这样好的学习机会和同学们和老师共同探讨问题,解决问题。实验二连续式ARQ协议模拟实验[实验目的]1.掌握协议状态机设计与实现的基本方法2.掌握定时器、缓冲区使用与管理的方法[实验环境]1.操作系统:WindowsXP,Windows2000,Windows98皆可;2.开发平台:OPNETModeler10.0;3.其他软件:Microsoftvisualc++6.0。[实验原理]连续ARQ协议的工作原理:连续ARQ协议是滑动窗口技术和自动请求重发技术的结合,其特点是允许发送站连续不断地发送,并从反向信道监视接收站应答信号。如果发送站收到一个NAK或一段时间没有收到应答,则停发并从有错的数据帧开始进行重发,如下图所示:连续ARQ协议的工作过程一、滑动窗口原理下图所示为滑动窗口工作原理。假设序号用3比特编码,则帧序号的取值范围是0~7。阴影部分表示发送站可以发送7帧,帧号从6开始。每发送一帧,阴影所示的窗口就向里收缩,每接收到一个响应,则窗口就向右扩张。滑动窗口原理二、实验样本程序介绍实验样本程序已提供连续ARQ协议的网络域仿真模型,如下图所示:连续ARQ协议的网络模型其中,sender是采用连续ARQ协议的发送站;receiver是采用连续ARQ协议的接收站;link用于模拟非理想的双向通信链路,且链路的传输时延、丢包率和误码率可随意设置;monitor是一个逻辑功能节点,用于监视成功接收到的数据帧数,当帧数达到10000,结束仿真。link和monitor的功能在样本程序中已经实现。link的节点域模型如下图所示,其中Sender_In->Packet_error->Packet_Delay->Packet_Drop->Sender_Out构成正向信道,传递发送站到接收站的数据帧;pr_1->pt_1构成反向监视信道,传递接收站到发送站的确认帧和否定帧。为了简单,假设反向信道是理想的,不存在传输时延、丢包和误码。实际通信链路link的节点域模型上图中,Packet_error、Packet_Delay和Packet_Drop节点模块分别模拟实际传输链路的误码、时延和丢包,每个节点模块都有自己的进程域模型,详见样本程序。monitor的节点域模型如下图所示,其中pr_0代表点对点接收机,接收经receiver成功处理过的数据帧;monitor节点模块将收到的数据帧销毁,并统计数据帧的个数,当达到10000时,通过函数op_sim_end("Simulationend","","","")设置仿真结束事件OPC_INTRPT_ENDSIM,发送站和接收站的处理进程检测到该事件后将终止仿真。监视节点monitor的节点域模型sender的节点域模型如下图所示。其中pt_0是点对点发送机,向链路上发送数据帧;pr_0是点对点接收机,从链路上接收响应帧。sender是发送站的处理模块,实现连续ARQ协议发送侧的状态机和数据帧的处理。发送站sender的节点域模型receiver的节点域模型如下图所示。其中pr_0是点对点接收机,从链路上接收数据帧;pt_0是点对点发送机,向链路上发送响应帧;pt_1是另一个点对点发送机,向monitor节点转发成功处理过的数据帧。receiver是接收站的处理模块,实现连续ARQ协议接收侧的状态机和数据帧的处理。接收站receiver的节点域模型[实验内容]一、设计思想:发送方和接收方的流程图:二、实现方案:1.发送方和接收方的状态转移图:连续ARQ协议实验网络模型:Sender发送方状态转移图:Receiver接收方状态转移图:2.主要变量:连续sender模块参数设置:连续receiver模块参数设置:3.核心程序:Sender模块:if(op_intrpt_type()==OPC_INTRPT_SELF)//TIMEOUT事件{if(op_ev_valid(hTimer)==OPC_TRUE){if(op_ev_equal(hTimer,op_ev_current())==OPC_TRUE)//启动初始发包过程的定时器超时{for(count=0;count<window_size;count++){//创建一个新的控制节点new_buffer=(pk_window*)op_prg_mem_alloc(sizeof(pk_window));//初始化新创建节点的值//创建一个新的数据包pkt=op_pk_create_fmt("SWARQ_Full_Packet");op_pk_nfd_set(pkt,"Type",0);op_pk_nfd_set(pkt,"SeqNum",send_number);op_pk_nfd_set(pkt,"AckNum",0);op_pk_nfd_set(pkt,"Corrupted",0);dataLen=op_dist_outcome(dist);data=op_pk_create(dataLen);op_pk_nfd_set_pkt(pkt,"Data",data);new_buffer->save_packet=op_pk_copy(pkt);new_buffer->occupied=1;new_buffer->seq_num=send_number;new_buffer->time_id=op_intrpt_schedule_self(op_sim_time()+3.0,0);op_prg_list_insert(send_window,new_buffer,OPC_LISTPOS_TAIL);send_number++;op_pk_send(pkt,STREAM_OUT);op_stat_write(pkt_sent,new_buffer->seq_num);}}}else//定时器超时重传{count=OPC_LISTPOS_HEAD;new_buffer=(pk_window*)op_prg_list_access(send_window,count);while(op_ev_equal(new_buffer->time_id,op_ev_current())==OPC_FALSE)//检查是哪个包超时{count++;new_buffer=(pk_window*)op_prg_list_access(send_window,count);}pkt=op_pk_copy(new_buffer->save_packet);op_pk_send(pkt,STREAM_OUT);new_buffer->time_id=op_intrpt_schedule_self(op_sim_time()+3.0,0);op_stat_write(pkt_sent,new_buffer->seq_num);}}elseif(op_intrpt_type()==OPC_INTRPT_STRM)//ARVL事件{pkt=op_pk_get(op_intrpt_strm());op_pk_nfd_get_int32(pkt,"Type",&pkType);op_pk_nfd_get_int32(pkt,"AckNum",&seq_num);if(pkType==ACKPacket){op_stat_write(ack_rcvd,seq_num);for(count=window_lower;count<seq_num;count++)//从发送窗口中删除被ACK确认的帧,并发送新加入的数据帧{new_buffer=op_prg_list_remove(send_window,OPC_LISTPOS_HEAD);op_pk_destroy(new_buffer->save_packet);//释放缓存的包op_ev_cancel(new_buffer->time_id);//停止定时器new_buffer->occupied=0;new_buffer->seq_num=0;//创建一个新的数据包pkt=op_pk_create_fmt("SWARQ_Full_Packet");op_pk_nfd_set(pkt,"Type",0);op_pk_nfd_set(pkt,"SeqNum",send_number);op_pk_nfd_set(pkt,"AckNum",0);op_pk_nfd_set(pkt,"Corrupted",0);dataLen=op_dist_outcome(dist);data=op_pk_create(dataLen);op_pk_nfd_set_pkt(pkt,"Data",data);new_buffer->save_packet=op_pk_copy(pkt);new_buffer->occupied=1;new_buffer->seq_num=send_number;new_buffer->time_id=op_intrpt_schedule_self(op_sim_time()+3.0,0);send_number++;op_pk_send(pkt,STREAM_OUT);op_stat_write(pkt_sent,new_buffer->seq_num);op_prg_list_insert(send_window,new_buffer,OPC_LISTPOS_TAIL);}window_lower=seq_num;}elseif(pkType==NAKPacket){op_stat_write(nak_rcvd,seq_num);for(count=window_lower;count<seq_num;count++)//从发送窗口中删除被NAK隐含确认的帧,并加入新的待发送帧{new_buffer=op_prg_list_remove(send_window,OPC_LISTPOS_HEAD);op_pk_destroy(new_buffer->save_packet);//释放缓存的包op_ev_cancel(new_buffer->time_id);//停止定时器new_buffer->occupied=0;new_buffer->seq_num=0;//创建一个新的数据包pkt=op_pk_create_fmt("SWARQ_Full_Packet");op_pk_nfd_set(pkt,"Type",0);op_pk_nfd_set(pkt,"SeqNum",send_number);op_pk_nfd_set(pkt,"AckNum",0);op_pk_nfd_set(pkt,"Corrupted",0);dataLen=op_dist_outcome(dist);data=op_pk_create(dataLen);op_pk_nfd_set_pkt(pkt,"Data",data);new_buffer->save_packet=op_pk_copy(pkt);new_buffer->occupied=1;new_buffer->seq_num=send_number;new_buffer->time_id=op_intrpt_schedule_self(op_sim_time()+3.0,0);send_number++;op_prg_list_insert(send_window,new_buffer,OPC_LISTPOS_TAIL);}window_lower=seq_num;for(count=0;count<window_size;count++)//从发送窗口的底部开始发送其中所有的帧{new_buffer=op_prg_list_access(send_window,count);if(new_buffer->occupied==1){pkt=op_pk_copy(new_buffer->save_packet);op_pk_send(pkt,STREAM_OUT);op_stat_write(pkt_sent,new_buffer->seq_num);}}}}Receiver模块:pkt_rcvd++;//获取指向接收到的数据包的指针pkt=op_pk_get(op_intrpt_strm());op_pk_nfd_get_int32(pkt,"Corrupted",&isValid);op_pk_nfd_get_int32(pkt,"SeqNum",&pktNum);op_stat_write(pkt_print,pktNum);if(isValid==0)//成功收到一个包{//检查是否是所期望收到的包if(pktNum==next_pkt){pkt_rcvd_suc++;next_pkt++;op_pk_send(pkt,STREAM_OUT1);ack=op_pk_create_fmt("SWARQ_Full_Packet");op_pk_nfd_set(ack,"Type",ACKPacket);op_pk_nfd_set(ack,"SeqNum",0);op_pk_nfd_set(ack,"AckNum",next_pkt);//AckNum表示该序号之前所有的包都已正确接收,即AckNum是希望发送方发送的下一个包op_pk_nfd_set(ack,"Corrupted",0);op_pk_send(ack,STREAM_OUT);}elseop_pk_destroy(pkt);}elseif(isValid==1)//收到一个错误的包{if(pktNum==next_pkt)//不是乱序的包,乱序的包直接丢弃{nak=op_pk_create_fmt("SWARQ_Full_Packet");op_pk_nfd_set(nak,"Type",NAKPacket);op_pk_nfd_set(nak,"SeqNum",0);op_pk_nfd_set(nak,"AckNum",pktNum);//AckNum表示该序号之前所有的包都已正确接收,即AckNum是发生错误,希望发送方重新发送的包op_pk_nfd_set(nak,"Corrupted",0);op_pk_send(nak,STREAM_OUT);}op_pk_destroy(pkt);}三、仿真曲线图:AckReceived/NakReceived[思考问题]1.状态转移图中default转移条件的作用是什么?可以省略吗?答:不可以省略。作用是用来对所有未知情况进行统一处理。2.利用OPNET的“ListCode”命令,查看sender节点模块的进程域代码,分析OPNET是采用哪种方式实现状态机的,开关语句还是SET?答:OPNET是采用SET语句来实现状态机。3.除了程序中采用的定时器管理方法之外,再设计一种新的管理方式。答:状态管理方法。[学习心得]在这个实验开始前,老师让我们回去仔细的研究上一个实验的实验代码,我们在底下看的时候遇到了些困难,在上课的时候我们9班的同学又坐在一起讨论该实验,学习的氛围很好,因此通过不久的时间大家就明白了这个实验,通过对代码的研究,我也更加透彻得明白了停等式ARQ协议和连续ARQ协议之间的区别,这个协议和停等式ARQ的优缺点,以及这两个协议各自的使用环境,我觉得通过这次实验,对于我学习和理解数据包传递过程甚为重要,因此收获颇深,真的希望以后有机会再和老师探讨这方面的问题,希望自己在这方面可以走得更远!指导教师评语:成绩:——————————————————————————装订线———————————————————————————————————————————————————————————装订线—————————————————————————————————PAGE_1348386849.vsd0123456701234567……已经发送的帧发送帧窗口已发送的最后帧发送帧后,窗口向里收缩接收到响应后,窗口向外扩张_1364994341.vsd帧0ACK1帧1ACK0帧0帧0NAK0帧0发送站接收站超时_1348384662.vsd0123452345670101EDDD23456ACK1ACK2NAK2ACK3ACK4ACK5ACK6
/
本文档为【接口与协议实验】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索