📚 第三章 数据链路
📄 一句话概括

PPP 建链要过三道关:LCP 谈链路参数、认证报身份、NCP 要地址。 三个阶段对应三种典型故障——这就是「错误代码」在说的事。

📝 本节和前面几节的关系

3.5.1 讲了 PPP 是什么,这一节讲它怎么「从零开始建立一条能用的链路」。 顺序不能乱:先谈链路,再报身份,最后才要地址。

一、三道关

每一步谈的东西完全不同:

阶段 协议 协议号 谈什么
1 LCP 0xC021 最大帧长、要不要压缩、要不要认证
2 认证 0xC023/0xC223 报身份:PAP 明文两次、CHAP 三次
3 NCP(IPCP) 0x8021 要 IP、DNS、网关

第一行是「先把话说清楚」:两端要先就「帧最大能多大、要不要压缩」达成一致, 谈不成就不往下走。 这一步失败的表现是「连上了但立刻断」——因为链路层没建起来。 第三行是「我在这个网里叫什么」:NCP 家族里最常用的是 IPCP, 它做的事就是「申请一个 IP 地址、顺便把 DNS 要过来」。 这一步失败的表现是「拨号成功但没有网」——链路通了,地址没拿到。

二、PAP 与 CHAP 的差别

一个是明文、一个是挑战应答:

项目 PAP CHAP
密码是否上线 明文传 只传摘要
来回次数 2 次 3 次
能否防重放 不能 能(每次挑战不同)

第一行是关键:PAP 就是把用户名密码发过去,两次(一次请求、一次确认)。 所以「PAP 不安全」不是说密码短,是它明文传。 在线路上抓包就能看到。 第三行那个「防重放」是 CHAP 的价值:服务器每次发一个随机挑战,客户端用密码算摘要回传。 所以即使抓到这一次的摘要,下次也用不上——因为挑战变了。 但 CHAP 也不能防「中间人」:它只验证「对方知道密码」,不验证「对方是谁」。 所以后来才有 EAP、证书这些方案——本质都是「加一层身份证明」。

三、三个阶段对应三种故障

这张表在实际排障里非常好用:

卡在哪 表现 最可能的原因
LCP 谈不成 连不上 物理线断、光猫没同步
认证失败 反复重拨 账号密码错、欠费停机
NCP 失败 拨上但没网 地址池满、VLAN 配错

第二行「反复重拨」是个很典型的症状:认证失败后,客户端会隔一会儿重试, 所以日志里是「一连串的拨号记录」。 这种情况先查账号,别查线路。 第三行最容易被误判:「拨号成功、能 ping 通网关、但打不开网页」, 很多人会怀疑 DNS,其实可能是「NCP 没要到地址」。 判断办法是看 WAN 口有没有分到 IP——没有就是 NCP 没过。 所以「客服第一句总问错误代码」是有道理的:错误代码其实就是在说「卡在哪个阶段」。 知道阶段,就知道该查什么,这比「重启一下试试」高效得多。

四、动手 Demo:拨号不是「一拨就通」,要过三道关

把三个阶段的协议号与谈判内容列出来,再对照三种典型故障。 注意阶段顺序不能乱:先链路、再身份、最后地址。

phases = [(1, 'LCP', '0xC021', '最大帧长、压缩、认证'),
          (2, '认证', '0xC023/0xC223', 'PAP 明文两次 / CHAP 三次'),
          (3, 'NCP(IPCP)', '0x8021', 'IP、DNS、网关')]
for n, name, code, what in phases:
    print('阶段 %d %-10s %-14s %s' % (n, name, code, what))

for where, why in (('LCP 谈不成', '物理线断、光猫没同步'),
                   ('认证失败', '账号密码错、欠费'),
                   ('NCP 失败', '地址池满、VLAN 配错')):
    print('%-12s -> %s' % (where, why))

实跑输出:

--------------------------------------------------------------------
拨号不是「一拨就通」,要过三道关
--------------------------------------------------------------------
**PPP 建立连接的过程分三步,每一步谈的内容都不一样。**
**这也解释了为什么宽带断了之后「重拨要等十几秒」。**

  阶段     协议        协议号             谈什么
  -----------------------------------------------------------------------------------------
  1        **LCP**     0xC021             **谈链路参数**:最大帧长、要不要压缩、要不要认证
  2        认证        0xC023/0xC223     **报身份**:PAP 明文两次,CHAP 三次挑战
  3        **NCP**     0x8021             **谈网络参数**:给我一个 IP、DNS、网关

**第一行是「先把话说清楚」**:**两端要先就「帧最大能多大、要不要压缩」达成一致**,
**谈不成就不往下走。**
**这一步失败的表现是「连上了但立刻断」,因为链路层没建起来。**
**第二行是「你是谁」**:**PAP 是把用户名密码明文发两次(一次请求一次确认)**,
**CHAP 是服务器发挑战、客户端算摘要回传,来回三次,密码不上线。**
**所以「PAP 不安全」不是说它密码短,是它明文传。**
**第三行是「我在这个网里叫什么」**:**NCP 家族里最常用的是 IPCP**,
**它做的事情就是「申请一个 IP 地址、顺便把 DNS 要过来」。**
**这一步失败的表现是「拨号成功但没有网」**——**链路通了,地址没拿到。**
**三个阶段对应三种典型故障,这在实际排障里非常好用**:
  卡在哪         最可能的原因
  ---------------------------------------------
  LCP 谈不成     **物理线断、光猫没同步**
  认证失败       **账号密码错、欠费停机**
  NCP 失败       **局端地址池满了、VLAN 配错**

**这就是为什么客服第一句总问「错误代码是多少」**:**错误代码其实就是在说「卡在哪个阶段」。**

三个协议号是最实用的记忆点:0xC021 是 LCP、0xC023 是 PAP、0xC223 是 CHAP、0x8021 是 IPCP。 抓包里看到哪个,就知道现在进行到哪一步。 注意「认证」这一步是可选的:如果 LCP 阶段双方同意「不认证」,就直接跳到 NCP。 所以「专线」上常常看不到认证阶段——因为两端都是自己的设备,不需要查身份。 「NCP 是个家族」这件事也值得说清:IPv4 用 IPCP(0x8021),IPv6 用 IPV6CP(0x8057)。 所以一条 PPP 链路上可以同时协商 IPv4 和 IPv6 地址——这就是「双栈拨号」的实现方式。

30 秒实验

  1. 想一下:如果 LCP 阶段谈成了「不认证」,会发生什么?
  2. 查一下你路由器的拨号日志,看它走到了第几个阶段。
  3. 对比 PAP 和 CHAP 的来回次数,为什么 CHAP 要多一次?

常见误区

  1. 以为「拨号成功就等于能上网」。 NCP 还没过,链路通了但没地址。
  2. 以为 PAP 和 CHAP 只是「加密强度不同」。 PAP 是明文,抓包就能看到密码。
  3. 以为三个阶段可以乱序。 必须先链路、再认证、最后地址,因为后一步依赖前一步。
自测三问(点开对答案) 1. PPP 建链的三个阶段是什么?各用什么协议? —— **LCP(链路参数)、认证(PAP/CHAP)、NCP(IPCP 要地址)。** 2. PAP 和 CHAP 的关键差别是什么? —— **PAP 明文传密码、两次;CHAP 传摘要、三次,能防重放。** 3. 「拨号成功但打不开网页」大概是卡在哪个阶段? —— **NCP。** 链路通了但没要到 IP/DNS/网关。

下一节把 PPP 的帧拆开,看它怎么处理「数据里出现标志字节」。

相关笔记