通信软件设计方法状态机程序设计与无状态协议程序设计学习教案_第1页
通信软件设计方法状态机程序设计与无状态协议程序设计学习教案_第2页
通信软件设计方法状态机程序设计与无状态协议程序设计学习教案_第3页
通信软件设计方法状态机程序设计与无状态协议程序设计学习教案_第4页
通信软件设计方法状态机程序设计与无状态协议程序设计学习教案_第5页
已阅读5页,还剩57页未读 继续免费阅读

下载本文档

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

文档简介

1、会计学1通信软件设计通信软件设计(shj)方法状态机程序设计方法状态机程序设计(shj)与无状态协议程序设计与无状态协议程序设计(shj)第一页,共62页。2第1页/共62页第二页,共62页。3如何如何(rh)(rh)编写状态编写状态机程序机程序第2页/共62页第三页,共62页。4第3页/共62页第四页,共62页。5什么(shn me)是协议?第4页/共62页第五页,共62页。6标准规范协议(xiy)私有的协议(xiy)协议就是通信规程,通信双方或多方(dufng)的信息传输约定信息传输:1、控制信息(数据);2、运载信息(数据)通信系统的核心就是协议第5页/共62页第六页,共62页。7协议(

2、xiy)分为无状态协议(xiy)与有状态协议(xiy)无状态(zhungti)协议:信息处理和历史记录无关例如 IP有状态协议:信息处理和历史记录有关例如 TCP有状态协议用状态机来表示或者状态图来表示第6页/共62页第七页,共62页。8有限有限(yuxin)(yuxin)状态机的元素状态机的元素状态协议的一个逻辑概念(ginin),规定特定状态下可以接受特定事件和执行相应动作事件PDU、时钟计数溢出、系统管理指令动作功能程序第7页/共62页第八页,共62页。9状态机简单状态机简单(jindn)(jindn)例例子子2个状态4个事件若干(rugn)动作状态S1Disconnected断开状态S

3、2Connected连接事件E4 关闭(Shutdown)-送关闭信息PDU给对方关闭时钟事件E1 本地初始化(Initialization)-送启动信息PDU给对方开启时钟事件E2 收到对方来的数据PDU(Protocol Message)-处理接收的PDU事件E3 时钟到(Timer Expiry)-定时处理第8页/共62页第九页,共62页。10如何编写这个(zh ge)状态机程序?第9页/共62页第十页,共62页。11Switch-caseSwitch-case结构结构(jigu)(jigu)方方法法switch (event) case E1: /* Initialize */If (

4、current_state = DISCONNECTED) InitializeProtocol ();current_state = CONNECTED;break; case E2: /* Protocol Messages */If (current_state = CONNECTED) ProcessMessages ();break; case E3: /* Timer Event(s) */If (current_state = CONNECTED)ProcessTimers ();break; case E4: /* Disconnect Event */If (current_

5、state = CONNECTED) ShutdownProtocol ();current_state = DISCONNECTED;break; default:logError (Invalid Event, current_state, event);break;int event;int current_stat;Event变量(binling)的数值从哪里获得?增加case语句再用switch-case结构程序变得很复杂,可读差,修改困难状态数量很多怎么吧?事件数量很多怎么吧?这些函数是那里来的?第10页/共62页第十一页,共62页。12switch-caseswitch-case

6、结构结构(jigu) + (jigu) + 主循环主循环while (1) get_event(&event);switch (event) case E1: /* Initialize */break; case E2: /* Protocol Messages */break; case E3: /* Timer Event(s) */break; case E4: /* Disconnect Event */break; default:break;获得(hud)事件判断事件根据状态情况处理事件第11页/共62页第十二页,共62页。13数据结构数据结构(sh j ji (sh j

7、 ji u)u)方法方法状态事件表矩阵(j zhn)M*N,N表示状态数量,M表示事件数量交叉点中-Action, Next StateM M事件事件N N状态状态第12页/共62页第十三页,共62页。14数据结构数据结构(sh j ji u)(sh j ji u)方法方法- -程序程序/ /* * 当前状态和事件当前状态和事件(shjin)(shjin)的入口是的入口是SetEventCurrentState SetEventCurrentState * */ /while (1) while (1) get_event(&event);get_event(&event);S

8、etEventCurrentState.Action(parameter); SetEventCurrentState.Action(parameter); CurrentState = SetEventCurrentState.next_stat; CurrentState = SetEventCurrentState.next_stat; /* 入口矩阵是SetMN */struct enter *Action();int next_state; SetSetMN;/* 函数参数 */struct parameter PDU *pdup;Environment *ep; parameter

9、parameter;第13页/共62页第十四页,共62页。15数据结构数据结构(sh j ji (sh j ji u)u)方法方法- -表表State S1DisconnectedState S2ConnectedEvent E1InitializeEvent E2Protocol MessagesEvent E3Timer EventsEvent E4DisconnectAction: LogErrorNext State = S1Action: LogErrorNext State = S1Action: LogErrorNext State = S1Action: SendStartup

10、Message, Start TimersNext State = S2Action: LogErrorNext State = S2Action: ProcessMessagesNext State = S2Action: ProcessTimersNext State = S2Action: SendShutdownMessage, Stop TimersNext State = S1第14页/共62页第十五页,共62页。16TCP的状态机是什么(shn me)?第15页/共62页第十六页,共62页。17CLOSEDESTABLISHEDLISTENCLOSE_WAITFIN_WAIT_1

11、SYN_RCVDFIN_WAIT_2CLOSINGTIME_WAITSYN_SENTLAST_ACK主动(zhdng)打开被动(bidng)打开被动(bidng)关闭主动关闭起点被动打开主动打开 发送 SYN同时打开收到 SYN,发送 SYN, ACK收到 ACK数据传送 阶段 关闭发送 FIN 关闭发送 FIN 关闭发送 FIN收到 RST 收到 SYN发送 SYN, ACK 关闭或超时收到 ACK 收到 SYN, ACK发送 ACK收到 ACK收到 ACK收到 FIN发送 ACK收到 FIN, ACK 发送 ACK收到 FIN发送 ACK同时关闭收到 FIN发送 ACK发送 SYN定时经过

12、两倍报文段寿命后关闭第16页/共62页第十七页,共62页。18设置(shzh)互斥事件队列为空?恢复(huf)互斥取出事件(shjin)事件分析和处理睡眠等待如事件队列空,则从发送队列中取队列头块根据头块的标记做TCP/IP包并向IP层传递事件分析和处理WU2PIOCWU2PDWP2UWAWI2PDWP2IWAWU2PCLWTMO执行高层的ioctl请求处理高层传来的数据修改连接接收窗口接受IP数据包修改向IP发送数据窗口接收高层关闭连接请求超时处理TCP进程主流程比如打开连接流控第17页/共62页第十八页,共62页。19如何如何(rh)(rh)编写编写IPIP程序程序第18页/共62页第十九

13、页,共62页。20IP的功能(gngnng)是什么?第19页/共62页第二十页,共62页。21数据网络怎样组成?数据网络怎样组成?Catalyst5000Cisco 7505Cisco 2509.Cisco 2509Cisco 4500-MCisco 4500-MCisco 2509服务器网管机Catalyst 2100CatalystCatalyst 2100Cisco 4500-MCisco 2509服务器网管机Catalyst 2100Catalyst 2100Catalyst 2100PCHUBHUBHUBCatalyst 210021个地市98个县PCPCPCPCPCCatalyst

14、 3000Catalyst 3000HUBHUB X.25/FRCatalyst 2900Cisco 2507Cisco 2507宜宾绵阳.省行网络中心.Catalyst 2900.PC.PCPC.PC.PC.PC.PC.PC网管机服务器第20页/共62页第二十一页,共62页。22数据包交换(jiohun)物理层数据链路层IP(OSPF/RIP)以太网络PPP串口以太(y ti)网络点到点网络第21页/共62页第二十二页,共62页。23网络接口缓冲区数据(shj)队列转发表(fbio)(路由表)IP接收(jishu)和转发接收缓冲区接收缓冲区接收缓冲区接收缓冲区接收缓冲区每个网络接口设计一个队

15、列核外进程部分接口中断处理子程序接口中断处理子程序接收缓冲区其他任务IP数据报文队列第22页/共62页第二十三页,共62页。24IP的软件包有那些(nxi)模块?第23页/共62页第二十四页,共62页。25数据包处理(chl)模块添加(tin ji)首部模块重装(zhn zhun)模块路由寻找模块分片模块IP分组IP分组IP分组TCP/IP分组TCP/IP分组,目的地址IP分组下一跳接口IP分组,下一跳IP分组重装表路由表MTU表IP软件包ARP以及数据链路层以及数据链路层TCP层层接口号接口号目的地址目的地址分片标记等分片标记等第24页/共62页第二十五页,共62页。26IPIP主程序主程序

16、1)1)while (1) while (1) 2)2)判断输入队列有判断输入队列有IPIP报文吗?报文吗?3)3)如没有,则睡眠如没有,则睡眠4)4)从输入队列中取一个从输入队列中取一个IPIP报文报文5)5)调用数据包报文处理模块调用数据包报文处理模块6)6)根据处理结果根据处理结果7)7)出错,抛弃出错,抛弃(poq)(poq)改报文,结束本次循改报文,结束本次循环环8)8)本机报文,调用重装模块本机报文,调用重装模块9)9)转发报文,调用路由寻找模块转发报文,调用路由寻找模块10)10)如存在路由,则调用下层模块如存在路由,则调用下层模块11)11) 第25页/共62页第二十六页,共6

17、2页。27数据包处理(chl)模块添加(tin ji)首部模块IP分组IP分组TCP/IP分组,目的(md)地址处理模块(参数是需要处理的IP报文)1、检查数据报文1)版本合法2)长度合法3)检验和正确4)以上之一是NO,出错返回2、若目的地址是127.x.x.x或是本地IP地址A)本机返回3、若是路由器A)TTL减1,如TTL为0则出错返回4、转发返回路由寻找模块IP分组重装模块IP分组TCP层层ARP以及数据链路层以及数据链路层第26页/共62页第二十七页,共62页。28路由寻找(xnzho)模块IP分组TCP/IP分组IP分组下一跳接口(ji ku)IP分组,下一跳路由表IP软件包ARP

18、以及以及(yj)数据链路层数据链路层TCP层层目的地址目的地址第27页/共62页第二十八页,共62页。29IP路由表 QS10.0.0.520.0.0.530.0.0.640.0.0.730.0.0.720.0.0.6R40.0.0.030.0.0.020.0.0.010.0.0.0路由器R的路由表要到达(dod)的网络下一个(y )路由器/下一跳20.0.0.530.0.0.510.0.0.540.0.0.5直接直接(zhji)30.0.0.720.0.0.5直接直接第28页/共62页第二十九页,共62页。30IP路由交换(jiohun) 路由选择的次序为:直接(zhji)交付特定主机路由选

19、择特定网络路由选择默认路由选择 第29页/共62页第三十页,共62页。31IP路由交换(jiohun) 从数据报中提取目的IP地址D;A)对路由表中的每一个项目I ,并计算网络前缀N A)若N与I的网络的地址匹配(和目的地址比较) 1)如是(r sh)网关(G出现) 使用路由表中的下一跳项目作为下一跳地址(间接交付) 2)如不是网关(G不出现) 使用分组的目的地址作为下一跳地址(直接交付) 3)把分组连同下一跳地址传送到分片模块 4)停止 B)找不到匹配,则发送给报文源ICMP差错报文 C)停止第30页/共62页第三十一页,共62页。32路由寻找(xnzho)模块IP分组TCP/IP分组IP分

20、组下一跳接口(ji ku)IP分组,下一跳路由表IP软件包ARP以及以及(yj)数据链路层数据链路层TCP层层目的地址目的地址路由寻找模块1、取得数据报文中目的地址D2、从头到尾循环检查路由表当前i1)求出D的网络地址N2)比较N和路由表的i.目的地址3)如匹配转43、如查找完成,但尚未存在匹配则1)出错返回4、从路由表i中取得出口号码5、存在路由返回第31页/共62页第三十二页,共62页。33IP软件(run jin)的关键数据结构是哪几个?第32页/共62页第三十三页,共62页。34IP数据包格式(g shi) 固定部分可变部分04816192431版 本标志生 存 时 间协 议标 识服

21、务 类 型总 长 度片 偏 移填 充首 部 检 验 和源 地 址目 的 地 址可 选 字 段 (长 度 可 变)比特首部长度数 据 部 分首部第33页/共62页第三十四页,共62页。35typedef unsigned char u_int8_t;/8位typedef unsigned short u_short; /16位struct ip_addr unsigned long IP_addr; /IP地址,占32位;struct ip_mask unsigned long IP_mask; /IP掩码,占32位;示例示例(shl)程序程序8第34页/共62页第三十五页,共62页。36str

22、uct ip_hdrunsigned short intIP_v:4; / 版本号码unsigned short intIP_hl:4; / 首部长度(chngd)u_int8_tIP_tos; / 服务类型u_shortIP_len; / 数据报文总长度(chngd)u_shortIP_id;/ 标识u_short IP_off; / 分段偏移u_int8_tIP_ttl; / 存活时间u_int8_tIP_p; / 协议号码u_shortIP_sum; / 检验和struct ip_addrIP_src,IP_dst;/ 源IP地址和目的IP地址;第35页/共62页第三十六页,共62页。3

23、7固定长度(chngd)的IP数据报文#define IP_DATA1024struct ip_datastruct ip_hdr IP_hdr;charIP_dataIP_DATA;第36页/共62页第三十七页,共62页。38输入队列:输入队列:#define INPUT_QUEUE 100struct ip_data IP_InputQueueINPUT_QUEUE;int IP_InputQueue_head, IP_InputQueue_tail;输出到低层队列:输出到低层队列:/有低层定义有低层定义(dngy),IP传输传输IP报文给低层模块报文给低层模块/程序即可程序即可输出到高层

24、队列:输出到高层队列:#define OUTPUT_QUEUE_TRAN 10struct ip_data IP_OutQueueToTranOUTPUT_QUEUE_TRAN;int IP_OutQueueToTran_head, IP_OutQueueToTran_tail;第37页/共62页第三十八页,共62页。39IP路由表 掩码掩码目的地址目的地址下一跳地址下一跳地址标志标志引用计数引用计数使用使用接口接口255.255.255.192201.21.52.121201.21.52.89U590S0.4byte4byte4byte 1byte 1int 1long 1int第38页/共

25、62页第三十九页,共62页。40IP路由表数据类型 struct routing_table struct ip_mask RT_mask;struct ip_addr RT_IP_address;struct ip_addr RT_IP_next;char RT_flag;int RT_datagram_count;long RT_user_conut;int RT_interface;掩码 - 4byte目的地址 - 4byte下一跳地址 - 4byte标记 - 1byte引用记数 - 1int使用(shyng)记数 - 1long接口号码 - 1int第39页/共62页第四十页,共62页

26、。41IP路由表变量(binling)数组 #define ROUTING_TABLE_MAX_NUMBER 10struct routing_table RoutingTableROUTING_TABLE_MAX_NUMBER;第40页/共62页第四十一页,共62页。42IP软件的关键(gunjin)函数是哪几个?第41页/共62页第四十二页,共62页。43处理模块(参数是需要处理的IP报文)1、检查数据报文1)版本合法2)长度合法3)检验(jinyn)和正确4)以上之一是NO,出错返回2、若目的地址是127.x.x.x或是本地IP地址A)本机返回3、若是路由器A)TTL减1,如TTL为0则

27、出错返回4、转发返回CheckIpData (IP报文指针)返回值: 1,合法 -1,版本错误(cuw) -2,长度错误(cuw) -3,检验和不正确IsThisMachine (IP报文指针)返回值: 1,转发 2,本机接收 -1,错误本机地址变量:ThisIPAddress路由器标记变量IsRouter值:1是路由器,0是主机第42页/共62页第四十三页,共62页。44路由寻找模块1、取得数据报文中目的地址D2、从头到尾循环检查路由表当前i1)求出D的网络地址N2)比较N和路由表的i.目的地址3)如匹配转53、如查找完成(wn chng),但尚未存在匹配则1)出错返回4、从路由表i中取得出

28、口号码5、存在路由返回Analyze(struct ip_addr *NetP, struct ip_addr *DestP)返回值: 0,不匹配(ppi) 1,匹配(ppi)第43页/共62页第四十四页,共62页。45IP软件包的模块程序(chngx)怎么写?第44页/共62页第四十五页,共62页。46IpDataProcess(struct ip_data *IpDataP) int CheckR; CheckR = CheckIpData(IpDataP); switch (CheckR) case VER_INVALID: case LENTH_INVALID: case CHECK_

29、SUM_FAILING: if (IsThisMachine(IpDataP-IP_Dst) return THIS_MACHINE; if (IsRouter) int ttl = -IpDataP-IP_ttl; if (ttl = 0) rerurn PROCESS_IPDATA_TTL; CheckSum(IpDataP); return FORWARD;处理模块(参数是需要处理的IP报文)1、检查数据报文1)版本合法2)长度(chngd)合法3)检验和正确4)以上之一是NO,出错返回2、若目的地址是127.x.x.x或是本地IP地址A)本机返回3、若是路由器A)TTL减1,如TTL为

30、0则出错返回4、转发返回第45页/共62页第四十六页,共62页。47IpDataProcess(struct ip_data *IpDataP) int CheckR; CheckR = CheckIpData(IpDataP); switch (CheckR) case VER_INVALID: ret = PROCESS_IPDATA_VER; goto leave; case LENTH_INVALID: ret = PROCESS_IPDATA_LENTH; goto leave; case CHECK_SUM_FAILING: ret = PROCESS_IPDATA_CHECK_S

31、UM; goto leave; if (IsThisMachine(IpDataP-IP_Dst) return THIS_MACHINE; if (IsRouter) int ttl = -IpDataP-IP_ttl; if (ttl = 0) rer = PROCESS_IPDATA_TTL; goto leave; CheckSum(IpDataP); ret = PROCESS_IPDATA_OK; Leave: return ret第46页/共62页第四十七页,共62页。48IsForwardOrdiscard (struct ip_data *IpDataP, int *IfNo

32、P); int RoutingTableIndex; struct ip_addr Dest; bcopy(&Dest, IpDataP-IP_dst, sizeof Dest); for (RoutingTableIndex = 0; 最后最后(zuhu) struct ip_addr Net = resolve(掩码掩码); if (Analyze(Net, 路由表路由表) *IfNoP = RoutingTable.RT_interface; return HAVE_PATH; return PATH_ERROR;路由寻找模块1、取得数据报文中目的地址(dzh)D2、从头到尾循环

33、检查路由表当前i1)求出网络地址(dzh)N2)比较N和路由表的i.目的地址(dzh)3)如匹配转53、如查找完成,但尚未存在匹配则1)出错返回4、从路由表i中取得出口号码5、存在路由返回第47页/共62页第四十八页,共62页。49IsForwardOrdiscard (struct ip_data *IpDataP, int *IfNoP); int RoutingTableIndex; struct ip_addr Dest; bcopy(&Dest, IpDataP-IP_dst, sizeof Dest); for (RoutingTableIndex = 0; Routing

34、TableIndex RTLastIndex; RoutingTableIndex+) struct ip_addr Net; Resolve(&RoutingTableRoutingTableIndex.RT_mask, &Dest, &Net); if (Analyze(Net, RoutingTableRoutingTableIndex.RT_IP_address) *IfNOP = RoutingTableRoutingTableIndex.RT_interface; return HAVE_PATH; return PATH_ERROR;第48页/共62页第四

35、十九页,共62页。50IsThisMachine(struct ip_addr *DestP) if (*DestP = 127) return 1; return Analyze(&ThisIPAddress, DestP);Analyze(struct ip_addr *NetP, struct ip_addr *DestP) int i; char *d = (char *)DestP; char *n = (char *) NetP; for (i = 0; i siezof *DestP; i+) if (*d+ != *n+) return 0; return 1;第49页

36、/共62页第五十页,共62页。51Resolve(struct ip_mask *MaskP, struct ip_addr *DestP, struct ip_addr *NetP) int i; char *d = (char *) DestP; char *m = (char *) MaskP; char *n = (char *) NetP for (i = 0; i siezof *DestP; i+) *n+ = (*d+) & (*m+);第50页/共62页第五十一页,共62页。52IP软件包中队列操作(cozu)如何写?第51页/共62页第五十二页,共62页。53IP数

37、据IP头IP数据IP头IP数据IP头IP数据IP头队列(duli)首下标队列(duli)尾下标取IP数据报文不释放空间返回队列首下标的地址放IP数据报文把数据报文拷贝到队列下标指示的地址空间中;队列下标+;if (队列下标到最大值)队列下标 = 0;释放空间队列首下标+;if (下标到最大值) 队列下标 = 0;第52页/共62页第五十三页,共62页。54输入队列输入队列(duli):#define INPUT_QUEUE 100struct ip_data IP_InputQueueINPUT_QUEUE;int IP_InputQueue_head, IP_InputQueue_tail;

38、输出到低层队列输出到低层队列(duli):/低层定义低层定义输出到高层队列输出到高层队列(duli):#define OUTPUT_QUEUE_TRAN 10struct ip_data IP_OutQueueToTranOUTPUT_QUEUE_TRAN;int IP_OutQueueToTran_head, IP_OutQueueToTran_tail;第53页/共62页第五十四页,共62页。55输入队列:输入队列:#define INPUT_QUEUE 100struct ip_data IP_InputQueueINPUT_QUEUE;int IP_InputQueue_head, I

39、P_InputQueue_tail;从输入队列释放从输入队列释放(shfng)一个一个IP数据报文空间操作数据报文空间操作ReleaseIP_InputQueue() IP_InputQueue_head+; if (IP_InputQueue_head = INPUT_QUEUE) IP_InputQueue_head = 0;第54页/共62页第五十五页,共62页。56输入队列:输入队列:#define INPUT_QUEUE 100struct ip_data IP_InputQueueINPUT_QUEUE;int IP_InputQueue_head, IP_InputQueue_t

40、ail;从输入队列取一个从输入队列取一个IP数据报文操作数据报文操作不释放不释放(shfng),不拷贝,不拷贝struct ip_data *GetIPDataFromInputQueue() return &IP_InputQueueIP_InputQueue_head;第55页/共62页第五十六页,共62页。57输入队列:输入队列:#define INPUT_QUEUE 100struct ip_data IP_InputQueueINPUT_QUEUE;int IP_InputQueue_head, IP_InputQueue_tail;放放IP数据报文到输入队列操作数据报文到输入队列操作(cozu)保证有空间!保证有空间!PutIPDataToIP_InputQueue(struct ip_data *IPDataP) reigster int index = IP_InputQueue_tail; bcopy(IPDataP, IP_InputQueueind

温馨提示

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

评论

0/150

提交评论