基于PPP协议软件的实现

 基于PPP协议软件的实现

摘要:PPP(点对点协议)是数据链路层协议,应用极为广泛,也是一个比较复杂的通信协议。本文将首先对PPP协议的背景知识进行必要的介绍,然后重点从软件工程的角度讨论如何实现PPP协议软件。
关键词:点对点协议;LCP;NCP;软件实现

1  引言
    PPP(点对点协议)是远程接入服务器(RAS)中的关键技术,是为在同等单元之间传输数据包的简单链路而设计的。这种链路提供全双工操作,并按照顺序传递数据包。PPP可以为基于各种主机、网桥和路由器的简单连接提供一种互联的解决方案,与PPP协议推出前广泛应用的SLIP协议(串行线路IP协议)相比,PPP协议具有SLTP所没有的多项功能:支持多协议、具有帧检错能力、支持IP地址的动态分配、支持身份验证方式的网络安全等。

2 PPP的协议结构

   本文不再介绍物理层的知识,而只讨论与软件实现有关的协议本身的问题。
协议结构
   PPP由以下三个组建组成:
    a)  在串行链路上的封装数据报的方法;
    b)  用于建立、配置和测试数据链路连接的连接控制协议LCP(Link Control Protocol);
    c)  用于建立、配置不同网络层协议的网络控制协议NCP(Network Control Protocol);
    PPP协议结构图:

3 PPP的运行机制
3.1 PPP协议的状态变迁图

   在建立、配置和测试数据链路的过程中,PPP会有不同状态的变迁。
 
图2    PPP协议状态变迁

    系统初始化时链路状态处于DEAD阶段。
    当底层向PPP模块发出UP事件指示物理层可以使用时,PPP将进入建立阶段,开始协商LCP的选项配置,若LCP协商失败,则回到死亡阶段,若成功则前进到OPENED状态。
    如果在LCP阶段协商了认证协议,则在完成用户身份验证即认证通过后则进入网络层协议阶段,否则终止链路。
    当PPP用户身份认证通过后,将进入NCP协商阶段,以确定PPP承载的网络层协议,如果确定NCP是IPCP,则主要的任务之一就是与对端协商本地的IP地址。

3.2 PPP协议的状态机

    PPP协议定义了一个有限的状态机[1],在所有的通信协议中,我认为是比较复杂的状态机之一,共计16个事件、10个状态和13个动作,这个有限状态机描述了在某种状态下,发生某个事件时,协议的状态机应该发生相应的动作,并且状态迁移到另一个状态,PPP协议能否正确实现在很大程度上决定于状态机的实现是否正确,状态机一般形式如下:
 

    上面列出的是状态机小小的一部分,也就是说在上面的七种状态下,发生了Open事件时,应该相应发生的动作和状态的迁移,在这里仅仅给出一个大概样子,帮助大家理解状态机的执行情况,至于状态机的其它全部状态、事件、动作的定义深刻理解请参见RFC1661,我的体会是:相关的RFC文档中的每一句话都要仔细阅读,认真体会,要严格按照文档中的定义来开发软件,不要自己想当然。

4 PPP协议的软件实现
 
    通过上面的介绍,我们可以看出来PPP协议涉及到两个子协议和相关的认证协议,链路层协议本身就需要考虑很多底层的细节,比较复杂,所以我们必须运用软件工程的思想,使我们清醒的、有序的、科学的实现之。针对PPP协议的协商选项较多、NCP协商承载协议的多样性、状态机的复杂程度以及在LCP、NCP协商过程中认证协议不遵从PPP状态机的情况,我经过认真考虑划分了以下几个模块,模块的划分和模块间的组织请见图4。
    下面分别介绍各个模块
   4.1 SHELL模块
    介于底层与CORE模块之间,完成PPP协议与外部的一致性处理,另外还负责:
 整个PPP协议与底层的通信,包括协商报文的传递、底层事件的上报,如底层UP、DOWN事件等;
 与CORE模块的通信,包括协商报文的传递,相关事件的处理;
 
                     图4  PPP协议的实现
   4.2  CORE模块
    这个模块是比较复杂而重要的模块之一,居于核心地位,负责调度各个子协议模块的同时完成PPP协商阶段的转换,主要功能有:
 处理从SHELL模块传递过来的事件,分析判断报文并调用相应子模块的相应处理函数;
 处理从各个子协议模块传递过来的事件,如有必要则通知SHELL模块所发生的事件;
 处理从SHELL模块传递过来的协商报文,判断协议号,然后调用相应子协议的处理函数;
 状态转换,根据各个子协议在协商和运行时返回的事件结合目前的状态,完成状态的迁移,同时通知相应子模块的处理函数。
    需要注意的是,因为CORE模块也负责调度认证模块(PAP/CHAP),而认证协议是不遵从PPP状态机和状态迁移规定的,所以应该特别处理与认证协议之间的调度。
   4.3  FSM模块
    这个模块是实现PPP协议有限状态机的,所以也是最为重要的模块,它是否能够正确实现是PPP协议正确运行的保证,必须把所有可能的情况全部考虑在内,包括状态机所有的状态变换、引发的动作,也就是说一个以10个单位(10个状态)为横轴和以16个单位(事件)为竖轴围成的矩形内所有的单位面积几乎都需要考虑、处理,有的单位面积中还会有不止一个动作发生,所以这个模块是比较关键和复杂的。
为处理方便和保持与其它模块处理的一致性,我将外部事件与报文事件分别处理,所以这个模块又分为以下两个子模块:
 处理各个子协议模块传递过来的外部事件:UP、DOWN、OPEN、CLOSE,然后执行相应的动作;
 处理各个子协议模块传递过来的报文事件,然后执行相应的动作;
4.4  LCP模块
    这个模块实现LCP协议自动机,完成与对端的LCP阶段的协商,它受CORE模块调度,在处理相应事件时会调用FSM模块中相应的状态机函数,在完成协商后,会发送一个UP事件给CORE模块,然后由CORE模块转发给从而触发认证自动机或者NCP自动机开始协商,这个模块的主要功能有:
 初始化LCP控制块,根据用户的配置以确定发起协商前的一些基本配置
 实现对PPP状态机在LCP协商阶段的相应动作,即实现各个动作函数,以回调函数的形式供FSM模块调用;
 处理自CORE模块传递过来的外部事件,然后调用FSM模块的状态机事件处理函数;
 处理自CORE模块传递过来的报文事件,然后调用FSM模块的状态机事件处理函数;
 完成针对各个消息报文的处理,如接收到Configure_Req、Configure_Nak等等消息,这个部分是实现LCP自动机的关键所在,应该严格按照相关RFC实现之;
4.5  NCP模块
    这个模块实现NCP自动机,接收到CORE模块的LCP_UP事件后开始协商NCP协议,它受CORE模块调度,在处理相应事件时会调用FSM模块中相应的状态机函数,如果上层承载IP协议,那么这个阶段主要是与对端协商本端的IP地址,当协商完成后发送PPP_UP事件给SHELL模块,以便SHELL模块通知外部相关协议进行加载IP地址动作,抛开通信方面的不同,在软件结构上与LCP基本相同,主要功能有:
 初始化LCP控制块,根据用户的配置以确定发起协商前的一些基本配置;
 实现对PPP状态机在NCP协商阶段的相应动作,即实现各个动作函数,以回调函数的形式供FSM模块调用;
 处理自CORE模块传递过来的外部事件,然后调用FSM模块的状态机事件处理函数;
 处理自CORE模块传递过来的报文事件,然后调用FSM模块的状态机事件处理函数;
 完成针对各个消息报文的处理,如接收到Configure_Req、Configure_Nak等等消息,这个部分是实现NCP自动机的关键所在,应该严格按照相关RFC实现之;
4.6 AUTHEN模块
    这个模块实现PPP接入中的认证,是可选模块,目前PPP协议中的认证协议主要是PAP和CHAP协议,尤其CHAP因为其安全性高而获得广泛的应用,但实现比较复杂,由于工作量的问题,我的PPP软件实现中采用的是PAP认证协议[4],它也由CORE模块调度,认证通过后,向CORE发送AUTHEN_UP事件,由CORE触发NCP自动机进行协商,这个模块的主要功能有:
 处理由CORE模块传递过来的外部事件;
 处理由CORE模块传递过来的报文事件;
 实现自动机中的全部动作,正确处理对端的各种消息,如:PAP_AUTHREQ、PAP_AUTHACK 、PAP_AUTHNAK等消息。
    综上所述,CORE模块处于核心地位,它负责调度所有其他子模块的运行,而FSM状态机模块是严格按照RFC1661中定义的状态机实现的,更多的是从逻辑上实现了状态机,由于状态机中规定的同一个动作在LCP和NCP阶段所要采取的处理方法是不同的,所以它们被安排在LCP和NCP模块中分别实现,每一个动作以回调函数的形式供FSM调用,这样安排是比较清晰的,也是符合逻辑的;LCP模块、NCP模块和认证模块之间并不直接发生关系,它们之间均对CORE负责,由CORE模块协调调度;所有的事件报文和数据报文经过FSM模块的状态机分析后会自动调用LCP或NCP模块中的相应动作,以完成一个完整的协商过程,这里需要注意的是认证模块并不遵从PPP状态机,所以FSM模块不会和认证模块发生关系。

5 小结
    PPP协议已经成为目前使用最广泛的接入因特网数据链路层协议,应用于各种宽带网络接入,主要是因为Internet是按照TCP/IP协议族来组网的,而整个TCP/IP协议栈中没有数据链路层的概念,只提供了一个物理网络接口与各种网络连接,在点到点的实现方式中,PPP所起的作用与OSI的数据链路层一致,从而完成链路的操作、维护和管理功能。
    另外,我深深的体会到在开发逻辑比较复杂、代码量比较大的软件时,软件工程知识的重要性,在工作实践中不断的理解、掌握、运用软件工程知识会大大提高我们产品的质量和工作效率。

参考文献:
[1] IETF RFC1661, The Point-to-Point Protocol (PPP).
[2] IETF RFC1332, The PPP Internet Protocol Control Protocol (IPCP).
[3] IETF RFC2516, A Method for Transmitting PPP Over Ethernet (PPPoE).
[4] IETF RFC1334, PPP Authentication Protocols (PAP)
[5] IETF RFC1994, PPP Challenge Handshake Authentication Protocol (CHAP).
[6] 郑人杰等,实用软件工程, 北京:清华大学出版社,1997。

 

来源:http://www.51kaifa.com/html/jswz/200511/read-3042.htm

发布了38 篇原创文章 · 获赞 1 · 访问量 13万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览