一、PPP协议介绍
  PPP协议是TCP/IP协议栈中数据链路层的协议,提供一种标准的方式在点对点的链路上传输多个网络层协议的数据报,PPP协议包括各种网络控制协议族(NCP)如:IPCP和IPXCP等,链路控制协议族(LCP)以及验证协议族(CHAP、PAP)等。其中,网络控制协议主要用来协商链路上传输的数据包的格式和类型,链路控制协议主要用来建立、拆除和监控PPP数据链路,验证协议主要用来提供网络安全的保证。
  
  为了在点对点的链路上建立通信,PPP链路的两端必须发送LCP数据包进行数据链路的测试和配置。等链路建立起来之后,还可能要进行端的验证,然后,PPP必须发送NCP数据包选择并配置一个或多个网络层协议,当所选择的网络层协议配置成功之后,每个网络层发送的数据报就可以在链路上传送了。链路一直保持着直到有明确的LCP或NCP数据包断开链路或某些外来的事件发生(如定时器超时或网络管理员干涉)。
  
  
  
  二、PPP协议的协商
  PPP协议的所有协商都是通过状态机(FSM)来实现的。状态机中的9种状态含义如下:
  
  1、初始状态(Initial):此时底层不可用,无Open事件发生,重起计数器(Restart     Timer)不运行。
  
  2、启动状态(Starting):此时有Open事件,底层协议已经激活,但无Up事件,所以底层仍不可用,计数器不运行,一旦有Up事件,则发送Configure-Request报文,进入 Request-Sent状态。
  
  3、关闭状态(Closed):此时链路可用,但无Open事件,重启计数器不运行。
  
  4、停止状态(Stopped):链路终止、链路配置失败或其他状态机故障,发生Terminate -Ack或This-layer-Finished事件后会进入此状态,此时重启计数器不运行,自动机收到一个Down事件后进入启动状态,收到状态配置请求报文后开始新的配置协商。
  
  5、正关闭状态(Closing):此状态试图终止连接,此时终止请求已经发出,重启计数器正运行,但尚未收到Terminate-Ack报文,一旦收到此报文,将转入Closed状态,如果计数器超时还未收到报文,则重发请求报文,重发次数超过规定的最大次数则转入Closed状态。
  
  6、正停止状态(Stopping):此时Terminate-Request报文已发送,重启计数器已经运行,但未收到Terminate-Ack报文,链路终止后可通过Starting或Stopped状态重新配置协议。它和Closing的区别是已经有Open事件发生,而Closing没有。
  
  7、配置请求发送状态(Request-Sent):此状态试图协商连接参数,此时,Configure -Request已经发送,重启计数器在运行,但还未收到Configure-Ack报文。
  
  8、收到对端确认状态(Ack-Rcvd):本端已经发送了Configure-Request并收到对端的Configure-Ack报文,但未发送对对端配置请求的确认,重启计数器在运行。
  
  9、链路开启状态(Opened):双方已经协商成功,关闭重启计数器,进入此状态时通告上层底层已Up,离开此状态时通告上层底层已Down。
  
  
  
  触发状态迁移的事件有:
  
  Up: 当底层已经准备承载数据时此事件发生。主要用于底层通告上层底层已经准备好,上层可以进入本层协议了。
  
  Down:当底层不再准备承载数据时此事件发生,用于通告上层底层准备关闭,以便上层也关闭本层,完成资源的释放。
  
  Open:此事件表明链路可用,如果此事件发生时链路不在可用状态,自动机将向对端发送报文进行协商。
  
  Close: 此事件表明链路不可用,如果链路不在关闭状态,自动机将试图终止连接。除非新的Open产生,否则任何重新配置链路的企图都被拒绝。
  
  Timeout(T0+,T0-):表明重启计数器超时,重启计数器被用来处理Configure-Request和Terminate-Request的时间响应。T0+:计数器仍大于0,相应的报文被重发。T0-:重启计数器小于0,无需重发报文。
  
  Receive-Configure-Request(RCR+,RCR-):从对端收到Configure-Request报文时此事件发生,RCR+: 配置可以接受,触发Configure-Ack报文。RCR-:不接收对端的配置请求,发Configure-Nak或Configure-Reject。
  
  Receive-Configure-Ack(RCA):当收到对端对本端配置选项认可的Configure-Ack报文时发生。
  
  Receive-Configure-Nak/Reject(RCN):收到对端拒绝本端某些或全部请求选项的Configure-Nak/ Reject报文时发生,其中,Configure-Nak包含在合法范围内、遭对端拒绝的选项(不含认可的选项),Configure-Reject中包含的选项是不允许的。
  
  Receive-Terminate-Request(RTR):收到对端的Terminate-Request报文,表明对端想关闭链路。
  
  Receive-Terminate-Ack(RTA):收到对端的Terminate-Ack报文,通常这是对端对本端的请求的确认,但也可能是对端正处于Closed或Stopped状态。
  
  Receive-Unknown-Code(RUC):收到对端发送的本端不可解释的报文,发送Code-Reject报文回应。
  
  Receive-Code-Reject,Receive-Protocol-Reject(RXJ+,RXJ-):RXJ+表明被拒绝的选项在正常范围内,RXJ-表明被拒绝的选项不可接受,这将导致链路终止。
  
  Receive-Echo-Request, Receive-Echo-Reply, Receive-Discard-Request(RXR): 对Echo-Request报文回应Echo-Reply报文,其他事件不作处理。
  
  (二)、PPP状态转换过程
   
  1、状态转移简图
  链路不可用阶段(Dead):链路必须从这个阶段开始和结束。当一个外部事件(比如一个载波信号或网络管理员配置)检测到物理层可用,PPP就会进入到Establish阶段。在Dead阶段,LCP状态机有两个状态:Initial和Starting。从这个状态迁移到Establish状态会给LCP状态机送一个Up事件。当断开连接后,链路会自动的回到这个状态。在一般情况下这个阶段是很短的,仅仅只是检测到设备在位。
  
  链路建立阶段(Establish):LCP协议用来建立一个传输配置数据包的连接,一旦发送一个Configur-Ack数据包并被对端正确的接收,LCP进入Opened状态,就停止配置数据包的发送了。LCP只配置与网络层协议无关的配置,各个网络层协议的配置通过各自的网络控制协议(NCP)在网络层协议(Network-Layer Protocol)阶段配置。在链路建立阶段接收到的非LCP数据包会直接丢弃。在网络层协议阶段或验证阶段一旦收到一个Configure -Request就会回到链路建立阶段。
  
  验证阶段(Authenticate):某些链路可能要求对端验证自己之后才允许网络层协议数据包在链路上传输,在缺省值中验证是不要求的。如果某个应用要求对端采用特定的验证协议进行验证,则必须在链路建立阶段发出使用这种协议的请求。验证应该在链路一建立的时候进行,但因为同时还要进行链路质量的检测,所以应用不能让检测链路质量的数据包的传输延迟验证的进行。只有当验证通过时才可以进入网络层协议阶段,如果验证不通过,则应继续验证而不是转到链路终止阶段。在这个阶段只允许链路控制协议、验证协议和链路质量检测的数据包进行传输,其他的数据报都应丢弃。
  
  网络层协议阶段(Network-Layer Protocol):当PPP结束前面的几个阶段,每个网络层协议(如IP、IPX)就要通过适当的网络控制协议独立的进行配置。每个NCP随时都可能是打开或关闭状态。当某个网络控制协议达到OPENED状态,PPP将运送相应的网络层协议的数据报。在某个网络控制协议到达OPENED状态之前,收到的与之对应的网络层协议数据报将被丢弃。在这个阶段,连路上传输的有任何可能的LCP、NCP和网络层协议的数据报组合。
  
  
  
  链路终止阶段(Link Terminate):PPP可以在任何时候终止链路,这可能是由于载波信号的丢失、验证不通过、链路质量不好、定时器超时或管理员关闭链路。PPP通过交换终止链路的数据包来关闭链路,当交换结束时,应用就告诉物理层拆除连接从而强行终止链路。但验证失败时,发出终止请求得一方必须等到收到终止应答或者重起计数器超过最大终止计数次数才断开连接。收到终止请求的一方必须等对方先断开连接,而且在发送终止应答之后必须等至少一次重起计数器超时之后才能断开连接。之后PPP回到链路不可用状态。
  
  PPP要开始进行LCP协商阶段时,本端LCP产生Open事件,重置链路协商选项并转到Starting 状态,此时如果底层可用就触发LowerUp事件,发送Configure-Request,进行MRU、CHAP/PAP、魔术字、异步字符映射等的协商,本端状态转为Request-Sent,对端接收到请求报文,根据自己的配置选项对报文进行处理,挑出不能接受的组成Configure-Rej报文发出,或挑出不想接收的组成Configure-Nak报文发出,状态转到Request-Sent,如果重协商计数器没有达到允许的最大值,则进行重新协商,直到对端接收自己的全部请求发回Configure-Ack,此时对端状态转到Ack-Sent。PP P有一个原则就是两端对等,所以两端进行相同的协商及状态转换过程。如果本端处于Ack-Sent状态并收到对端的Request-Ack报文,表明两端协商完成,进入链路建立阶段(Establish),可以进行验证阶段协商。
  
  验证阶段按照在LCP阶段协商好的验证协议进行端的验证。验证协议主要有CHAP和PAP两种。
  
  PAP协议是两次握手协议,它通过用户名及口令来进行用户的验证,其过程如下:当开始验证阶段时,被验证方将自己的用户名及口令发送到验证方,验证方根据本端的用户表察看是否有此用户,口令是否正确,如果正确则发送Ack报文通知对端进入下一阶段协商,否则发送Nak报文通知对端验证失败,考虑到网络误传等因素此时并不直接关闭链路以避免不必要的LCP重新协商的过程,只有当验证失败达到一定次数时才关闭链路。PAP是在网络上以明文的方式传送用户名及口令,所以安全性不高。

PPP DEBUG信息说明