1.1 PPP简介

PPP(Point to Point Protocol)协议是一种点到点链路层协议,主要用于在全双工的同异步链路上进行点到点的数据传输。
PPP协议是在串行链路IP协议SLIP(Serial Line Internet Protocol)的基础上发展起来的。由于SLIP协议具有只支持异步传输方式、无协商过程(尤其不能协商如对方IP地址等网络层属性)、只能承载IP一种网络层报文等缺陷,在发展过程中,逐步被PPP协议所替代。

PPP协议有如下特点:

  • 对物理层而言,PPP既支持同步链路又支持异步链路,而X.25、FR等数据链路层协议仅支持同步链路,SLIP仅支持异步链路。
  • PPP协议具有良好的拓展性,例如,当需要在以太网链路上承载PPP协议时,PPP可以拓展为PPPoE
  • 提供LCP(Line Control Protocol)协议,用于各种链路层参数的协商。
  • 提供各种NCP(Network Control Protocol)协议(如IPCP、IPXCP),用于各网络层参数的协商,更好地支持了网络层协议。
  • 提供认证协议CHAP(Challenge-Handshake Authentication Protocol)、PAP(Password Authentication Protocol),更好的保证了网络的安全性。
  • 无重传机制,网络开销小,速度快。

image.png

1.2 PPP报文格式

1.2.1 PPP的基本架构

PPP协议处于TCP/IP协议栈的数据链路层,主要用在支持全双工的同异步链路上,进行点到点之间的数据传输
image.png
PPP主要由三类协议簇组成:

  • 链路控制协议族(Link Control Protocol)主要用来建立、拆除和监控PPP数据链路。
  • 网络层控制协议族(Network Control Protocol)主要用来协商在该数据链路上所传输的数据包的格式与类型
  • 拓展协议族CHAP(Challenge-Handshake Authentication Protocol)和PAP(Password Authentication Protocol)网络安全方面的验证。

1.2.2 PPP报文封装的帧结构

image.png
各字段的含义如下:

  • Flag域
    • Flag域标识一个物理帧的起始和结束,该字节为0x7E
  • Address域
    • Address域可以唯一标识对端,PPP协议是被运用在点到点的链路上,因此,使用PPP协议互连的两个通信设备无需知道对端链路层地址。按照协议的规定将该字节填充为全1的广播地址,对于PPP协议来说,该字段无实际意义。
  • Control域
    • 该字段默认值为0x03,表明为无序号帧,PPP默认没有采用序列号和确认应答来实现可靠传输
    • Address个Control域一起标识此报文为PPP报文,即PPP报文头为FF03
  • Protocol域

    • Protocol域可用来区分PPP数据帧中信息域所承载的数据包类型
    • Protocol域的内容必须依据ISO 3309的地址拓展机制所给出的规定,该机制规定协议域所填充的内容必须为奇数,也就是要求最低有效字节的最低有效位为“1”
    • 如果当发送端发送的PPP数据帧的协议域字段不符合上述规定,接收端则会认为此数据帧是不可识别的。接收端向发送端发送一个Protocol-Reject报文,在该报文尾部将填充被拒绝报文的协议号。 | 协议代码 | 协议类型 | | —- | —- | | 0021 | Internet Protocol | | 002b | Novell IPX | | 002d | Van Jacobson Compressed TCP/IP | | 002f | Van Jacobson Uncompressed TCP/IP | | 8021 | Internet Protocol Control Protocol | | 802b | Novell IPX Control Protocol | | 8031 | Bridging NC | | C021 | Link Control Protocol | | C023 | Password Authentication Protocol | | C223 | Challenge Handshake Authentication Protocol |
  • Information域

    • Information域最大长度是1500字节,其中包括填充域的内容,Information域的最大长度称为最大接受单元MRU(Maximum Receive Unit)。MRU的缺省值为1500字节,在实际应用当中可根据实际需要进行MRU的协商。
    • 如果Information域长度不足,可被填充,但不是必须的,如果填充则需通信双方的两端能辨认出填充信息和真正需要传送的信息,方可正常通信。
  • FCS域
    • FCS域的功能主要对PPP数据帧传输的正确性进行检测
    • 在数据帧中引入了一些传输的保证机制,会引入更多的开销,这样可能会增加应用层交互的延迟

1.2.3 LCP报文封装的帧格式

在链路建立阶段,PPP协议通过LCP报文进行链路的建立和协商,此时LCP报文作为PPP的净载荷被封装在PPP数据帧的Information域中,PPP数据帧的协议域的值固定填充0xC021。
在链路建立阶段的整个过程中信息域的内容是变化的,它包括很多种类型的报文,所以这些报文也要通过相应的字段来区分。

  • Code域
    • Code域的长度为一个字节,主要是用来标识LCP数据报文的类型。
    • 在链路建立阶段,接收方接收到LCP数据报文,当其Code域的值无效时,就会向对端发送一个LCP的代码拒绝报文(Code-Reject报文)。
code值 报文类型
0x01 Configure-Request
0x02 Configure-Ack
0x03 Configure-Nak
0x04 Configure-Reject
0x05 Terminate-Request
0x06 Terminate-Ack
0x07 Code-Reject
0x08 Protocol-Reject
0x09 Echo-Request
0x0A Echo-Reply
0x0B Discard-Request
0x0C Reserved
  • Identifier域
    • Identifier域为1个字节,用来匹配请求和响应,当Identifier域值为非法时,该报文将被丢弃。
    • 通常一个配置请求报文的ID是从0x01开始逐步加1的。当对端接收到该配置请求报文后,无论使用何种报文回应对方,但必须要求回应报文中的ID要与接收报文中的ID一致。
  • Length域
    • Length域的值就是该LCP报文的总字节数据。它是Code域、Identifier域、Length域和Data域四个域长度的总和。
    • Length域所指示字节数之外的字节将被当作填充字节而忽略掉,而且该域的内容不能超过MRU的值。
  • Data域:Data域所包含的是协商报文的内容,这个内容包含以下字段。

    • Type为协商选项类型。
    • Length为协商选项长度,它是指Data域的总长度,也就是包含Type、Length和Data。
    • Data为协商选项的详细信息。
  • 常见Type中的协商类型值 | 协商类型值 | 协商报文类型 | | —- | —- | | 0x01 | Maximum-Receive-Unit | | 0x02 | Async-Control-Character-Map | | 0x03 | Authentication-Protocol | | 0x04 | Quality-Protocol | | 0x05 | Magic-Number | | 0x06 | RESERVED | | 0x07 | Protocol-Field-Compression | | 0x08 | Address-and-Control-Field-Compression |

1.3 PPP的建链过程

fig_dc_fd_ppp_000601.png

  1. 通信双方开始建立PPP链路时,先进入到Establish阶段。
  2. 在Establish阶段,PPP链路进行LCP协商。协商内容包括工作方式是SP(Single-Link PPP)还是MP(Multilink PPP)、最大接收单元MRU(Maximum Receive Unit)、验证方式和魔术字(magic number)等选项。LCP协商成功后进入Opened状态,表示底层链路已经建立。
  3. 如果配置了验证,将进入Authentication阶段,开始CHAP或PAP验证。如果没有配置验证,则直接进入Network阶段,此时LCP状态仍为Opened。
  4. 在Authentication阶段,如果验证失败,进入Terminate阶段,拆除链路,LCP状态转为Down,如果验证成功,进入Network阶段,此时LCP状态仍为Opened。
  5. 在Network阶段,PPP链路进行NCP协商。通过NCP协商来选择和配置一个网络层协议并进行网络层参数协商,只有相应的网络层协议协商完成后,该网络层协商才可以通过这条PPP链路发送报文。NCP协商包括IPCP(IP Control Protocol)、MPLSCP(MPLS Control Protocol)等协商,IPCP协商内容主要包括双方的IP地址。
  6. NCP协商成功后,PPP链路将一直保持通信,PPP运行过程中,可以随时中断连接,物理链路断开、认证失败、超时定时器时间到、管理员通过配置关闭连接等动作都可能导致链路进入Terminate阶段。
  7. 在Terminate阶段,如果所有的资源都被释放,通信双方将回到Dead阶段,直到通信双方重新建立PPP连接,开始新的PPP链路建立。

Dead阶段(链路不可用阶段)

  • Dead阶段也称为物理层不可用阶段,PPP链路都需从这个阶段开始和结束。
  • 当通信双方的两端监测到物理线路激活(通常是监测到链路上有载波信号)时,就会从Dead阶段跃迁至Establish阶段,即链路建立阶段。
  • 链路被断开后也同样会返回到链路不可用阶段。

Establish阶段(链路建立阶段)

  • 在Establish阶段,PPP链路进行LCP协商,协商内容包括工作方式是SP(Single-link PPP)还是MP(Multilink PPP)、最大接收单元MRU、验证方式和魔术字(magic number)等选项。当完成配置报文的交换后,则会继续向下一个阶段跃迁。
  • 在链路建立阶段,LCP的状态机会发生如下改变:
    • 当链路处于不可用阶段时,此时LCP的状态机处于初始化Initial状态或准备启动Starting状态。当检测到链路可用时,则物理层会向链路层发送一个Up事件。链路层收到该事件后,会将LCP的状态机从当前状态改变为Request-Sent(请求发送)状态,根据此时的状态机LCP会进行相应的动作,也就是开始发送Configure-Request报文来配置数据链路。
    • 如果本端设备先收到Configure-Ack报文,则LCP的状态机从Request-Sent状态改变为Ack-Received状态,本端向对端发送Configure-Ack报文以后,LCP的状态机从Ack-Received状态改变为Opened状态。
    • 如果本端设备先向对端发送Configure-Ack报文,则LCP的状态机从Request-Sent状态改变为Ack-Sent状态,本端收到对端发送的Configure-Ack报文以后,LCP的状态机从Ack-Sent状态改变为Opened状态。
    • LCP状态机变为Open状态以后就完成当前阶段的协商,并向下一个阶段跃迁。
  • 下一个阶段既可能是验证阶段,也可能是网络层协商阶段,下一阶段的选择是依据链路两端的设备配置的,通常由用户来配置。

Authentication阶段(验证阶段)

  • 缺省情况下,PPP链路不进行验证,如果要求验证,在链路建立阶段必须指定验证协议。
  • PPP验证主要是用于主机和设备之间,通过PPP网络服务器交换电路或拨号接入连接的链路,偶尔也用于专用线路。
  • PPP提供密码验证协议PAP和质询握手验证协议CHAP两种验证方式
  • 单向验证是指一端作为验证方,另一端作为被验证方,双向验证是单向验证的简单叠加,即两端都是既作为验证方又作为被验证方。在实际应用中一般只采用单向验证。

PAP验证方式:PAP验证协议为两次握手协议,口令为明文
fig_dc_fd_ppp_000701.png

  • 被验证方把本地用户名和口令发送到验证方
  • 验证方根据本地用户表查看是否有被验证方的用户名
    • 若有,则查看口令是否正确,若口令正确,则认证通过,若口令不正确,则认证失败
    • 若没有,则认证失败

CHAP验证过程:CHAP验证过程为三次握手验证协议。它只在网络上传输用户名,而并不传输用户密码,因此安全性要比PAP高,CHAP的验证过程如下所示:
fig_dc_fd_ppp_000702.png
CHAP单向验证过程分为两种情况:验证方配置了用户名和验证方式没有配置用户名,推荐使用验证方配置用户名的方式,这样可以对验证方的用户名进行确认。

验证方配置了用户名的验证过程:

  • 验证方主动发起验证请求,验证方向被验证方发送一些随机产生的报文(Challenge),并同时将本端的用户名附带上一起发送给被验证方。
  • 被验证方接到验证方的验证请求后,先检查本端接口上是否配置了ppp chap password命令,如果配置了该命令,则被验证方用报文ID、命令中配置的用户密码和MD5算法对该随机报文进行加密,将生成的密文和自己的用户名发回验证方(Response)。如果接口上未配置ppp chap password命令,则根据此报文中验证方的用户名在本端的用户表查找该用户对应的密码,用报文ID、此用户的密钥和MD5算法对该随机报文进行加密,将生成的密文和被验证方自己的用户名发回给验证方(Response)
  • 验证方用报文ID和自己保存的被验证方密码和MD5算法对原随机报文加密,比较二者的密文,若比较结果一致,认证通过,若比较结果不一致,认证失败。

验证方没有配置用户名的验证过程

  • 验证方主动发起验证请求,验证方向被验证方发送一些随机产生的报文(Challenge)。
  • 被验证方接到验证方的验证请求后,利用报文ID、ppp chap password命令配置的CHAP密码和MD5算法对该随机报文进行加密,将生成的密文和自己的用户名发回验证方(Response)。
  • 验证方用自己保存的被验证方密码和MD5算法对原随机报文加密,比较二者的密文,若比较结果一致,认证通过,若比较结果不一致,认证失败。

CHAP与PAP验证过程对比

  • PAP认证中,口令以明文方式在链路上发送,完成PPP链路建立后,被验证方会不停地在链路上反复发送用户名和口令,直到身份验证过程结束,所以安全性不高。当实际应用过程中,对安全性要求不高时,可以采用PAP认证建立PPP连接。
  • CHAP认证中,验证协议为三次握手验证协议。它只在网络上传输用户名,而并不传输用户密码,因此安全性比PAP认证高。当实际应用过程中,对安全性要求较高时,可以采用CHAP认证建立PPP连接。

Network阶段(网络层协商阶段)

  • PPP完成了前面几个阶段,通过NCP协商来选择和配置一个网络层协议并进行网络层参数协商。每个NCP协议可在任何时间打开和关闭,当一个NCP的状态机变为Opened状态时,则PPP就可以开始在链路上承载网络层数据传输。

Terminate阶段(网络终止阶段)

  • PPP能在任何时候终止链路。当载波丢失、认证失败或管理员人为关闭链路等情况均会导致链路终止。

1.4 魔术字防环

image.png

  • 当收到一个Configure-Request报文之后,其包含的魔术字需要和本地产生的魔术字做比较,如果不同,表示链路无环路,则使用Confugure-Ack报文确认(其他参数也协商成功),表示魔术字协商成功。在后续发送的报文中,如果报文含有魔术字字段,则该字段设置为协商成功的魔术字,LCP不再产生新的魔术字。

  • 如果收到的Configure-Request报文和自身产生的魔术字相同,则发送一个Configure-Nak报文,携带一个新的魔术字。然后,不管新收到的Configure-Nak报文中是否携带相同的魔术字,LCP都发送一个新的Configure-Request报文,携带一个新的魔术字。如果链路有环路,则这个过程会不停的持续下去,如果链路没有环路,则报文交互会很快恢复正常。

    路由器在同异步链路上只要进行PPP封装,默认就开启PPP链路LCP协商的环路检测,无需任何特殊配置。

1.5 LCP协议


1.5.1 LCP报文类型

image.png

  • 链路配置报文
  • 链路的终止报文
  • 链路的维护报文

1.5.2 LCP协议参数

image.png

1.5.3 LCP链路协商

image.png

  • LCP协议的前提是物理链路的Up的
  • Configure-Request每三秒发送一次,最多发送十次,如果十次后没有得到回应则会认为对端已经不可用了,会停止发送。

image.png

  • 会回复不认可的参数,而且这个不认可的参数会修改为可以认可的取值。
  • 如果5次修改的次数都不成功则会中断协商过程。

image.png
image.png

  • 此处发送的是链路维护报文,每隔10秒发送一次Echo-Request报文。

image.png

1.6 PAP认证协议


1.6.1 PAP报文类型

image.png

1.6.2 PAP工作原理

image.png

1.7 CHAP认证协议

1.7.1 CHAP报文类型

image.png

  • 要发送挑战报文(Challenge)。ID+密码+Challenge随机值生成一个MD5的值,双方的MD5值必须是一样的才能认证成功。

1.7.2 CHAP工作原理

image.png

  • 认证方会发送挑战报文给验证方,挑战报文是一个随机数(用户名+挑战值)

1.8 NCP协议


1.8.1 IPCP静态协商IP地址

image.png

1.8.2 IPCP动态协商IP地址

image.png

1.9 MP基本原理


image.png

  • 与以太网中的链路聚合Eth-Trunk很相似。

1.10 PPP配置


1.10.1 配置PPP

image.png

  • 认证方一般是服务器,被认证方一般是用户。

1.10.2 配置MP

image.png