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

下载本文档

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

文档简介

1、会计学1通信软件设计方法状态机程序设计与无通信软件设计方法状态机程序设计与无状态协议程序设计状态协议程序设计2第1页/共62页3如何编写状态机程序如何编写状态机程序第2页/共62页4第3页/共62页5什么是协议?第4页/共62页6标准规范协议私有的协议协议就是通信规程,通信双方或多方的信息传输约定信息传输:1、控制信息(数据);2、运载信息(数据)通信系统的核心就是协议第5页/共62页7协议分为无状态协议与有状态协议无状态协议:信息处理和历史记录无关例如 IP有状态协议:信息处理和历史记录有关例如 TCP有状态协议用状态机来表示或者状态图来表示第6页/共62页8有限状态机的元素有限状态机的元素

2、状态协议的一个逻辑概念,规定特定状态下可以接受特定事件和执行相应动作事件PDU、时钟计数溢出、系统管理指令动作功能程序第7页/共62页9状态机简单例子状态机简单例子2个状态4个事件若干动作状态S1Disconnected断开状态S2Connected连接事件E4 关闭(Shutdown)-送关闭信息PDU给对方关闭时钟事件E1 本地初始化(Initialization)-送启动信息PDU给对方开启时钟事件E2 收到对方来的数据PDU(Protocol Message)-处理接收的PDU事件E3 时钟到(Timer Expiry)-定时处理第8页/共62页10如何编写这个状态机程序?第9页/共6

3、2页11Switch-caseSwitch-case结构方法结构方法switch (event) case E1: /* Initialize */If (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 =

4、 CONNECTED)ProcessTimers ();break; case E4: /* Disconnect Event */If (current_state = CONNECTED) ShutdownProtocol ();current_state = DISCONNECTED;break; default:logError (Invalid Event, current_state, event);break;int event;int current_stat;Event变量的数值从哪里获得?增加case语句再用switch-case结构程序变得很复杂,可读差,修改困难状态数量

5、很多怎么吧?事件数量很多怎么吧?这些函数是那里来的?第10页/共62页12switch-caseswitch-case结构结构 + + 主循环主循环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;获得事件判断事件根据状态情况处理事件第1

6、1页/共62页13数据数据结构方法结构方法状态事件表矩阵M*N,N表示状态数量,M表示事件数量交叉点中-Action, Next StateM M事件事件N N状态状态第12页/共62页14数据数据结构方法结构方法- -程序程序/ /* * 当前状态和事件的入口是当前状态和事件的入口是SetEventCurrentState SetEventCurrentState * */ /while (1) while (1) get_event(&event);get_event(&event);SetEventCurrentState.Action(parameter); SetEv

7、entCurrentState.Action(parameter); CurrentState = SetEventCurrentState.next_stat; CurrentState = SetEventCurrentState.next_stat; /* 入口矩阵是SetMN */struct enter *Action();int next_state; SetSetMN;/* 函数参数 */struct parameter PDU *pdup;Environment *ep; parameterparameter;第13页/共62页15数据数据结构方法结构方法- -表表State

8、S1DisconnectedState S2ConnectedEvent E1InitializeEvent E2Protocol MessagesEvent E3Timer EventsEvent E4DisconnectAction: LogErrorNext State = S1Action: LogErrorNext State = S1Action: LogErrorNext State = S1Action: SendStartupMessage, Start TimersNext State = S2Action: LogErrorNext State = S2Action: P

9、rocessMessagesNext State = S2Action: ProcessTimersNext State = S2Action: SendShutdownMessage, Stop TimersNext State = S1第14页/共62页16TCP的状态机是什么?第15页/共62页17CLOSEDESTABLISHEDLISTENCLOSE_WAITFIN_WAIT_1SYN_RCVDFIN_WAIT_2CLOSINGTIME_WAITSYN_SENTLAST_ACK主动打开被动打开被动关闭主动关闭起点被动打开主动打开 发送 SYN同时打开收到 SYN,发送 SYN, AC

10、K收到 ACK数据传送 阶段 关闭发送 FIN 关闭发送 FIN 关闭发送 FIN收到 RST 收到 SYN发送 SYN, ACK 关闭或超时收到 ACK 收到 SYN, ACK发送 ACK收到 ACK收到 ACK收到 FIN发送 ACK收到 FIN, ACK 发送 ACK收到 FIN发送 ACK同时关闭收到 FIN发送 ACK发送 SYN定时经过两倍报文段寿命后关闭第16页/共62页18设置互斥事件队列为空?恢复互斥取出事件事件分析和处理睡眠等待如事件队列空,则从发送队列中取队列头块根据头块的标记做TCP/IP包并向IP层传递事件分析和处理WU2PIOCWU2PDWP2UWAWI2PDWP2

11、IWAWU2PCLWTMO执行高层的ioctl请求处理高层传来的数据修改连接接收窗口接受IP数据包修改向IP发送数据窗口接收高层关闭连接请求超时处理TCP进程主流程比如打开连接流控第17页/共62页19如何编写如何编写IPIP程序程序第18页/共62页20IP的功能是什么?第19页/共62页21数据网络怎样组成?数据网络怎样组成?Catalyst5000Cisco 7505Cisco 2509.Cisco 2509Cisco 4500-MCisco 4500-MCisco 2509服务器网管机Catalyst 2100CatalystCatalyst 2100Cisco 4500-MCisco

12、 2509服务器网管机Catalyst 2100Catalyst 2100Catalyst 2100PCHUBHUBHUBCatalyst 210021个地市98个县PCPCPCPCPCCatalyst 3000Catalyst 3000HUBHUB X.25/FRCatalyst 2900Cisco 2507Cisco 2507宜宾绵阳.省行网络中心.Catalyst 2900.PC.PCPC.PC.PC.PC.PC.PC网管机服务器第20页/共62页22数据包交换物理层数据链路层IP(OSPF/RIP)以太网络PPP串口以太网络点到点网络第21页/共62页23网络接口缓冲区数据队列转发表(

13、路由表)IP接收和转发接收缓冲区接收缓冲区接收缓冲区接收缓冲区接收缓冲区每个网络接口设计一个队列核外进程部分接口中断处理子程序接口中断处理子程序接收缓冲区其他任务IP数据报文队列第22页/共62页24IP的软件包有那些模块?第23页/共62页25数据包处理模块添加首部模块重装模块路由寻找模块分片模块IP分组IP分组IP分组TCP/IP分组TCP/IP分组,目的地址IP分组下一跳接口IP分组,下一跳IP分组重装表路由表MTU表IP软件包ARP以及数据链路层以及数据链路层TCP层层接口号接口号目的地址目的地址分片标记等分片标记等第24页/共62页26IPIP主程序主程序1)1)while (1)

14、while (1) a)a)判断判断输入队列输入队列有有IPIP报文吗?报文吗?如没有,则睡眠如没有,则睡眠b)b)从从输入队列输入队列中取一个中取一个IPIP报文报文c)c)调用调用数据包报文处理模块数据包报文处理模块d)d)根据处理结果根据处理结果出错,抛弃改报文,结束本次循出错,抛弃改报文,结束本次循环环本机报文,调用本机报文,调用重装模块重装模块转发报文,调用转发报文,调用路由寻找模块路由寻找模块I.I.如存在路由,则调用如存在路由,则调用下层模块下层模块 第25页/共62页27数据包处理模块添加首部模块IP分组IP分组TCP/IP分组,目的地址处理模块(参数是需要处理的IP报文)1、

15、检查数据报文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页28路由寻找模块IP分组TCP/IP分组IP分组下一跳接口IP分组,下一跳路由表IP软件包ARP以及数据链路层以及数据链路层TCP层层目的地址目的地址第27页/共62页29IP路由表 QS10.0.0.520.0.0.530.0.0.640.0.0.730.0.0.720.0.0.6R40.0.0

16、.030.0.0.020.0.0.010.0.0.0路由器R的路由表要到达的网络下一个路由器/下一跳20.0.0.530.0.0.510.0.0.540.0.0.5直接直接30.0.0.720.0.0.5直接直接第28页/共62页30IP路由交换 路由选择的次序为:直接交付特定主机路由选择特定网络路由选择默认路由选择 第29页/共62页31IP路由交换 从数据报中提取目的IP地址D;A)对路由表中的每一个项目I ,并计算网络前缀N A)若N与I的网络的地址匹配(和目的地址比较) 1)如是网关(G出现) 使用路由表中的下一跳项目作为下一跳地址(间接交付) 2)如不是网关(G不出现) 使用分组的目

17、的地址作为下一跳地址(直接交付) 3)把分组连同下一跳地址传送到分片模块 4)停止 B)找不到匹配,则发送给报文源ICMP差错报文 C)停止第30页/共62页32路由寻找模块IP分组TCP/IP分组IP分组下一跳接口IP分组,下一跳路由表IP软件包ARP以及数据链路层以及数据链路层TCP层层目的地址目的地址路由寻找模块1、取得数据报文中目的地址D2、从头到尾循环检查路由表当前i1)求出D的网络地址N2)比较N和路由表的i.目的地址3)如匹配转43、如查找完成,但尚未存在匹配则1)出错返回4、从路由表i中取得出口号码5、存在路由返回第31页/共62页33IP软件的关键数据结构是哪几个?第32页/

18、共62页34IP数据包格式 固定部分可变部分04816192431版 本标志生 存 时 间协 议标 识服 务 类 型总 长 度片 偏 移填 充首 部 检 验 和源 地 址目 的 地 址可 选 字 段 (长 度 可 变)比特首部长度数 据 部 分首部第33页/共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掩码,占3

19、2位;示例程序示例程序8第34页/共62页36struct ip_hdrunsigned short intIP_v:4; / 版本号码unsigned short intIP_hl:4; / 首部长度u_int8_tIP_tos; / 服务类型u_shortIP_len; / 数据报文总长度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页

20、37固定长度的IP数据报文#define IP_DATA1024struct ip_datastruct ip_hdr IP_hdr;charIP_dataIP_DATA;第36页/共62页38输入队列:输入队列:#define INPUT_QUEUE 100struct ip_data IP_InputQueueINPUT_QUEUE;int IP_InputQueue_head, IP_InputQueue_tail;输出到低层队列:输出到低层队列:/有低层定义,IP传输IP报文给低层模块/程序即可输出到高层队列:输出到高层队列:#define OUTPUT_QUEUE_TRAN 10st

21、ruct ip_data IP_OutQueueToTranOUTPUT_QUEUE_TRAN;int IP_OutQueueToTran_head, IP_OutQueueToTran_tail;第37页/共62页39IP路由表 掩码掩码目的地址目的地址下一跳地址下一跳地址标志标志引用计数引用计数使用使用接口接口255.255.255.192201.21.52.121201.21.52.89U590S0.4byte4byte4byte 1byte 1int 1long 1int第38页/共62页40IP路由表数据类型 struct routing_table struct ip_mask R

22、T_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使用记数 - 1long接口号码 - 1int第39页/共62页41IP路由表变量数组 #define ROUTING_TABLE_MAX_NUMBER 10struct routing_table RoutingTabl

23、eROUTING_TABLE_MAX_NUMBER;第40页/共62页42IP软件的关键函数是哪几个?第41页/共62页43处理模块(参数是需要处理的IP报文)1、检查数据报文1)版本合法2)长度合法3)检验和正确4)以上之一是NO,出错返回2、若目的地址是127.x.x.x或是本地IP地址A)本机返回3、若是路由器A)TTL减1,如TTL为0则出错返回4、转发返回CheckIpData (IP报文指针)返回值: 1,合法 -1,版本错误 -2,长度错误 -3,检验和不正确IsThisMachine (IP报文指针)返回值: 1,转发 2,本机接收 -1,错误本机地址变量:ThisIPAddr

24、ess路由器标记变量IsRouter值:1是路由器,0是主机第42页/共62页44路由寻找模块1、取得数据报文中目的地址D2、从头到尾循环检查路由表当前i1)求出D的网络地址N2)比较N和路由表的i.目的地址3)如匹配转53、如查找完成,但尚未存在匹配则1)出错返回4、从路由表i中取得出口号码5、存在路由返回Analyze(struct ip_addr *NetP, struct ip_addr *DestP)返回值: 0,不匹配 1,匹配第43页/共62页45IP软件包的模块程序怎么写?第44页/共62页46IpDataProcess(struct ip_data *IpDataP) int

25、 CheckR; CheckR = CheckIpData(IpDataP); switch (CheckR) case VER_INVALID: case LENTH_INVALID: case CHECK_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;处理模块(参数是需要处理

26、的IP报文)1、检查数据报文1)版本合法2)长度合法3)检验和正确4)以上之一是NO,出错返回2、若目的地址是127.x.x.x或是本地IP地址A)本机返回3、若是路由器A)TTL减1,如TTL为0则出错返回4、转发返回第45页/共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 =

27、 PROCESS_IPDATA_LENTH; goto leave; case CHECK_SUM_FAILING: ret = PROCESS_IPDATA_CHECK_SUM; 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:

28、 return ret第46页/共62页48IsForwardOrdiscard (struct ip_data *IpDataP, int *IfNoP); int RoutingTableIndex; struct ip_addr Dest; bcopy(&Dest, IpDataP-IP_dst, sizeof Dest); for (RoutingTableIndex = 0; 最后) struct ip_addr Net = resolve(掩码); if (Analyze(Net, 路由表) *IfNoP = RoutingTable.RT_interface; retur

29、n HAVE_PATH; return PATH_ERROR;路由寻找模块1、取得数据报文中目的地址D2、从头到尾循环检查路由表当前i1)求出网络地址N2)比较N和路由表的i.目的地址3)如匹配转53、如查找完成,但尚未存在匹配则1)出错返回4、从路由表i中取得出口号码5、存在路由返回第47页/共62页49IsForwardOrdiscard (struct ip_data *IpDataP, int *IfNoP); int RoutingTableIndex; struct ip_addr Dest; bcopy(&Dest, IpDataP-IP_dst, sizeof Dest

30、); for (RoutingTableIndex = 0; RoutingTableIndex RTLastIndex; RoutingTableIndex+) struct ip_addr Net; Resolve(&RoutingTableRoutingTableIndex.RT_mask, &Dest, &Net); if (Analyze(Net, RoutingTableRoutingTableIndex.RT_IP_address) *IfNOP = RoutingTableRoutingTableIndex.RT_interface; return HA

31、VE_PATH; return PATH_ERROR;第48页/共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+ != *

32、n+) return 0; return 1;第49页/共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页52IP软件包中队列操作如何写?第51页/共62页53IP数据IP头IP数据IP头

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

34、fine OUTPUT_QUEUE_TRAN 10struct ip_data IP_OutQueueToTranOUTPUT_QUEUE_TRAN;int IP_OutQueueToTran_head, IP_OutQueueToTran_tail;第53页/共62页55输入队列:输入队列:#define INPUT_QUEUE 100struct ip_data IP_InputQueueINPUT_QUEUE;int IP_InputQueue_head, IP_InputQueue_tail;从输入队列释放一个IP数据报文空间操作ReleaseIP_InputQueue() IP_In

35、putQueue_head+; if (IP_InputQueue_head = INPUT_QUEUE) IP_InputQueue_head = 0;第54页/共62页56输入队列:输入队列:#define INPUT_QUEUE 100struct ip_data IP_InputQueueINPUT_QUEUE;int IP_InputQueue_head, IP_InputQueue_tail;从输入队列取一个IP数据报文操作不释放,不拷贝struct ip_data *GetIPDataFromInputQueue() return &IP_InputQueueIP_InputQueue_head;第55页/共62页57输入队列:输入队列:#define INPUT_QUEUE 100struct ip_data IP_InputQueueINPUT_QUEUE;int IP_InputQueue_head, IP_InputQueue_tail;放IP数据报文到输入队列操作保证有空间!PutIPDataToIP_InputQueue(struct ip_data *IPDataP) reigster int index = IP_InputQueue_tail; bcopy(IPDataP, IP_Input

温馨提示

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

评论

0/150

提交评论