3 点对点协议
约 2110 字大约 7 分钟
2025-06-08
PPP 协议由因特网工程任务组 (Internet Engineering Task Force, IETF) 于 1992 年制定,目前已成为因特网的正式标准 (RFC1661, RFC1662)。
PPP 协议主要应用于以下两个方面:
- 因特网用户通过点对点链路连接到因特网服务提供商 (Internet Service Provider, ISP),进而接入因特网。用户计算机与 ISP 通信时通常采用 PPP 协议。
- 广域网路由器之间的专用线路。
此外,1999 年还公布了可以在以太网上运行的 PPP 协议 (PPP over Ethernet, PPPoE),它使得 ISP 可以通过数字用户线路 (Digital Subscriber Line, DSL)、电路调制解调器以及以太网等宽带接入技术,以以太网接口的形式为用户提供接入服务。
3.3.1 PPP 协议的组成
PPP 协议由以下三部分组成:
- 链路控制协议 (Link Control Protocol, LCP):LCP 用于建立、配置、测试数据链路的连接以及协商一些选项。
- 网络层协议数据单元 (Protocol Data Unit, PDU) 封装到串行链路的方法:网络层 PDU 作为 PPP 帧的数据载荷被封装在 PPP 帧中传输。其长度受 PPP 协议的最大传送单元 (Maximum Transmission Unit, MTU) 的限制。PPP 协议既支持面向字节的异步链路,也支持面向比特的同步链路。
- 网络控制协议 (Network Control Protocol, NCP):NCP 包含多个协议,每个协议分别支持不同的网络层协议,例如 TCP/IP 中的 IP、Novell NetWare 网络操作系统中的 IPX 以及 Apple 公司的 AppleTalk。
3.3.2 PPP 协议的帧格式
PPP 帧由首部、数据载荷和尾部组成。

- 首部: 包括标志字段 (Flag, F)、地址字段 (Address, A)、控制字段 (Control, C) 和协议字段 (Protocol, P)。
- 数据载荷: 即信息字段 (Information, I),可以是网络层 PDU、LCP 分组或 NCP 分组。
- 尾部: 包括帧检验序列 (Frame Check Sequence, FCS) 字段和标志字段 (F)。
1. PPP 帧中各字段的含义
1) PPP 帧首部中的各字段
- 标志字段 (F): 长度为 1 字节,固定取值为
0x7E
。位于 PPP 帧的首部和尾部,作为帧的定界符。连续两个标志字段表示一个空帧,应丢弃。 - 地址字段 (A): 长度为 1 字节,固定取值为
0xFF
。 - 控制字段 (C): 长度为 1 字节,固定取值为
0x03
。 地址字段 A 和控制字段 C 目前对 PPP 帧没有实际意义。 - 协议字段 (P): 长度为 2 字节,用于指示信息字段 I (数据载荷) 的类型:
0x0021
:信息字段 I 是 IP 数据报。0xC021
:信息字段 I 是 PPP 链路控制协议的分组。0x8021
:信息字段 I 是 PPP 网络控制协议的分组。
2) PPP 帧的数据载荷
信息字段 I 就是 PPP 帧的数据载荷,其长度可变,最大不能超过 1500 字节,即 PPP 帧的最大传送单元为 1500 字节。
3) PPP 帧尾部中的各字段
- 帧检验序列 (FCS): 长度为 2 字节,采用循环冗余校验 (Cyclic Redundancy Check, CRC) 计算冗余码,用于 PPP 帧的差错检测。CRC 使用的生成多项式为 CRC-CCITT = X16+X12+X5+1。
- 标志字段 (F): 与 PPP 帧首部的标志字段 F 相同,作为帧的定界符。
2. PPP 帧的透明传输
当 PPP 帧的信息字段的内容中出现了和标志字段相同的内容 0x7E
,需要采用相应的措施来实现透明传输,以避免数据被错误地识别为帧的边界。
1) 字节填充
当 PPP 协议采用的是面向字节的异步链路时,使用字节填充来实现透明传输 (RFC 1662)。
具体方法如下:
- 将原信息字段中出现的每一个
0x7E
减去0x20
(相当于异或0x20
),然后在其前面插入转义字符0x7D
。这相当于将原信息字段中出现的每一个0x7E
字节转换成了 2 字节 (0x7D
、0x5E
)。 - 如果原信息字段中本身就含有转义字符
0x7D
,则把每一个0x7D
减去0x20
,然后在其前面插入转义字符0x7D
。这相当于将原信息字段中出现的每一个0x7D
字节转换成了 2 字节 (0x7D
、0x5D
)。 - 如果原信息字段中出现 ASCII 码的控制字符 (即数值小于
0x20
的字符),则将该字符的数值加上0x20
(相当于异或0x20
,将其转换成非控制字符),然后在其前面插入转义字符0x7D
。例如,出现0x03
(这是控制字符 ETX,即传输结束),就要将其加上0x20
,然后在其前面插入转义字符0x7D
,也就是将0x03
转换成了 2 字节 (0x7D
、0x23
)。
接收方收到 PPP 帧后,进行与发送方字节填充相反的变换,就可以正确地恢复出未经过字节填充的原始 PPP 帧。
2) 零比特填充
当 PPP 协议采用的是面向比特的同步链路 (例如 SONET/SDH) 时,使用零比特填充来实现透明传输。
具体方法如下:
- 发送方的数据链路层扫描数据载荷,只要出现 5 个连续的比特 1,就在其后填入一个比特 0。经过这种零比特填充后的数据载荷,就可以确保其不会包含帧定界符 (
01111110
)。 - 接收方的数据链路层在把数据载荷向上交付网络层之前,对数据载荷进行扫描,每发现 5 个连续的比特 1 时,就把其后的一个比特 0 删除,这样就可以还原出原始的数据载荷。
3.3.3 PPP 协议的工作状态
PPP 协议的工作状态可以用有限状态机来表示,下面以用户 PC 拨号接入 ISP 的拨号服务器这个过程为例,简要介绍 PPP 协议的工作状态。

各状态的解释如下:
- 静止 (Dead): PPP 链路的开始和结束状态。用户 PC 与 ISP 的拨号服务器之间不存在物理层连接。
- 建立 (Establish): 检测到调制解调器的载波信号并建立物理层连接后,PPP 进入此状态。
- 鉴别 (Authenticate): 在“建立”状态下,链路控制协议 LCP 开始协商一些配置选项,如最大帧长、鉴别协议等。若协商成功,则进入“鉴别”状态;若协商失败,则退回到“静止”状态。可以使用口令鉴别协议 (Password Authentication Protocol, PAP) 或挑战握手鉴别协议 (Challenge-Handshake Authentication Protocol, CHAP)。
- 网络 (Network): 若通信双方无须鉴别或鉴别身份成功,则进入“网络”状态;若鉴别失败,则进入“终止”状态。
- 打开 (Open): 进入“网络”状态后,PPP 链路的两端通过互相交换网络层特定的 NCP 分组来进行 NCP 配置。如果 PPP 链路的上层使用的是 IP 协议,则使用 IP 控制协议 (IP Control Protocol, IPCP) 来对 PPP 链路的每一端配置 IP 模块,例如分配 IP 地址。NCP 配置完成后,就进入“打开”状态。
- 数据通信: 只要链路处于“打开”状态,双方就可以进行数据通信。
- 终止 (Terminate): 当出现故障或链路的一端发出终止请求时,就进入“终止”状态。
- 静止 (Dead): 当载波停止后就回到“静止”状态。