PPP协议

PPP协议概述

  • PPP(Point-to-Point Protocol,点到点协议),是一种常见的广域网数据链路层协议,主要用于全双工的链路上用于点到点的数据传输封装。
  • PPP提供安全认证协议族PAP(Password Authentication Protocol,密码验证协议)和CHAP(Challenge Handshake Authentication Protocol,挑战握手认证协议)。
  • PPP具有良好的扩展性,例如,当需要在以太网链路上承载PPP协议时,PPP可以扩展成为PPPoE。
  • PPP协议提供LCP(Link Control Protocol,链路控制协议),用于各种链路层的协商,例如最大传输单元, 最大接受单元,认证模式等等。
  • PPP协议提供各种NCP(Network Control Protocol,网络控制协议),如IPCP(IP Control Protocol,IP控制协议),用于网络层参数的协商,更好的支持了网络层协议。

PPP链路建立过程

  • PPP链路的建立有三个阶段的协商过程:链路层协商,认证协商(可选)和网络层协商。
    • 链路层协商:通过LCP报文进行链路参数协商,建立链路层连接。(MRU,认证模式,聚合等)
    • 认证协商(可选):通过链路建立阶段的认证方式进行链路认证。
    • 网络层协商:通过NCP协商来选择和配置一个网络层协议并进行网络层参数协商。
      在这里插入图片描述

PPP链路接口状态机

  • PPP协商由链路两端的接口完成。接口的状态表示了协议的协商字段。
    在这里插入图片描述
    基本顺序就是首先进行链路协商,接着进行认证协商,最后进行网络层协商。其中任何一层协商没有成功都会回到最初的Dead(Down)状态。

LCP报文格式

  • PPP报文可以由Protocol字段标识不同类型的PPP报文。例如:当Protocol字段为0XC021时,代表是LCP报文。此时又由于Code字段标识不同类型的LCP报文,如下表所示:
    在这里插入图片描述

LCP协商过程—正常协商(链路层协商过程)

  • LCP协商由不同的LCP报文交互完成。协商由任意一方发送Configura-Request报文发起。如果对端接收此报文且参数匹配,则通过回复Configure-Ack相应成功。
    在这里插入图片描述
  • 首先R1向R2发起协商,接口中包含了MRU(MAX Receive Unit最大接收单元),认证类型,以及魔术字(用于防止环路,当收到与自身相同的魔术字的时候,就认为产生了环路,将报文丢弃)
  • R2收到报文之后,进行回复Ack进行确认。(这就是一个正常且没有问题的协商过程)

LCP协商过程—参数不匹配(链路层协商过程)

  • 在LCP报文交互中出现LCP参数不匹配时,接收方回复Configure-Nak相应告知对端修改参数,然后重新协商。
    在这里插入图片描述
  1. R1首先发起配置请求,并且携带本段的参数。(可以看到现在R1接口和R2接口的参数不一致)
  2. 然后发送给了R2之后,R2发现跟本端接口参数不一致,于是回复Configure-Nak给R1。
  3. R1收到之后会修改本端的参数,然后重新发送Configure-Request报文给R2。
  4. 最后R2发现参数合适,于是回复Configure-Ack报文,协商成功。

LCP协商过程—参数不识别(链路层协商过程)

  • 在LCP报文进行交互中出现LCP参数不识别时,接收方回复Configure-Reject相应告知对端删除不识别的参数,然后重新协商。
    在这里插入图片描述
  1. 首先R1发送端口的配置请求,并且携带端口的参数。
  2. R2收到R1发送的端口配置,然后发现里面有自己不认识的字段,于是回复Configure-Reject报文给R1.
  3. 然后R1收到Reject报文之后重新进行参数配置,然后将调整过后的参数再次发送给R2.
  4. R2收到与自身匹配的接口参数,然后认为参数合法,于是发送Ack报文给R1,协商完成。

PPP认证模式

链路协商成功之后,进行认证协商(可选)。认证协商有两种模式,PAP和CHAP。

PAP

  • PAP认证双方有两次握手。协商的报文以明文的方式在链路上传输。
    在这里插入图片描述
    目前双方已经LCP链路协商成功,底层链路建立完成,并确立认证方式为PAP。在认证方有数据库,其中记录了可以认证成功的用户名和密码。
  • 首先被认证方首先发起认证,向认证方发送用于建立链路的PPP帧,其中包括了用户名和密码。
  • 然后认证方收到之后,与数据库进行对比,然后发现数据库匹配成功,发送Ack给被认证方。认证结束。
    但是PAP认证有一个很大的缺陷,就是用户名和密码在明文中进行传输,不安全。

CHAP

  • CHAP认证有三次握手。协商报文被加密之后在链路上进行传输。
    在这里插入图片描述
    现在LCP链路已经协商成功了,底层链路的建立,也确定认证方式为CHAP。认证方这里有数据库,内含可以成功建立的用户名和密码。
  • 认证方主动发起验证请求,验证方向被验证方发送一些随机产生的报文(Challenge)。(包括ID和随机数)
  • 被认证放收到报文之后,将报文ID,认证密码和随机数进行MD5运算,将生成的密文和自己的用户名一起发送给认证方。
  • 认证方收到之后,通过用户名找出相应的密码,然后使用报文ID,随机数和相应的密码进行MD5计算,然后与收到的MD5值进行比对,如果一致,则回复success,如果不一致则回复failed。
    (图中是认证方没有配置用户名的过程,就是在发送认证过程中的PPP报文没有配置用户名,但是还有一种配置用户名的CHAP认证过程
  • 验证方主动发起验证请求,验证方向被验证方发送一些随机产生的报文(Challenge),并同时将本端的用户名附带上一起发送给被验证方。
  • 被验证方接到验证方的验证请求后,先检查本端接口上是否配置了ppp chap password命令,如果配置了该命令,则被验证方用报文ID、命令中配置的用户密码和MD5算法对该随机报文进行加密,将生成的密文和自己的用户名发回验证方(Response)。如果接口上未配置ppp chap password命令,则根据此报文中验证方的用户名在本端的用户表查找该用户对应的密码,用报文ID、此用户的密钥(密码)和MD5算法对该随机报文进行加密,将生成的密文和被验证方自己的用户名发回验证方(Response)。
  • 验证方用报文ID和自己保存的被验证方密码和MD5算法对原随机报文加密,比较二者的密文,若比较结果一致,认证通过,若比较结果不一致,认证失败。

NCP协商—静态IP地址协商

  • PPP认证协商过后,双方进入NCP阶段,协商在数据链路上所传输的数据包格式与类型。以常见的IPCP协议为例,它分为静态IP地址协商和动态IP地址协商。
  • 静态IP地址需要手动在链路两端进行配置IP地址。(要求地址都是使用手工进行配置
    在这里插入图片描述
  • 首先R1发送配置请求,携带本端配置的IP地址,使用Configure-Request报文。
  • 然后R2接收到报文之后,对地址进行检查,只要地址合法不是广播地址或者网络号等都可以,不是一个网段也可以通过,因为PPP链路是一个点到点的链路,通过直连进行通信,然后回复Ack报文。

NCP协商—动态IP地址协商

  • 动态IP地址协商支持PPP链路一端为对端配置IP地址。(可以想作R1时客户端,R2时服务器端)
    在这里插入图片描述
  1. 现在R1没有配置地址,向R2发送一个Request报文,包含地址0.0.0.0,就是一个空地址。
  2. R2收到之后发现对端地址不合法,回复一个Nak报文,Nak报文中含有一个IP地址
  3. R1收到Nak报文之后重新发送新的配置请求,并且携带Nak报文中的IP地址。
  4. R2收到新的Request报文之后,确认是合法地址,发送Ack报文。(即使R1的地址跟R2不在一个网段也可以进行通信,因为此时在R2上会产生一条默认路由,指向R1的接口地址,并且下一跳为自身的出口S1/0/0)
  5. R2再发送自身的配置请求,携带本端IP地址。
  6. R1收到报文之后确定是合法的,随后回复Ack报文。
PPP(Point-to-Point Protocol)协议是一种广泛使用的数据链路层协议,主要用于在点对点连接上传输多协议数据包。它不仅支持多种网络协议(如 IPv4、IPv6 等),还提供链路建立、维护、拆除、协议协商以及认证等功能[^3]。PPP 协议最初设计用于串行链路,例如拨号连接,但其灵活性和可扩展性使其适用于多种网络环境。 ### PPP协议的组成 PPP 协议由三个主要部分组成,分别用于处理不同的功能: 1. **链路控制协议(LCP, Link Control Protocol)**:LCP 用于建立、配置和测试数据链路层的连通性。它负责协商链路参数,例如最大传输单元(MTU)、认证方式等[^3]。 2. **网络控制协议(NCP, Network Control Protocol)**:NCP 是一组协议,用于协商和配置不同的网络协议。例如,IPCP(IP Control Protocol)用于配置 IPv4 地址,IPv6CP 用于配置 IPv6 地址[^3]。 3. **认证协议**:PPP 协议支持多种认证方式,最常用的包括口令验证协议(PAP, Password Authentication Protocol)和挑战握手验证协议(CHAP, Challenge-Handshake Authentication Protocol)。PAP 是一种简单的明文密码认证方式,而 CHAP 则通过挑战-响应机制提供更高级别的安全性[^2]。 ### PPP协议的工作原理 PPP 协议的工作流程可以分为以下几个阶段: 1. **链路建立阶段**:在此阶段,LCP 负责建立和配置链路。双方通过交换 LCP 配置请求(Configure-Request)和响应(Configure-Ack)来协商链路参数,例如最大帧大小、认证方式等。如果配置成功,链路进入“打开”状态[^2]。 2. **认证阶段(可选)**:如果链路配置中指定了认证方式,则在此阶段进行身份验证。例如,PAP 或 CHAP 会在此阶段执行认证流程。如果认证失败,链路将被终止[^2]。 3. **网络协议配置阶段**:在此阶段,NCP 负责配置网络协议。例如,IPCP 会协商 IP 地址分配等参数。一旦网络协议配置完成,数据传输即可开始[^3]。 4. **数据传输阶段**:在此阶段,PPP 协议将数据封装为帧,并通过链路传输。数据帧的格式通常包括标志字段、地址字段、控制字段、协议字段、信息字段和帧校验序列(FCS)字段[^3]。 5. **链路终止阶段**:当链路不再需要时,LCP 会发送终止请求(Terminate-Request)和终止确认(Terminate-Ack)来关闭链路[^2]。 ### PPP协议的帧格式 PPP 协议的帧格式如下: - **标志字段(Flag)**:1 字节,值为 `0x7E`,表示帧的开始和结束。 - **地址字段(Address)**:1 字节,默认值为 `0xFF`,表示广播地址。 - **控制字段(Control)**:1 字节,默认值为 `0x03`,表示无编号信息帧。 - **协议字段(Protocol)**:2 字节,指示信息字段中封装的数据类型。例如,`0x0021` 表示 IPv4 数据,`0x0057` 表示 IPv6 数据。 - **信息字段(Information)**:可变长度,包含网络协议的数据。 - **帧校验序列(FCS, Frame Check Sequence)**:2 或 4 字节,用于校验帧的完整性。 ### PPP协议的字节填充 PPP 协议使用字节填充(Byte Stuffing)来处理信息字段中可能出现的特殊字符。具体来说: - 如果信息字段中出现与标志字段相同的 `0x7E` 字符,则将其替换为 `0x7D 0x5E`。 - 如果信息字段中出现 `0x7D` 字符,则将其替换为 `0x7D 0x5D`。 这种方法确保了特殊字符不会被误认为是帧的边界,从而保证了数据的正确传输[^4]。 ### PPP协议的应用 PPP 协议广泛应用于多种网络环境中,例如: - **拨号上网**:早期的互联网接入主要依赖拨号连接,PPP 协议用于在调制解调器之间建立连接。 - **DSL(数字用户线路)**:许多 DSL 服务提供商使用 PPP 协议来管理用户的连接和认证。 - **嵌入式系统**:在嵌入式单片机中实现 PPP 协议,可以实现单片机与计算机之间的稳定数据传输。这种应用在家电控制和小型数据传输系统中具有广阔的前景[^1]。 ### PPP协议的优点 - **多协议支持**:PPP 协议可以封装多种网络协议的数据,适应性强。 - **灵活的认证机制**:支持 PAP 和 CHAP 等认证方式,提供不同的安全级别。 - **链路管理功能**:LCP 提供了链路建立、维护和拆除的功能,确保链路的稳定性。 - **字节填充机制**:通过字节填充,确保数据的完整性,避免特殊字符的干扰[^4]。 ### PPP协议的局限性 尽管 PPP 协议具有诸多优点,但也存在一些局限性: - **仅适用于点对点连接**:PPP 协议的设计初衷是用于点对点链路,因此在多点网络中不适用。 - **缺乏加密支持**:PPP 协议本身不提供加密功能,安全性依赖于上层协议(如 CHAP 或 IPsec)。 ### 示例代码:PPP协议的基本帧格式 以下是一个简单的 Python 示例,展示了如何构造一个 PPP 协议的基本帧格式: ```python def ppp_frame(protocol, data): # 标志字段 flag = b'\x7E' # 地址字段(默认为 0xFF) address = b'\xFF' # 控制字段(默认为 0x03) control = b'\x03' # 协议字段(例如 IPv4 为 0x0021) protocol_bytes = protocol.to_bytes(2, byteorder='big') # 信息字段(用户数据) information = data.encode('utf-8') # 帧校验序列(FCS,此处简化为固定值) fcs = b'\x00\x00' # 组合帧 frame = flag + address + control + protocol_bytes + information + fcs + flag return frame # 示例:构造一个 PPP 帧,协议为 IPv4,数据为 "Hello PPP" frame = ppp_frame(0x0021, "Hello PPP") print("PPP Frame:", frame.hex()) ``` 上述代码演示了如何构造一个简单的 PPP 帧,包括标志字段、地址字段、控制字段、协议字段、信息字段和帧校验序列。 ### PPP协议的扩展 PPP 协议可以通过扩展支持更多功能。例如: - **MP(Multilink PPP)**:多链路 PPP 允许将多个物理链路捆绑在一起,以提高带宽和可靠性。 - **PPPoE(PPP over Ethernet)**:在以太网上运行 PPP 协议,常用于 DSL 服务中。 ### PPP协议的标准化 PPP 协议的标准化工作主要由 RFC 文档完成。RFC 1661 定义了 PPP 协议的核心功能,包括如何封装多协议数据包、如何通过 LCP 建立链路以及如何通过 NCP 配置网络协议[^3]。 ### PPP协议的未来 随着网络技术的发展,PPP 协议的应用场景逐渐减少,尤其是在现代宽带网络中,许多服务已经转向基于以太网的协议(如 DHCP 和 IPv6 自动配置)。然而,在某些特定领域(如嵌入式系统和远程连接)中,PPP 协议仍然具有重要的地位。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小刘不忙!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值