PPP协议链路操作的软件实现( 二 )


状态 状态(当前状态和下一状态)以及状态转换,是状态机的基本概念 。他指明状态机当前时刻在做什么,处于什么情况 。在LCP的链路连接状态机中,共有10种状态:Initial,Starting,Closed,Stopped,Closing,Stopping,Rdq-Sent,Ack-Received,Ack-Sent,Opened 。
事件 自动机里的状态转换是由事件引起的 。在链路连接协商时,本端从线路的对端发送过来的LCP包和自己的状态,判定将要发生的事件,并结合当前的状态判定系统的下一状态 。在LCP的链路建立过程中,事件种类较多,大概可以分为以下几类:
①网络状态事件,表明LCP或者NCP的状态变化,包括Up,Down,Open,Close 。
②超时计时器事件,与超时计时器有关的事件,包括TO+,TO- 。
③S/T数据包事件,包括RCR+,RCR-,RCA,RCN,RTR 。RTA,RUC,RXJ+,RXJ-,RXR 。动作 自动机中的动作由事件引起,所以,每个
事件都对应了相应的动作 。例如,有些动作表明了不同类型的LCP包的传输和(或)Restart timer的启动和停止 。
状态跳转表 在PPP的链路操作中,每个状态,在经过特定的事件后,会转变成新的状态,并有可能有相应的事件 。这些关系比较复杂,可以用状态跳转表[1]来表示 。
3 软件实现
3.1 软件原理
PPP链路的建立、协商和握手的过程是需要建立连接的双方来完成的 。每一方根据对端发送的LCP包的类型,做出相应的判定并响应 。软件的原理就是用软件来模拟PPP链路中的一端,完全实现协议栈的功能 。更重要的是,本文所讨论的实现方法可以实现检测、诊断的目的,这是一般的软件不能做到的 。
在实现过程中,软件接收对端的LCP包,然后根据LCP的状态跳转表来决定自己下一步的状态,并产生相应的事件和动作,将响应包通过软件发向对端,达到软件实现链路连接的目的 。
软件可以将链路活动的状况,接收和发送的数据包、链路的当前状态一一显示出来 。用户可以通过软件具体了解到网络的活动情况和状态 。
3.2 实现方法
软件实现的开发工具为Borland C++Builder可视化开发环境,运行的环境是简体中文Windows 98 。软件具有信息回显界面,便于用户测试和分析 。以下具体说明软件实现的方法 。
3.2.1 总体流程
软件的实现部分用到2个子线程,这2个线程分别负责接收和处理数据,并对数据缓冲区进行操作 。总体流程如图1所示 。
3.2.2 线程结构
软件上采用多线程的技术实现 。除了主线程,有2个子线程用于实现链路操作:一个作为数据包接收线程,一个作为数据包处理线程 。
当程序开始时,主线程初始化,将自己的状态置为Initial,同时启动数据接收线程 。因为这时PPP连接双方这时开始进行连接和协商,所以会收到对端设备的LCP包,接收线程接收LCP包,并交给处理线程处理 。处理线程对接收的数据进行解包,解出LCP包的内容,结合当前的情况,得到产生的事件,并根据当前的状态和状态跳转表,决定要模拟的下一个状态,假如必要,将相应的响应发给对端 。
 
处理线程是整个程序的重点,这个线程的流程如图2所示 。
 
可以分为以下几步:
(1)得到接收线程交给的对端数据包 。
(2)分析数据包中的内容,根据数据包的类型和当前本端的状态,查找状态跳转表,决定本端下一步的状态 。
(3)通过状态-事件的对应,本端执行相应的事件 。
(4)将产生的事件,系统的情况通过界面显示 。
(5)根据状态跳转表确定是否应该给对端发送LCP包 。假如需要,则按照LCP包标准封装数据并发送 。

推荐阅读