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

PPP 是「点对点」协议:一根线只接两家,所以不需要地址,但可以慢慢谈条件。 它今天还在用的原因不是速率,是「认证 + 地址协商」这两件事别人替代不了。

📝 本节和前面几节的关系

3.4 讲完了无线,3.5 转到另一类链路:点对点。 这一节先看它和以太网的根本差别,下一节看它怎么建立连接。

一、点对点和多点的差别

一个前提不同,后面全不同:

| 维度 | 以太网(多点) | PPP(点对点) | |---|---|---|---| | 地址 | 需要 MAC | 不需要 | | 链路建立 | 插上就通 | 要先协商 | | 认证 | 没有 | 有(PAP/CHAP) | | 帧长 | 固定 64~1518 | 可变,可协商 |

第一行和第三行是同一个原因: 以太网是「一根线接很多家」,所以必须知道发给谁,也没法要求每个接入者先报身份; PPP 是「一根线只接两家」,所以不用地址,但可以慢慢谈条件、查身份。 第四行那个「帧长可变」很实用: 拨号时代链路质量差,两端可以谈一个更小的 MRU(最大接收单元),避免大帧更容易出错。 以太网做不到这一点,1518 是硬的。

二、它扛多种协议的办法

靠一个 2 字节的「协议字段」:

协议号 含义
0x0021 IPv4
0x0057 IPv6
0xC021 LCP(链路控制)
0x8021 IPCP(IP 控制)

这个字段相当于以太网的「类型」:它告诉接收方「后面这段数据该交给谁」。 所以一根电话线上可以同时跑 IP 和 IPv6,各打各的标签。 注意 0xC021 和 0x8021 不是「数据协议」,是「控制协议」: 它们用来「谈条件」,本身不传用户数据。 这就是 PPP 的分层设计:先谈链路(LCP),再认证,再谈网络(NCP),最后才传数据。 这个设计在当年是很先进的:它把「链路」和「网络」解耦了, 所以同一条 PPP 链路上可以换着跑不同的网络层协议。 IPv6 出来后不用改 PPP,加一个协议号就行。

三、为什么它还没死

因为它解决的两个问题别人替代不了:

| 能力 | 为什么重要 | 替代方案 | |---|---| | 认证 | 运营商要知道「你是谁、有没有欠费」 | 网页认证(体验差) | | 地址协商 | 动态分配 IP、DNS、网关 | DHCP(但要先有链路) |

第一行是运营商的刚需:没有认证,谁插上都能上网。 所以家用宽带至今还是「PPPoE 拨号 + 账号密码」,这个动作就是 PPP 那一套。 第二行那个「地址协商」也有意思:DHCP 能发地址,但它要求「链路已经通了」。 而 PPP 是「先谈链路、再谈地址」,所以它能在「链路刚建好、还没有地址」的阶段完成协商。 所以「PPP 过时了」这个说法不准确: 它只是从「拨号上网的主角」变成了「宽带接入的配角」—— 名字还在,功能还在,只是承载它的介质从电话线换成了以太网(PPPoE)。

四、动手 Demo:PPP 和以太网的差别,一句话说清

把两者按六个维度摆在一起,看哪些差别是「点对点」这个前提推出来的。 重点看「地址」和「认证」这两行:它们是同一个原因。

rows = [('地址', '需要 MAC,谁都能接', '不需要地址,只有两端'),
        ('链路建立', '插上就通', '要先协商(LCP)'),
        ('认证', '没有', '有(PAP/CHAP)'),
        ('帧长', '固定 64~1518', '可变,可协商'),
        ('差错检测', 'FCS 32 位', 'FCS 16 位'),
        ('多协议', '靠类型字段', '靠协议字段(2 字节)')]
for dim, eth, ppp in rows:
    print('%-8s 以太网 %-22s PPP %s' % (dim, eth, ppp))

for code, name in ((0x0021, 'IPv4'), (0x0057, 'IPv6'),
                   (0xC021, 'LCP'), (0x8021, 'IPCP')):
    print('协议号 0x%04X 是 %s' % (code, name))

实跑输出:

--------------------------------------------------------------------
PPP 和以太网的差别,一句话说清
--------------------------------------------------------------------
**PPP 是「点对点」协议,以太网是「多点」协议。**这一个差别,把后面所有的设计都决定了。

  维度         以太网                     PPP
  -----------------------------------------------------------------
  **地址**     **需要 MAC,谁都能接**     **不需要地址,只有两端**
  链路建立     插上就通                   **要先协商(LCP)**
  认证         没有                       **有(PAP/CHAP)**
  帧长         固定范围 64~1518          **可变,可协商**
  差错检测     FCS 32 位                  FCS 16 位
  多协议       靠类型字段                 **靠协议字段(2 字节)**

**第一行和第三行是同一个原因**:
**以太网是「一根线接很多家」,所以必须知道「发给谁」,也没法要求每个接入者先报身份;**
**PPP 是「一根线只接两家」,所以不用地址,但可以慢慢谈条件、查身份。**
**第四行那个「帧长可变」很实用**:
**拨号时代链路质量差,两端可以谈一个更小的 MRU(最大接收单元)**,
**避免大帧更容易出错。以太网做不到这一点,1518 是硬的。**
**第六行的「协议字段」是 PPP 能扛多种协议的关键**:
**0x0021 是 IPv4、0x0057 是 IPv6、0xC021 是 LCP、0x8021 是 IPCP。**
**所以一根电话线上可以同时跑 IP 和 IPv6,各打各的标签。**
**PPP 今天还在用,只是换了承载**:**家里的宽带拨号是 PPPoE(PPP over Ethernet)**,
**手机上网是 PPP 的变体。**
**它活下来的原因不是速率,是「认证 + 地址协商」这两件事别人替代不了。**

第一行和第三行其实是同一条:「一根线接很多家」→ 必须寻址、没法认证; 「一根线只接两家」→ 不用寻址、可以认证。 后面所有差别都是从这个前提推出来的。 「FCS 16 位 vs 32 位」这一行也值得看:PPP 的校验比以太网弱, 因为「点对点链路出错概率低」(没有共享介质的冲突),16 位够用,省 2 个字节。 最后那四个协议号是最实用的一组: 0xC021(LCP)和 0x8021(IPCP)是「控制」,0x0021 和 0x0057 是「数据」。 看到抓包里出现 C021,说明「正在建链路」;出现 0021,说明「链路已经通了,开始传 IP」。

30 秒实验

  1. 查一下你家宽带是不是 PPPoE 拨号(路由器 WAN 设置里能看到)。
  2. 想一下:如果 PPP 没有认证,运营商会怎么管控用户?
  3. 对比一下 PPP 和 PPPoE 的帧结构,看多了哪几个字节。

常见误区

  1. 以为 PPP 是「拨号专用的老协议」。 它今天还在跑,只是换了承载(PPPoE)。
  2. 以为 PPP「没有地址所以很简单」。 它要协商、要认证,比以太网复杂得多。
  3. 以为「PPP 的 FCS 16 位是偷工减料」。 点对点链路出错概率低,16 位够用。
自测三问(点开对答案) 1. PPP 和以太网最根本的差别是什么? —— **点对点 vs 多点。** 有线只接两家,所以不用地址,但可以认证、可以协商参数。 2. PPP 靠什么扛多种协议? —— **一个 2 字节的协议字段**:0x0021 是 IPv4、0x0057 是 IPv6、0xC021 是 LCP、0x8021 是 IPCP。 3. PPP 为什么到今天还在用? —— **认证和地址协商这两件事别人替代不了。**家用宽带的 PPPoE 拨号就是它。

下一节看 PPP 建立连接的三道关:LCP、认证、NCP。

相关笔记