通信软件设计方法杨雄编写二零零九年四月成都信息工程学院1讲授内容1)LINUX概况2)LINUX下C语言程序编译和调试2.1)LINUX开发环境学习(实验)3)通信系统和通信软件4)基于TCP-IP的主机到主机通信软件示例4.1)SOCKET程序设计(实验)5)有状态与无状态通信协议程序设计6)LINUX内核程序设计7)低层232接口通信程序设计8)设计一个简单链路层以及程序8.1)IP软件和链路层软件设计(实验)成都信息工程学院2本讲重点问题如何编写状态机程序成都信息工程学院3第五讲有状态与无状态通信协议程序设计•协议与状态机•状态机程序设计•IP转发程序设计成都信息工程学院4协议与状态机什么是协议?成都信息工程学院5协议与状态机•标准规范协议•私有的协议协议就是通信规程,通信双方或多方的信息传输约定信息传输:1、控制信息(数据);2、运载信息(数据)通信系统的核心就是协议成都信息工程学院6协议与状态机协议分为无状态协议与有状态协议无状态协议:信息处理和历史记录无关例如IP有状态协议:信息处理和历史记录有关例如TCP有状态协议用状态机来表示或者状态图来表示成都信息工程学院7协议与状态机有限状态机的元素•状态协议的一个逻辑概念,规定特定状态下可以接受特定事件和执行相应动作•事件PDU、时钟计数溢出、系统管理指令•动作功能程序成都信息工程学院8协议与状态机状态机简单例子2个状态4个事件若干动作状态S1Disconnected断开状态S2Connected连接事件E4–关闭(Shutdown)--------------------------------送关闭信息PDU给对方关闭时钟事件E1–本地初始化(Initialization)------------------------------送启动信息PDU给对方开启时钟事件E2–收到对方来的数据PDU(ProtocolMessage)------------------------------处理接收的PDU事件E3–时钟到(TimerExpiry)------------------------------定时处理成都信息工程学院9协议与状态机如何编写这个状态机程序?成都信息工程学院10状态机程序设计–示例6Switch-case结构方法switch(event){caseE1:/*Initialize*/If(current_state==DISCONNECTED){InitializeProtocol();current_state=CONNECTED;}break;caseE2:/*ProtocolMessages*/If(current_state==CONNECTED)ProcessMessages();break;caseE3:/*TimerEvent(s)*/If(current_state==CONNECTED)ProcessTimers();break;caseE4:/*DisconnectEvent*/If(current_state==CONNECTED){ShutdownProtocol();current_state=DISCONNECTED;}break;default:logError(InvalidEvent,current_state,event);break;}intevent;intcurrent_stat;Event变量的数值从哪里获得?增加case语句再用switch-case结构程序变得很复杂,可读差,修改困难状态数量很多怎么吧?事件数量很多怎么吧?这些函数是那里来的?成都信息工程学院11状态机程序设计switch-case结构+主循环……………while(1){get_event(&event);switch(event){caseE1:/*Initialize*/……break;caseE2:/*ProtocolMessages*/………break;caseE3:/*TimerEvent(s)*/…………break;caseE4:/*DisconnectEvent*/…break;default:……break;}}………………获得事件判断事件根据状态情况处理事件成都信息工程学院12状态机程序设计数据结构方法状态事件表矩阵M*N,N表示状态数量,M表示事件数量交叉点中--{Action,NextState}M事件N状态成都信息工程学院13状态机程序设计–示例7数据结构方法-程序/*当前状态和事件的入口是Set[Event][CurrentState]*/while(1){get_event(&event);Set[Event][CurrentState].Action(parameter);CurrentState=Set[Event][CurrentState].next_stat;}/*入口矩阵是Set[M][N]*/structenter{*Action();intnext_state;}Set[M][N];/*函数参数*/structparameter{PDU*pdup;Environment*ep;}parameter;成都信息工程学院14状态机程序设计数据结构方法-表StateS1DisconnectedStateS2ConnectedEventE1InitializeEventE2ProtocolMessagesEventE3TimerEventsEventE4DisconnectAction:LogErrorNextState=S1Action:LogErrorNextState=S1Action:LogErrorNextState=S1Action:SendStartupMessage,StartTimersNextState=S2Action:LogErrorNextState=S2Action:ProcessMessagesNextState=S2Action:ProcessTimersNextState=S2Action:SendShutdownMessage,StopTimersNextState=S1成都信息工程学院15协议与状态机TCP的状态机是什么?成都信息工程学院16TCP的有限状态机CLOSEDESTABLISHEDLISTENCLOSE_WAITFIN_WAIT_1SYN_RCVDFIN_WAIT_2CLOSINGTIME_WAITSYN_SENTLAST_ACK主动打开被动打开被动关闭主动关闭起点被动打开主动打开发送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定时经过两倍报文段寿命后关闭成都信息工程学院17设置互斥事件队列为空?恢复互斥取出事件事件分析和处理睡眠等待如事件队列空,则从发送队列中取队列头块根据头块的标记做TCP/IP包并向IP层传递事件分析和处理WU2PIOCWU2PDWP2UWAWI2PDWP2IWAWU2PCLWTMO执行高层的ioctl请求处理高层传来的数据修改连接接收窗口接受IP数据包修改向IP发送数据窗口接收高层关闭连接请求超时处理TCP进程主流程比如打开连接流控成都信息工程学院18本章重点问题如何编写IP程序成都信息工程学院19第五讲有状态与无状态通信协议程序设计IP的功能是什么?成都信息工程学院20通信网络系统数据网络怎样组成?Catalyst5000Cisco7505Cisco2509........................Cisco2509Cisco4500-MCisco4500-MCisco2509服务器网管机Catalyst2100CatalystCatalyst2100Cisco4500-MCisco2509服务器网管机Catalyst2100Catalyst2100Catalyst2100PCHUBHUBHUBCatalyst210021个地市98个县PCPCPCPCPCCatalyst3000Catalyst3000HUBHUBX.25/FRCatalyst2900Cisco2507Cisco2507宜宾绵阳......省行网络中心............Catalyst2900......PC......PCPC......PC......PC......PC......PC......PC网管机服务器xx银行vv省分行”网络”工程成都信息工程学院21通信网络系统数据包交换物理层数据链路层IP(OSPF/RIP…)以太网络PPP串口以太网络点到点网络成都信息工程学院22网络接口缓冲区数据队列转发表(路由表)IP接收和转发接收缓冲区接收缓冲区接收缓冲区接收缓冲区接收缓冲区每个网络接口设计一个队列核外进程部分接口中断处理子程序接收缓冲区其他任务IP数据报文队列第五讲有状态与无状态通信协议程序设计成都信息工程学院23第五讲有状态与无状态通信协议程序设计IP的软件包有那些模块?成都信息工程学院24数据包处理模块添加首部模块重装模块路由寻找模块分片模块IP分组IP分组IP分组TCP/IP分组TCP/IP分组,目的地址IP分组下一跳接口IP分组,下一跳IP分组重装表路由表MTU表IP软件包ARP以及数据链路层TCP层接口号目的地址分片标记等输入队列成都信息工程学院25第五讲有状态与无状态通信协议程序设计IP主程序1)while(1){a)判断输入队列有IP报文吗?①如没有,则睡眠b)从输入队列中取一个IP报文c)调用数据包报文处理模块d)根据处理结果①出错,抛弃改报文,结束本次循环②本机报文,调用重装模块③转发报文,调用路由寻找模块I.如存在路由,则调用下层模块}成都信息工程学院26数据包处理模块添加首部模块IP分组IP分组TCP/IP分组,目的地址输入队列处理模块(参数是需要处理的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以及数据链路层成都信息工程学院27路由寻找模块IP分组TCP/IP分组IP分组下一跳接口IP分组,下一跳路由表IP软件包ARP以及数据链路层TCP层目的地址成都信息工程学院28IP路由表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的路由表要到达的网络下一个路由器/下一跳20.0.0.530.0.0.510.0.0.540.0.0.5直接30.0.0.720.0.0.5直接第五讲有状态与无状态通信协议程序设计成都信息工程学院29IP路由交换路由选择的次序为:直接交付特定主机路由选择特定网络路由选择默认路由选择第五讲有状态与无状态通信协议程序设计成都信息工程学院30IP路由交换从数据报中提取目的IP地址D;A)对路由表中的每一个项目I,并计算网络前缀NA)若N与I的网络的地址匹配(和目的地址比较)1)如是网关(G出现)使用路由表中的下一跳项目作为下一跳地址(间接交付)2)如不是网关(G不出现)使用分组的目的地址作为下一跳地址(直接交付)3)把分组连同下一跳地址传送到分片模块4)停止B)找不到匹配,则发送给报文源ICMP差错报文C)停止第五讲有状态与无状态通信协议程序设计成都信息工程学院31路由寻找模块IP分组TCP/IP分组IP分组下一跳接口IP分组,下一跳路由表IP软件包ARP以及数据链路层TCP层目的地址路由寻找模块1、取得数据报文中目的地址D2、从头到尾循环检查路由表[当前i]1)求出D的