Appearance
PPP 点对点协议
2026 大纲 三(七)1 广域网的基本概念(第一节承载)与 三(七)2 PPP 协议(本篇主体)。组帧的通用机制在《封装成帧》,与 HDLC 的完整对比表在《HDLC》。
一、前面讲的是原理,实际链路上跑的是什么
停等、GBN、SR 讲的是可靠传输的一般原理,前面已经说过,以太网一个都不用。那么真实的点对点链路上到底跑的是什么协议?答案是 PPP——用户拨号或宽带接入 ISP 时用的就是它。
而 PPP 长成什么样,几乎完全由它所处的场景决定,所以先把场景说清楚。
广域网与局域网的真正分界不是公里数,而是"点对点信道 vs 广播信道"。 公里数只是结果:
| 维度 | 局域网 | 广域网 |
|---|---|---|
| 归属 | 一个单位所拥有 | 运营商建设运营,跨越多个所有者 |
| 信道类型 | 广播信道(一台机器发,所有机器都收得到) | 点对点信道(结点交换机一对一) |
| 因此需要 | 介质访问控制(谁能发、什么时候发) | 不需要介质访问控制;需要路由与转发 |
| 链路层协议 | 以太网 MAC、802.11 MAC 等 | PPP 等点对点协议 |
| 核心问题 | 共享介质的仲裁 | 长距离下的差错、时延与拥塞 |
广域网 WAN 作用范围几十到几千公里(城域网约 5~50 km,局域网 1 km 左右)。教材的定位是:"广域网是互联网的核心部分,其任务是长距离运送主机所发送的数据。连接广域网各节点交换机的链路一般都是高速链路,具有较大的通信容量。" 它由结点交换机(把整个分组先收下、查表、再从某条出线发出,即存储转发)与高速链路组成,内部走分组交换而非电路交换。
广域网不单独构成一条端到端路径,它是路径上的一段。(三种交换方式见《计算机网络概述》,数据报与虚电路见《网络层的功能》。)
二、设计哲学:简单是首要需求
IETF 给 PPP 列了十条需求:① 简单 ② 封装成帧 ③ 透明性 ④ 多种网络层协议 ⑤ 多种类型链路 ⑥ 差错检测 ⑦ 检测连接状态 ⑧ 最大传送单元 ⑨ 网络层地址协商 ⑩ 数据压缩协商。其中 ②③ 的实现手段(帧定界与两套填充)在《封装成帧与透明传输》,④ 由 NCP 承担、⑥⑦⑧⑨⑩ 见下文。
"简单"是首要需求,理由是分工:体系结构已把最复杂的部分放在 TCP 里,IP 提供的是不可靠数据报服务,因此数据链路层没有必要提供比 IP 更多的功能——不纠错、不设序号、不做流量控制。落到实处:"如 CRC 检验正确,就收下这个帧;反之,就丢弃这个帧,其他什么也不做。"
"其他什么也不做"是理解 PPP 的钥匙:不是能力不足,是刻意的分工。
那为什么还保留检错?因为"若在数据链路层不进行差错检测,那么已出现差错的无用帧就还要在网络中继续向前转发,因而会白白浪费许多的网络资源"。检错是尽早止损,不是保证送达——别因为 PPP 有 FCS 就以为它可靠。
由这条哲学直接得出三条硬限制:不提供流量控制、只支持全双工、不支持多点线路。
三个组成部分
| 组成部分 | 作用 |
|---|---|
| 封装方法 | 把 IP 数据报封装到串行链路,既支持异步链路也支持面向比特的同步链路 |
| LCP 链路控制协议 | 建立、配置和测试数据链路连接(RFC 1661 定义 11 种 LCP 分组);协商 MRU、是否鉴别等 |
| NCP 网络控制协议 | 一族协议,每种网络层协议一个;IP 对应 IPCP(协议字段 0x8021),协商 IP 地址等参数 |
NCP 让 PPP 成为与网络层协议无关的通用承载——"PPP 协议两端的网络层可以运行不同的网络层协议,但仍然可使用同一个 PPP 协议进行通信"。这与局域网拆出 LLC 子层适配多种局域网(见《以太网》)是同一思路:把多样性收敛到一个可插拔的模块里。
三、帧格式:字段的"退化"是场景的直接结果
"PPP 帧的首部和尾部分别为四个字段和两个字段":
| 标志 F | 地址 A | 控制 C | 协议 | 信息 | FCS | 标志 F | |
|---|---|---|---|---|---|---|---|
| 值 | 0x7E | 0xFF | 0x03 | 见下 | 上层数据 | CRC | 0x7E |
| 长度 | 1 B | 1 B | 1 B | 2 B | ≤1500 | 2 B | 1 B |
协议字段指示信息字段里装的是什么:0x0021 IP 数据报、0xC021 LCP、0x8021 网络层控制数据(NCP / IPCP)、0xC023 PAP、0xC223 CHAP。
地址与控制字段固定成 0xFF / 0x03,是因为点对点链路上寻址与编号本就不存在——只有两个端点,说"发给谁"毫无意义;不设序号,控制字段也没什么可控制的。那为什么不干脆删掉?因为格式一改所有实现都要跟着改。折中方案是:双方可以通过 LCP 协商省略这两个字节——所以"不能省略"和"总是被省略"都错。
固定开销共
两条格式细节:MTU 指信息字段的最大长度,不是帧总长(默认 1500 字节,完整帧最长约 1508;RFC 1661 中叫 MRU);连续两个标志字段表示这是一个空帧,应当丢弃——连续两帧之间只需要一个标志字段。
四、透明传输:两套方案由物理层决定
PPP 用 0x7E 作定界标志,信息字段里若出现 0x7E,接收方会误判帧边界。两套方案的分界依据是"面向字节 vs 面向比特",不是协议本身的选择,两套不能混用。
异步链路:字节填充
| 情形 | 原字节 | 填充结果 |
|---|---|---|
| 出现标志字节 | 0x7E | 0x7D 0x5E |
| 出现转义字节本身 | 0x7D | 0x7D 0x5D |
出现 ASCII 控制字符(小于 0x20) | 如 0x03 | 0x7D 0x23 |
统一规律:需转义的字节一律改写成 0x7D + (该字节 XOR 0x20);接收方遇到 0x7D 就丢弃它、把紧跟的下一字节与 0x20 异或还原。
为什么控制字符也要转义:异步串行线路上某些控制字符(如 XON/XOFF 流控字符)会被调制解调器或线路设备解释成命令,而不是当作数据透传。而异或 0x20 相当于翻转第 6 位,好处有三:① 可逆(异或两次还原);② 把小于 0x20 的控制字符抬到 0x20 以上,正好避开控制字符区;③ 把 0x7E/0x7D 映射到 0x5E/0x5D,都不与标志、转义符冲突。
走一遍。信息字段原始数据(十六进制)为 7E 7D 03 41 20 1F:
| 原字节 | 是否转义 | 判定依据 | 结果 |
|---|---|---|---|
7E | 是 | 等于标志字节 | 7D 5E( |
7D | 是 | 等于转义字节 | 7D 5D( |
03 | 是 | 7D 23( | |
41 | 否 | 既非 7E/7D,也 | 41 |
20 | 否 | 20 | |
1F | 是 | 7D 3F( |
三类条件要逐一核对,最容易错的是 0x20 本身——规则是"小于 0x20",0x20 不满足,不转义。
填充结果:7D 5E 7D 5D 7D 23 41 20 7D 3F,原始 6 字节 → 10 字节。字节填充的开销是数据相关的——最好 1 倍(无需转义),最坏 2 倍(每字节都要转义)。
同步链路(SONET/SDH):零比特填充
发送方"只要发现有 5 个连续 1,则立即填入一个 0",接收方则"把这 5 个连续 1 后的一个 0 删除"。教材的措辞是"不会出现 6 个连续 1"而非"不会出现 01111110"——前者更强也更准确。
关键在于插完 0 之后计数要清零重新数。 举例:信息字段原始比特串 0110 1111 1111 1111 1111 0010(24 位),位 5 起是连续 16 个 1。数到第 5 个 1 → 插 0、清零;再数 5 个 → 插 0、清零;再数 5 个 → 插 0、清零;剩下 1 个 1 不足 5,不插。
填充后为 011011111011111011111010010,共 27 位,插入 3 个 0。一般结论:
最坏情况数据全是 1,膨胀比趋近
接收方为什么不会误删原始数据里的 0? 因为发送方保证了填充后的信息字段里不会出现 6 个连续 1。接收方只要看到 5 连 1,就可以确定后面那个 0 一定是填充进去的——如果它是原始数据的一部分,发送方一定会在它之前再插一个 0。这个"发送方的不变式"是接收方能无歧义还原的全部依据。
五、工作状态:LCP 是 NCP 的载体
"PPP 链路的起始和终止状态永远是'链路静止'(Link Dead)状态"——此时用户电脑与 ISP 路由器之间并不存在物理层连接。
建立顺序是"物理层 → LCP → 鉴别 → NCP → 数据传输",释放严格反序,两者都不能颠倒。 原因只有一句:LCP 是 NCP 的载体——IPCP 分组本身要封装成 PPP 帧在链路上传送,链路都没建起来,NCP 无从谈起。
阶段一:链路建立(LCP 协商)。 发起方发送 LCP 配置请求帧(Configure-Request),对端回三种响应之一:
| 响应 | 含义 |
|---|---|
| 配置确认帧(Configure-Ack) | 所有选项都接受 |
| 配置否认帧(Configure-Nak) | 所有选项都理解但不能接受 |
| 配置拒绝帧(Configure-Reject) | 选项有的无法识别或不能接受,需要协商 |
Nak 是"我看懂了但不同意"(可以还价),Reject 是"我根本不认识这个选项"(只能作罢)。 LCP 配置选项包括链路上的最大帧长、所使用的鉴别协议的规约,以及是否省略地址和控制字段。
阶段二:鉴别(可选)。 进入"鉴别"状态后,只允许传送 LCP 协议的分组、鉴别协议的分组以及监测链路质量的分组——用户数据一个字节也过不去。若鉴别失败转到"链路终止",成功或无须鉴别则进入"网络层协议"状态。
| 协议 | 握手 | 口令是否上链路 | 安全性 |
|---|---|---|---|
| PAP 口令鉴别协议 | 两次握手 | 明文传输 | 低 |
| CHAP 口令握手鉴别协议 | 三次握手 | 不传输(传的是哈希结果) | 高 |
两次握手与三次握手的差别,本质是有没有引入一个一次性的随机数。 CHAP 的机理:① 服务端先发一个随机质询值(challenge);② 客户端把"质询值 + 口令"一起做单向哈希,只把哈希结果发回去;③ 服务端用自己保存的口令做同样的运算,比对是否一致。口令本身从未上链路,且每次质询值都不同——即使攻击者截获了这次的哈希结果,也没法用在下一次。PAP 明文传口令,截获一次就永久有效。
阶段三:网络层协议配置(NCP 协商)。 链路两端的 NCP 根据网络层的不同协议互相交换控制分组。跑 IP 时用 IPCP 配置 IP 协议模块(如分配 IP 地址),IPCP 分组也封装成 PPP 帧(协议字段 0x8021)在 PPP 链路上传送;低速链路上双方还可以协商使用压缩的 TCP 和 IP 首部。
阶段四:链路打开。 双方还可发送回送请求(Echo-Request)与回送回答(Echo-Reply)LCP 分组来检查链路状态。
阶段五:链路终止。 一端发出终止请求(Terminate-Request),收到对方的终止确认(Terminate-Ack)后转到"链路终止";链路故障也会从"链路打开"转到"链路终止";载波停止后回到"链路静止"。释放顺序是"NCP 释放网络层连接,收回原来分配出去的 IP 地址。接着,LCP 释放数据链路层连接。最后释放的是物理层的连接"。
由这套流程还得出一条结论:PPP 不是纯粹的数据链路层协议——它还含物理层(载波检测、拨号触发状态迁移)与网络层(NCP 协商 IP 地址、DNS 地址、首部压缩)的内容。这与《以太网》里"局域网工作的层次跨越了数据链路层和物理层"是同类现象——实际协议往往不严格贴合分层模型,分层是理解工具而不是实现约束。
六、PPP 与 HDLC:三条结论
完整对比表在 HDLC 篇,此处只留三条:① PPP 面向字节、不可靠,HDLC 面向比特、I 帧带序号可提供可靠传输;② PPP 只支持点对点全双工,HDLC 还支持多点链路且有主站/从站/复合站之分;③ PPP 有 NCP,HDLC 没有。锚点:PPP 面向字节无序号,HDLC 面向比特有序号。
本节小结
- 广域网与局域网的真正分界不是公里数,而是"点对点信道 vs 广播信道"。这直接解释了 PPP 帧的长相:地址与控制字段退化成固定值、没有最小帧长、固定开销只有 8 字节。
- PPP 的设计哲学是"简单":不纠错、不设序号、不做流量控制,"其他什么也不做";但保留检错以尽早止损。三个组成部分是封装方法、LCP、NCP,NCP 让两端可跑不同网络层协议却共用同一个 PPP。
- 两套透明传输由物理层决定:异步用字节填充(最坏膨胀 2 倍),同步用零比特填充(插完重新计数,最坏 1.2 倍)。工作状态按"物理层 → LCP → 鉴别 → NCP"建立、严格反序释放,因为 LCP 是 NCP 的载体。
考点速记
PPP 本身在真题里不单独成题。 拿"PPP""点对点协议"去查历年真题的题干与选项,命中的几道全是把它当对照项用的——分层模型题里拿它举例说明"链路层协议",协议归属题里拿它与以太网、HDLC 并列。没有一道题考 PPP 的帧格式、LCP/NCP 流程或鉴别协议。
这不等于超纲:大纲三(七)2 明确列着 PPP 协议,只是历年考查的重心落在了以太网与 802.11 那一侧——它们才是广播信道,问题更多。
本节真正需要带走的是三件会在别处被用到的事:
- 零比特填充的规则与"插完清零"——这一条是那道 HDLC 组帧题(cn-2013-37)的直接依据,本节的两套方案与它是同一套规则;那道题渲染在封装成帧的练习区,完整走查也记在那一篇。
- "点对点 vs 广播"这条分界——它解释了以太网为什么需要 MAC 地址、为什么有 64 B 最小帧长,而 PPP 两样都不需要。判断题里常拿这两个协议的差异做文章。
- PPP 不提供可靠传输——它有 FCS 但没有序号与确认。选项里说"PPP 提供可靠传输"或"PPP 有流量控制"一律错。
易错:PPP 有 FCS 但不可靠。 检错只是尽早止损,坏帧直接丢弃、不重传。同理它也不提供流量控制。
易错:地址与控制字段可以通过 LCP 协商省略。 "不能省略"和"总是被省略"都错——默认带着,协商后可以不带。
易错:MTU 指信息字段的最大长度(1500 B),不是帧总长(约 1508 B)。这一条与封装成帧那里是同一个坑。
易错:字节填充的判据是"小于
0x20",0x20本身不转义。 三类条件要逐一核对。
易错:零比特填充插完 0 要重新计数。
个连续 1 插 个 0,不是 个。
易错:建立顺序是"物理层 → LCP → 鉴别 → NCP",释放严格反序。 顺序颠倒不成立,因为 LCP 是 NCP 的载体。
教材出处
- 谢希仁《计算机网络》(第 8 版)印刷 p19–p20,1.5.2 几种不同类别的计算机网络:按作用范围的四类划分——"广域网 WAN……广域网的作用范围通常为几十到几千公里,因而有时也称为远程网(long haul network)。广域网是互联网的核心部分,其任务是长距离(例如,跨越不同的国家)运送主机所发送的数据。连接广域网各节点交换机的链路一般都是高速链路,具有较大的通信容量";以及城域网(5~50 km)、局域网(1 km 左右)、个人区域网的界定。同页指出该书"不专门讨论广域网"。
- 同书印刷 p79–p80,3.2.1 PPP 协议的特点:IETF 的十条需求,其中"简单"被列为首要需求——"IETF 在设计互联网体系结构时把其中最复杂的部分放在 TCP 协议中,而网际协议 IP 则相对比较简单……数据链路层没有必要提供比 IP 协议更多的功能。因此,对数据链路层的帧,不需要纠错,不需要序号,也不需要流量控制",以及"接收方每收到一个帧,就进行 CRC 检验。如 CRC 检验正确,就收下这个帧;反之,就丢弃这个帧,其他什么也不做";差错检测的理由——"若在数据链路层不进行差错检测,那么已出现差错的无用帧就还要在网络中继续向前转发,因而会白白浪费许多的网络资源";MTU 的界定——"MTU 是数据链路层的帧可以载荷的数据部分的最大长度,而不是帧的总长度"(脚注:MTU 默认 1500 字节,RFC 1661 中叫 MRU);网络层地址协商的必要性;以及三条硬限制——"PPP 协议不需要进行纠错,不需要设置序号,也不需要进行流量控制。PPP 协议不支持多点线路……而只支持点对点的链路通信。此外,PPP 协议只支持全双工链路"。同页给出 PPP 的三个组成部分(封装方法、LCP、NCP),并注明"在 RFC 1661 中定义了 11 种类型的 LCP 分组"。
- 同书印刷 p80–p81,3.2.2 PPP 协议的帧格式:帧结构——"PPP 帧的首部和尾部分别为四个字段和两个字段";标志字段
0x7E、地址字段0xFF、控制字段0x03及"可见这两个字段实际上并没有携带 PPP 帧的信息";"连续两帧之间只需要用一个标志字段。如果出现连续两个标志字段,就表示这是一个空帧,应当丢弃";协议字段取值;信息字段"长度是可变的,不超过 1500 字节"。 - 同书印刷 p81–p82:字节填充的三条规则(RFC 1662)——"把信息字段中出现的每一个
0x7E字节转变成为 2 字节序列 (0x7D,0x5E)"、"若信息字段中出现一个0x7D的字节……则把0x7D转变成为 2 字节序列 (0x7D,0x5D)"、"若信息字段中出现 ASCII 码的控制字符(即数值小于0x20的字符),则在该字符前面要加入一个0x7D字节,同时将该字符的编码加以改变。例如,出现0x03……就要把它转变为 2 字节序列 (0x7D,0x23)";零比特填充——"PPP 协议用在 SONET/SDH 链路时,使用同步传输……只要发现有 5 个连续 1,则立即填入一个 0。因此经过这种零比特填充后的数据,就可以保证在信息字段中不会出现 6 个连续 1",接收端"每当发现 5 个连续 1 时,就把这 5 个连续 1 后的一个 0 删除"。 - 同书印刷 p82–p83,3.2.3 PPP 协议的工作状态:状态图(图 3-12)与各阶段——"PPP 链路的起始和终止状态永远是……'链路静止'状态";LCP 配置请求的三种响应(Configure-Ack / Configure-Nak / Configure-Reject)及各自含义;LCP 配置选项包括最大帧长、鉴别协议规约、"以及不使用 PPP 帧中的地址和控制字段(因为这两个字段的值是固定的,没有任何信息量,可以在 PPP 帧的首部中省略这两个字节)";鉴别状态的限制——"在这一状态,只允许传送 LCP 协议的分组、鉴别协议的分组以及监测链路质量的分组";PAP 与 CHAP;NCP 与 IPCP(协议字段
0x8021)及首部压缩协商;链路打开状态的 Echo-Request / Echo-Reply;终止流程;释放顺序——"NCP 释放网络层连接,收回原来分配出去的 IP 地址。接着,LCP 释放数据链路层连接。最后释放的是物理层的连接";以及结论——"由此可见,PPP 协议已不是纯粹的数据链路层的协议,它还包含了物理层和网络层的内容","PPP 协议两端的网络层可以运行不同的网络层协议,但仍然可使用同一个 PPP 协议进行通信"。 - 同书印刷 p84:局域网"网络为一个单位所拥有",是本篇局域网/广域网归属一栏的依据。