PPP协议链路操作的软件实现
摘 要:PPP协议是广域网最常用的数据链路层协议之一,链路建立协商是PPP协议的重要组成部分。而网络协议的软件实现一直是计算机网络应用的一个重点,PPP协议的软件实现具有很大的应用价值。本文重点探讨LCP建立协商原理的软件实现,并给出了具体的实现方法和具体流程。
要害词:LCP;链路建立;有限状态机;PPP协议
1 PPP协议简介
PPP(Point-to-Point Protocol,点到点协议)是为在同等单元之间传输数据包这样的简单链路设计的链路层协议。这种链路提供全双工操作,并按照顺序传递数据包。设计目的主要是用来通过拨号或专线方式建立点对点连接发送数据,使其成为各种主机、网桥和路由器之间简单连接的一种共同的解决方案。
PPP协议分为3个组成部分:
(1)一个将IP数据报封装到串行链路的方法。
PPP封装提供了不同网络层协议同时通过统一链路的多路技术,使其保有对常用支持硬件的兼容性。
(2)一个用来建立、配置和测试数据链路连接的链路控制协议LCP(Link ControlProtocol)。通信的双方可通过LCP包协商一些选项。
(3)一套网络控制协议(Network ControlProtocol)。NCP是一族协议,负责解决物理连接上运行什么网络协议,以及解决上层网络协议发生的问题。他支持不同的网络层协议,如IP,OSI的网络层,DECCnet,以及AppleTalk等。
PPP帧封装格式如下:
PPP帧以标志字符01111110开始和结束,地址字段长度为1 B,内容为标准广播地址11111111,控制字段为00000011。协议字段长度为2 B,其值代表其后的数据字段所属的网络层协议。数据字段包含协议字段中指定的协议的数据报,长度为0~1 500 B。CRC字段为整个帧的循环冗余校验码,用来检测传输中可能出现的数据错误。
对应PPP协议的3个部分,PPP数据帧封装也分为:IP数据报封装、LCP控制数据封装、NCP控制数据封装。当PPP帧的协议字段为0x0021时,信息字段就是IP数据报;当协议字段为0xC021时,信息字段是LCP控制数据;当协议字段为0x8021,信息字段是NCP控制数据。
2 链路建立和状态机
2.1 PPP链路建立的概述
一次完整的PPP回话过程包括4个阶段:链路建立阶段、认证阶段、网络层控制协议阶段和链路终止阶段。本文讨论和实现的是链路建立阶段。
链路建立过程如下:请求建立链接的一端用LCP配置信息包(Configure packets)建立连接。对端收到配置信息包以后,假如认为收到的配置请求及协商选项可以接受,将发送配置成功信息包(Configure-Ack packet),当一个配置成功信息包被发送且被接收,就完成了链路建立。在LCP建立完成以后,假如收到LCP配置请求包(LCP Configure-Request)链路将从网络层协议阶段或者认证阶段返回到链路建立阶段。
通常线路两端要对如下的内容进行协商,这些内容包含在LCP配置请求包中:
(1)Maximum-Receive-Unit最大-接收-单元)
(2)Authentication-Protocol(鉴定-协议)
(3)Quality-Protocol(质量-协议)
(4)Magic-Number
(5)Protocol-Field-Compression(协议-域-压缩)
(6)Address-and-Control-Field-Compression(地址-和-控制域-压缩)
2.2 有限状态机模型
PPP协议的LCP层的连接及协商过程比较复杂,通常使用状态机模型来解释PPP状态的具体变迁情况。
状态机是一种记录下给定时刻状态的设备,并根据输入,对每个给定的改变,改变其状态或引发一个动作。有限态自动机由事件、动作和状态转换定义,通过状态机可以具体解释PPP协议中LCP链路建立的状态转换过程。LCP操作的状态机可以分为以下的要素:
状态 状态(当前状态和下一状态)以及状态转换,是状态机的基本概念。他指明状态机当前时刻在做什么,处于什么情况。在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包标准封装数据并发送。
3.2.3 数据结构
在数据结构上,程序使用一个缓冲区,共有10个元素,每个元素有1 500 B左右大小,用来存储每次送 上来的数据以备分析。2个线程分别对缓冲区进行读写。设有一个头指针和一个尾指针以免访问冲突,接收线程从底层读上数据,简单判定后保存在头指针所指向的那个缓冲区元素中,设置其未用标志,头指针加1;处理线程从尾指针指向的缓冲区元素中读出数据,然后进行处理,设置其已用标志,尾指针加1。具体的数据结构如下:
3.2.4 链路情况回显
链路状况和状态转换的情况可以通过LCP包处理子线程来完成。处理子线程每处理一次对端发来的LCP包,就把状态的变化和链路的情况显示在界面上,同时对于超时异常、计时器重启这类事件也能显示出来。用户可以实时的监视线路连接的情况,这对于分析线路有着重要的作用。
3.3 软件实现的应用前景
PPP协议LCP操作的软件实现有重要的实际意义。用户可以通过实现软件的界面显示来判定线路的情况和定位故障的发生地点。一些厂家已经根据本文所说的原理和实现方法做出产品,现在正在推广应用中。