您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 网络软件设计10——有状态设计
网络软件设计服务器的有状态与无状态有状态协议设计制作主讲段景山段景山2状态由服务器维护的,关于服务器与客户机正在进行的交互的信息称为状态“信息”不是指服务器和客户机交互的数据,而是关于交互过程本身有状态服务器保存状态信息的服务器程序例:认证服务器需要记录与客户交互的状态--正在认证(等待用户名、等待口令)、已认证等无状态服务器不保存状态信息的服务器程序例:聊天应用有状态与无状态服务器段景山3有状态服务为什么要求设计有状态服务器任务需求可以减少报文开销(利用报文间的相关性)有状态服务器面临的问题增加实现的复杂程度需要复杂的协议控制系统在多个状态下转换时,可能因错误事件而导致:进入非期望状态、死锁、崩溃可以设计有限状态机来指导软件实现段景山4无状态是一个协议问题为什么要设计无状态服务任务需求服务实现简单,可靠性强一个报文的意义不依赖先前的报文--状态的依赖性究竟网络应用软件是有状态的还是无状态的从系统的角度,系统是“无状态”的系统能不断为各次通信服务从功能实现角度,复杂的通信应采用有状态方法设计段景山5有限状态机一种直观、全局、准确的协议描述方法状态转换事件动作缺点时序性不强段景山6有限状态机的基本结构状态:实体有有限个状态每一时刻,实体只处于其中一个状态事件:事件引起实体产生动作,如收到PDU、定时器到时等事件按发生的顺序排在事件队列中,等待处理事件可能有附加条件动作:处理队列中的一个事件,转移到下一状态不同状态下,对同一事件可能有不同的处理方法最简动作:忽略事件,保持状态(图中可省略不画)FSM事件状态1状态2事件e1/动作a1事件e2/动作a2事件e3/动作a3段景山7例以停等协议为例,讲解利用有限状态机实现有状态设计发送方发送完一个数据包后,需得到接收方的确认才能发送下一个数据包若接收方超时没有确认,发送方将重传段景山8停等协议的状态机(1)状态机(Ns,Nr)发送接收递交上层DU协议实体PDU、ACKTo:对等实体PDU、ACKFrom:对等实体状态机的位置段景山9停等协议(2)状态的确定0ACK1ACK发送方接收方准备发送帧1准备发送帧0等待帧1等待帧0段景山10停等协议状态机准备发送帧0准备发送帧1收到ACK并准备好一个帧发送帧0收到ACK并准备好一帧数据发送帧1超时重发帧0超时重发帧1等待接收帧0等待接收帧1收到帧0发送ACK帧0上交收到帧1发送ACK帧1上交接收方发送方段景山11有限状态机小结状态状态是复合的由多个要素形成如:准备发送帧0状态刚发送了帧1上层有一个待发的SDU收到了对前一帧的应答等待刚发送的帧的应答还没有超时系统的状态是稳定的不触发就不变化制定状态的结果可能不唯一状态1状态2-/-x段景山12有限状态机小结事件转换的输入条件若是别的状态的动作造成转换,则跃迁的状态是不稳定状态,不应出现可以是对等实体的动作状态机一次只处理一个事件如果有必要处理多个事件,应定义为复合事件状态1状态2事件1/动作1事件2(动作1)/动作2,动作2事件1,事件2/动作3事件1/动作1事件2/动作2状态3状态1事件3/动作3段景山13有限状态机小结动作动作一定由事件触发不触发就自发产生动作是不稳定状态某些转换不一定产生动作,动作不一定伴随状态转换触发不一定有动作产生,不一定造成状态转换状态1-/动作1事件1/-x状态1事件2/动作2事件3/-段景山14有限状态机的作用(1)指导协议实现根据有限状态机形成状态转移表状态事件动作命令:Open事件2事件3…事件n关闭处理发送:ConnReq……下一状态连接建立…连接建立处理……下一状态状态n处理下一状态状态转移表段景山15状态转移表停等协议的状态转移表准备发送帧0准备发送帧1发送帧0收到ACK发送帧1收到ACK重发帧0超时重发帧1超时状态事件动作事件1事件2…事件n状态1处理……下一状态…状态2处理…下一状态状态n处理下一状态收到ACK超时准备发帧0处理发送帧0重发帧1下一状态准备发帧1/准备发帧1处理发送帧1重发帧0下一状态准备发帧0/段景山16状态转移表停等协议的状态转移表等待帧0等待帧1发送ACK收到帧0发送ACK收到帧1状态事件动作事件1事件2…事件n状态1处理……下一状态…状态2处理…下一状态状态n处理下一状态收到帧0收到帧1等待帧0处理发送ACK/下一状态等待帧1/等待帧1处理发送ACK下一状态等待帧0段景山17fsm程序框架根据状态转移表形成fsm程序可能的框架fsm(当前状态,事件){switch(事件){case事件1:case事件2:default:ignore;}returnnext_state;}action1;next_state=xxx;……main(){state=initial;while(1){waiteforaevent;state=fsm(state,event);}}fsm.cif(当前状态==X){}段景山18改进的fsm程序框架main(){state=initial;while(1){waiteforaevent;switch(state){caseX:state=x_fsm(event);caseY:state=y_fsm(event);…}}}x_fsm(事件){switch(事件){case事件1:case事件2:default:ignore;}returnnext_state;}action1;next_state=xxx;……}段景山19有限状态机的设计事件的产生停等协议的事件接收到数据:Information、ACK定时器利用select()接收到数据read事件——进一步判决为Information、ACK等定时selecttimeout超时+计时例:定时器为5秒,timeout可设为5秒,如果select返回值为0则认为超时或者timeout设为1秒,连续五次select返回值为0,则认为超时。段景山20有限状态机的设计main(){state=initial;while(1){waiteforaevent;switch(state){caseX:state=x_fsm(event);caseY:state=y_fsm(event);…}}}main(){timeout=5;while(1){retval=select(…,timeout);if(retval==0){event=TIMEOUT;}elseif(FD_ISSET(s,read){checkthedatatype;event=datatype;}switch(state){…}}}段景山21停等协议的有限状态机设计事件定义#defineEVENT_RECV01#defineEVENT_RECV12#defineEVENT_ACK3#defineEVENT_TIME4状态定义#defineSTATE_SEND01#defineSTATE_SEND12#defineSTATE_RECV03#defineSTATE_RECV14段景山22停等协议的有限状态机设计PDU设计事件产生retval=select(…,timeout);if(retval==0){event=TIMEOUT;}elseif(FD_ISSET(s,read){checkthedatatype;event=datatype;}structPDU{chartype;charsequence_num;charlen;chardata[100];}sendbuf,recvbuf;recv(s,&recvbuf,len,0);if(recvbuf.type==FRAME_ACK){event=EVENT_ACK;}else{if(recvbuf.sequence_num==0){event=EVENT_RECV0;event=EVENT_RECV1;}}段景山停等协议的有限状态机设计停等协议缓冲区设计发送方:单个帧的发送缓冲以备超时重传时使用structPDUsendbuf;接收方:单个帧的接收缓冲structPDUrecvbuf;23段景山事件处理(例:发送状态)24switch(state){caseSTATE_SEND0:state=S0_fsm(event);break;caseSTATE_SEND1:state=S1_fsm(event);break;}25intS0_fsm(intevent){intnext_state;next_state=STATE_SEND0;switch(event){caseEVENT_ACK:sendbuf.len=fread(sendbuf.data,sizeof(char),sizeof(sendbuf.data),Fid);sendbuf.sequence_num=1;sendbuf.type=FRAME_DATA;send(sock,(char*)&sendbuf,sendbuf.len+HEADSIZE,0);next_state=STATE_SEND1;break;caseEVENT_TIMEOUT://resendthebufsend(sock,(char*)&sendbuf,sendbuf.len+HEADSIZE,0);break;}returnnext_state;}段景山26停等协议的有限状态机设计事件处理(例,接收状态)switch(state){caseSTATE_RECV0:state=R0_fsm(event);break;caseSTATE_RECV1:state=R1_fsm(event);break;}intR0_fsm(intevent){intnext_state;next_state=STATE_RECV0;switch(event){caseEVENT_RECV0://duplicateframeProgramLog(Dicardframe0,Duplicate);//sendacksendbuf.type=FRAME_ACK;sendbuf.len=3;send(ns,(char*)&sendbuf,HEADSIZE,0);caseEVENT_RECV1:fwrite(recvbuf.data,sizeof(char),recvbuf.len,Fid);//sendackbacksendbuf.type=FRAME_ACK;sendbuf.len=3;send(ns,(char*)&sendbuf,HEADSIZE,0);next_state=STATE_RECV1;break;}returnnext_state;}段景山停等协议的有限状态机设计完善细节起始状态第一个帧的发送是“没有”条件触发的结束状态接收方需要知道还有没有新的数据28段景山案例:某嵌入式终端主控程序设计需求界面控制29段景山30段景山需求功能控制31段景山基于状态机的主控设计主程序架构32段景山事件驱动基本架构33段景山状态设计34序号名称说明界面宏定义1空闲状态系统进入的初始状态,输入动作被取消时的状态;欢迎页面ST_IDLE2设置状态用户按设置键,进入设置状态,具有多个子状态;设置页面ST_SET3编辑状态用户按编辑键,进入编辑状态;编辑页面ST_EDIT4等待回显状态向上位机发送数据后,等待上位机回显信息的状态。等待页面ST_WAIT5回显状态得到上位机数据,进行显示。有多个子状态;回显页面ST_SYSINFO段景山状态转移图35起始等待回显空闲回显设置编辑收到下传数据/显示相应内容编辑键/显示编辑内容设置键/显示设置页面功能键或RFID扫描/上传、显示等待页面设置完成或取消/显示欢迎页面取消编辑/显示欢迎页面编辑键/更新编辑内容编辑键/显示编辑内容功能键或RFID扫描/上传、显示等待页面编辑
本文标题:网络软件设计10——有状态设计
链接地址:https://www.777doc.com/doc-4800724 .html