PPP协议

本文详细介绍了PPP(点到点协议)的工作原理及应用。PPP是一种重要的数据链路层协议,适用于各种链路,从低速拨号连接到高速光纤。文章阐述了PPP的功能,包括动态IP分配、链路配置和维护等,并深入解析了PPP的六个阶段,以及LCP、NCP协议的具体协商过程。

PPP协议概述

PPP(Point-to-Point Protocol点到点协议)是为在同等单元之间传输数据包这样的简单链路设计的链路层协议。这种链路提供全双工操作,并按照顺序传递数据包。
PPP协议支持以下功能:

  • IP地址的动态分配和管理
  • 同步或异步的物理层通信
  • 链路的配置、质量检测和纠错
  • 多种配置参数选项的协商

PPP是目前使用最广泛的数据链路层协议,不管是低速的拨号猫连接还是高速的光纤链路,都适用PPP协议。因特网用户通常都要连接到某个ISP 才能接入到因特网。 PPP协议就是用户计算机和ISP进行通信时所使用的数据链路层协议。 ISP使用PPP协议为计算机分配一些网络参数(如IP地址、域名等)。

PPP协议是一个协议集,主要包含下面三部分

  1. LCP( Link Control Protocol)链路控制协议
  2. NCP( Network Control Protocol)
  3. PPP的扩展协议(如Multilink Protocol,

后面我们会提到PPP链路建立过程中涉及到了 认证, 但认证阶段使用到的CHAP/PAP等协议本身不属于PPP协议的范畴。(其实默认情况下“认证阶段”是缺省的,即PPP链路默认是不进行认证的)

PPP协议的六个阶段

1. 链路不可用阶段: 初始阶段
2. 链路建立阶段: LCP协商,(协商认证方式等)
3. 验证阶段: PAP/CHAP验证
**4. 网络层协议阶段:**NCP协商
5. PPP会话维持阶段: 维持PPP会话, 定时发送Echo Request报文,并等待Echo Reply报文
6. 网络终止阶段: 终止PPP会话,回到链路不可用阶段。

(一)PPP 帧

  PPP帧从HDLC(High-level link Control)。
这里写图片描述

  • Flag:标志位、用于标识帧的开始和结束
  • Addr:地址位,用于标识Station地址。PPP帧发源自HDLC帧,保留了此字段。对于PPP帧来说,由于是点对点协议,不需要地址位。PPP帧的地址位恒为0xFF。(PPP协议被运用在点对点链路上,不需要知道对端的链路地址,因为点对点链路,如PPPoE帧头中,已经确定了对端的地址)。
  • Control:在DHLC帧中,Control位用来标识帧的顺序和重传行为,但由于该功能在PPP协议中并没有普遍实现,因此PPP帧中,Control值固定为)0x03.
  • Protocol:协议字段,标识所携带报文的类型。如0x0021时,表示PPP帧的信息字段是IP数据报文。不同的Protocol标识Data字段的不同含义。
    ISO标准下 的协议域类型:
Protocol对应的Data域的含义
0x0***-0x3***网络层的数据报文
0x4***-0x7***与NCP无关的第整流量
0x8***-0xb***网络控制协议(NCP)的数据报文
0xc***-0xf***链路控制协议(LCP)的数据报文



常用的几种Protocol取值:

Protocol信息字段
0x0021IP数据报
0x8021网络控制数据NCP
0xC021链路控制数据LCP
0xC023安全性认证PAP
0xC223安全性认证CHAP

+ Data: 信息字段,即PPP帧的负载(如LCP帧、NCP帧).信息域缺省时最大长度不能超过1500字节,其中包括填充域的内容
+ Pad: 填充字段
+ FCS:循环冗余码。 覆盖了两个Flag(不包括)之间的字段。

  • 注:
      由于Addr和Control字段在PPP帧中是固定值,在传输过程中经常使用Address and Control Field Compression (ACFC)选项省略掉这两个字段。
    这里写图片描述

PPP工作流程

a) LCP协商阶段:创建链路完成链路的启动、测试、任选参数的协商和最终链路的断开
b)认证阶段: LCP向对端发送协商请求, 双方确定链路的配置参数后,LCP向认证层发送Up事件。常用的认证协议有PAP(口令验证协议)和CHAP(挑战握手验证协议)。
c) NCP协商阶段(IPCP等协议):调用链路层创建阶段选定的网络控制层协议。主要包括动态分配IP地址功能等。常用的NCP协议有IPCP协议。
d)会话维持阶段:进行PPPoE心跳保活
**d)PPP正常终结:**NCP分别终结,然后LCP终结,最后物理层终结

一、 LCP 协商

  LCP(Link Control Protocol)用来创建链路完成链路的启动、测试、任选参数的协商和最终链路的断开
  LCP的操作只关注连接的两端,而不在乎Mac层协议(如以太网协议、WIFI),也就是不需要考虑具体的传输媒介是什么。

LCP帧

  LCP帧以PPP帧为基础。格式如下:
这里写图片描述

LCP帧有自己特有的四个字段:Code、Ident、Length、LCP Data。
另外,(PPP帧的)字段Protocol的值应为0xC021,标识该PPP帧为LCP帧。
+ Code: 表示LCP数据报文(Request或Reply)类型。 值如下:

CodeDescriptionCodeDescription
0x01configure-request0x08Protocol-REJECT
0x02configure-ACK0x09echo-request
0x03configure-NACK0x0Aecho-reply
0x04configure-REJECT0x0Bdiscard-request
0x05teminate-request0x0Cidentification
0x06terminate-ACK0x0DTime-Remaining
0x07code-REJECT

+ Ident:标识域。LCP报文的序列号,用于匹配Request和Reply报文。 由Request帧的发送者生成,在之后的序列帧中递增。对于应答报文(如ACK,NACK,REJECT应答报文, Ident帧的值是从Request报文中copy过来的。(由此,Request方可以通过Ident字段识别Rely的对应关系)。
+ Length: LCP报文的长度,以字节为单位。 Code+Ident+Length+LCP Data
+ LCP Data: LCP数据报文。

不同类型的LCP帧的作用:

帧 类型用途
configure 帧对链路两端进行最基本的配置
Terminate帧链路通信完成时,对链路连接进行清理操作
echo 帧用来确认一些操作, 一个活动的链路随时会发送echo帧
discard-request 帧用于测量链路的性能
identification 帧 Time-Remaining帧用于一些管理操作

总的来说,LCP帧根据用途可以分为三大类, 链路配置报文,链路终止报文,链路维护报文:

(1). 链路配置报文:
  包含Config-Request、Config-Ack、Config-Nak和Config-Reject四种报文。
  当通信双方需要建立链路时,双方都需要发送Config-Request报文并携带自已所希望协商的配置参数选项。当接收方收到Config-Request报文时,会根据是否识别、认可Configure-Request报文中的配置参数来在剩下的三种配置报文中选择一种应答。 如果识别且认可全部参数,则应答Configure-ACK报文(携带全部配置参数); 如果识别,但只认可部分配置参数,则应答configure-NACK报文(携带不认可的配置参数); 如果不能识别所有的配置,则应答configure-Reject报文(携带全部报文)。
LCP的配置选项(配置报文的数据域),是一些TLV(Type、Length、Value)组。

(2). 链路终止报文:
  包含Terminate-Request和Terminate-Reply两种报文。
  LCP报文中提供了一种机制来关闭一个点对点的连接,想要关断链路的一端会持续发送Terminate-Request报文,直到收到一个 Terminate-Reply为止。接收端一旦收到了一个Terminate-Request报文后,必须回应一个Terminate-Reply报 文,同时等待对端先将链路断开后,再完成本端的所有断开的操作。
(3). 链路维护报文:
  链路维护报文中比较杂。比如,我们需要定时进行PPP保活(确认当前PPP链路是否仍在活跃状态),则PPP链路双方分别发送Echo Request报文,如果对方回复了Echo Reply报文,则表示PPP链路仍在活跃状态。

LCP协商过程

Created with Raphaël 2.1.0ClientClientServerServerConfig-RequestConfig-AckConfig-RequestConfig-Ack

LCP 两端通过发送LCP Config-Request和Config-Ack交互协商选项。 LCP一方通过发送LCP Config-Request来向另一方请求自己需要的LCP协商选项。如果Config-Request报文的接收方支持并接受这些选项则回复LCP Config-Ack报文。如果Config-Request部分(或者全部)不支持所有的LCP选项则回复其他报文。
(1)Config-ACK:若完全支持对端的LCP选项,则回应Config-ACK报文,报文中必须完全协带对端Request报文中的选项。
(2)Config-NAK:若支持对端的协商选项,但不认可该项协商的内容,则回应Config-NAK报文,在Config-NAK的选项中填上自己期望的内容,如:对端MRU值为1500,而自己期望MRU值为1492,则在Config-NAK报文中埴上自己的期望值1492。
(3)Config-Reject:若不能支持对端的协商选项,则回应Config-Reject报文,报文中带上不能支持的选项,如Windows拨号器会协商CBCP(被叫回呼),而ME60不支持CBCP功能,则回将此选项拒绝掉。

—-Config-request报文———
这里写图片描述
—-Config-Ack报文———
这里写图片描述

二. 认证阶段

  PPP认证,常用认证协议有PAP(口令验证协议)和CHAP(挑战握手验证协议)
  会话双方通过LCP协商好的认证方法进行认证,如果认证通过了,才可以进行下面的网络层的协商。认证过程在链路协商结束后就进行。
+ PAP验证: 两次握手,明文传输口令,安全性低
+ CHAP验证: 三次握手, 密文传输口令。
PAP验证过程

Created with Raphaël 2.1.0ClientClientServerServerRadiusRadiusAuth-ReqAuth-ReqAuth-AckAuth-ACK

CHAP验证过程:

Created with Raphaël 2.1.0ClientClientServerServerRadiusRadiusWaitChallenge(CHAP)ResponseResponseSuccessSuccess

三. NCP协商协议

  NCP有很多种,如IPCP、BCP、IPv6CP,最为常用的是IPCP(Internet Protocol Control Protocol)协议。NCP的主要功能是协商PPP报文的网络层参数,如IP地址,DNS Server IP地址,WINS Server IP地址等。PPPoE用户主要通过IPCP来获取访问网络的IP地址或IP地址段。
  NCP流程与LCP流程类似,用户与ME设备之间互相发送NCP Config-Request报文并且互相回应NCP Config-Ack报文后,标志NCP己协商完,用户上线成功,可以正常访问网络了。
  NCP协商协议的基本流程如下:

Created with Raphaël 2.1.0ClientClientServerServerConfiguration-RequestConfiguration-ACKConfiguration-RequestConfiguration-ACK

用户和接入设备对IP服务阶段的一些要求进行多次协商,以决定双方都能够接收的约定。
  通LCP类似,当Request中的一些选项不被接收方接受时, 接收方不会回复Configuration-ACK报文,而是回复其他如Configuration-NACK报文。

NCP Configuration-Request报文

这里写图片描述
NCP Configuration-NAK报文
这里写图片描述

四. 会话维持(Session Keep-alive)

设备主动发送Echo Request进行PPPoE心跳保活,若3次未得到服务器的响应,则设备主动释放地址。发LCP Echo Request 的时候,魔术字字段要和之前通信的Configure_Request使用的魔术字字段保持一致。
有些设备或终端不支持主动发送 Echo-Request 报文, 只能支持回应Echo-Reply报文。

五. 会话结束(Session Termination)

PPPoE 还有一个PADT(PPPOE Active Discovery Terminate)分组,它可以在会话建立后的任何时候发送,来终止PPPoE会话,也就是会话释放。它可以由主机或者接入集中器发送,目的地址填充为对端的以太网的MAC地址。
当对方接收到一个 PADT(PPPOE Active Discovery Terminate)分组,就不再允许使用这个会话来发送PPP业务。PADT分组不需要任何标签,其CODE字段值为0xa7(PADT Code),SESSION-ID字段值为需要终止的PPP会话的会话标识号码。在发送或接收PADT后,即使正常的PPP终止分组也不必发送。PPP对端应该使用PPP协议自身来终止PPPoE会话,但是当PPP不能使用时,可以使用PADT。

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. **认证阶段(可选)**:如果链路配置中指定了认证方式,则在此阶段进行身份验证。例如,PAPCHAP 会在此阶段执行认证流程。如果认证失败,链路将被终止[^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 协议可以封装多种网络层协议的数据,适应性强。 - **灵活的认证机制**:支持 PAPCHAP 等认证方式,提供不同的安全级别。 - **链路管理功能**: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 允许将多个物理链路捆绑在一起,以提高带宽和可靠性。 - **PPPoEPPP over Ethernet)**:在以太网上运行 PPP 协议,常用于 DSL 服务中。 ### PPP协议的标准化 PPP 协议的标准化工作主要由 RFC 文档完成。RFC 1661 定义了 PPP 协议的核心功能,包括如何封装多协议数据包、如何通过 LCP 建立链路以及如何通过 NCP 配置网络层协议[^3]。 ### PPP协议的未来 随着网络技术的发展,PPP 协议的应用场景逐渐减少,尤其是在现代宽带网络中,许多服务已经转向基于以太网的协议(如 DHCP 和 IPv6 自动配置)。然而,在某些特定领域(如嵌入式系统和远程连接)中,PPP 协议仍然具有重要的地位。 ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值