
简介这份PDF面向网络工程师、运维人员及备考网络技术认证的学习者系统讲解广域网中广泛使用的PPP协议及其扩展技术帮助读者理解点对点链路的数据封装、认证与接入原理。资源为单个PDF文档压缩包约341KB内容以图文结合的技术说明为主结构紧凑便于快速查阅与复习。文档围绕PPP协议组件展开涵盖链路控制协议LCP、网络层控制协议NCP以及PAP明文验证与CHAP挑战握手验证的流程对比同时梳理PPP从链路初始化、身份验证、网络层参数协商到数据传输的完整运行过程。针对带宽与可靠性需求还介绍了多链路PPP的聚合方式、协商过程与容错作用并延伸至PPPoE技术说明Server与Client在ADSL宽带接入中的角色分工。目前已有122人学习适合希望夯实广域网基础、理清认证机制与接入流程的读者参考。1. 广域网协议里的 PPP为什么它至今还在你的宽带拨号里活着你打开路由器后台WAN 口设置里那一排选项——PPPoE、DHCP、静态 IP——大概率会顺手选 PPPoE然后填上运营商给的账号密码点连接网就通了。这个动作背后跑的就是 PPP 协议族。很多人以为 PPP 是上个世纪的老古董早该被以太网和 IPoE 淘汰了但现实是只要你还用宽带拨号上网PPP 就还在干活。它解决的核心问题很朴素——在一条点对点的链路上把数据帧封装好、把链路建起来、把身份验明白、把地址分配下去。PPP 本身不负责路由也不负责可靠传输它只做链路层的事但把这件事做得足够通用所以从串口专线到 DSL 宽带再到运营商的 BRAS 认证它一直没退场。这篇内容面向的是需要配置广域网链路、排查拨号故障、或者准备网络工程师认证的从业者我会把 PPP 的帧结构、LCP 协商、PAP/CHAP 认证、MP 多链路捆绑、PPPoE 会话建立这几个点拆开配上可复现的配置和抓包判断方法让你不只是背概念而是能上手调通一条 PPP 链路。2. PPP 链路建立从 LCP 协商到 NCP 分配地址的完整流程PPP 不是一上来就能传数据的。一条 PPP 链路从物理层 up 到能 ping 通对端中间要经过几个明确的阶段每个阶段都有对应的协议在跑。理解这个顺序是排查拨号失败的第一步——因为不同阶段失败现象和排查方向完全不同。2.1 PPP 的三个核心组件与帧结构PPP 的帧格式不复杂但每个字段都有存在理由。标准 PPP 帧以 0x7E 作为起始和结束标志地址字段固定 0xFF控制字段固定 0x03然后是 2 字节的协议字段用来标识 payload 里装的是什么协议的数据。协议字段常见取值0x0021 表示 IPv40xC021 表示 LCP0x8021 表示 IPCP0xC023 表示 PAP0xC223 表示 CHAP。这里有个容易忽略的点PPP 帧在同步链路比如串口专线和异步链路比如拨号 modem上的封装略有差异。同步链路上地址和控制字段可以压缩掉异步链路上还要做字符转义把 payload 里出现的 0x7E 转成 0x7D 0x5E。你在路由器上抓包看到 PPP 帧时如果发现地址控制字段不见了不是抓包工具出错而是协商时压缩了。PPP 的三个组件分别是封装方式把上层数据包封进 PPP 帧、LCP链路控制协议负责建链、协商参数、认证方式、拆链、NCP网络控制协议族比如 IPCP 负责协商 IP 地址、DNS 地址。这三个组件各司其职LCP 先跑跑通了才轮到 NCP。2.2 LCP 协商链路参数是怎么谈拢的LCP 协商的本质是双方交换 Configure-Request 报文里面带一堆选项对方回 Configure-Ack接受、Configure-Nak拒绝但给建议值或 Configure-Reject完全不认识这个选项。常见协商选项包括选项作用典型值MRU最大接收单元1500认证协议指定用 PAP 还是 CHAP0xC023 或 0xC223魔术字检测链路环路随机数压缩协议字段压缩启用/禁用协商过程是双向的双方都要发 Configure-Request都要收到对方的 Ack链路才进入 Opened 状态。如果一方一直收不到 Ack会重传重传到上限就认为链路建立失败。在 Cisco 设备上可以用debug ppp negotiation看协商过程。输出里会明确显示哪些选项被 Ack、哪些被 Nak。我一般会先看认证选项有没有谈拢——如果一端要求 CHAP另一端只支持 PAP协商就会卡住。2.3 认证阶段PAP 和 CHAP 的差别不只是加密PAP 是两次握手客户端直接把用户名和密码明文发给服务端服务端查表比对对就通过不对就拒绝。CHAP 是三次握手服务端先发一个挑战随机数客户端用密码和挑战做 MD5 哈希把结果发回去服务端自己也算一遍比对结果。PAP 的密码在链路上是明文抓包直接能看到。CHAP 不传密码只传哈希值而且每次挑战不同重放攻击无效。所以只要设备支持优先用 CHAP。配置上服务端和客户端的角色要分清。以 Cisco 为例服务端配置interface Serial0/0/0 encapsulation ppp ppp authentication chap ! username client1 password MyPass123客户端配置interface Serial0/0/0 encapsulation ppp ppp chap hostname client1 ppp chap password MyPass123注意ppp authentication chap是加在服务端接口下的表示“我对你进行 CHAP 认证”。客户端不需要这条命令只需要提供 hostname 和 password。如果两边都配了ppp authentication chap会变成双向认证各自都要验证对方配置更复杂但安全性更高。2.4 NCP 阶段IPCP 怎么把地址发下去LCP 和认证都通过后链路进入 Network 阶段NCP 开始干活。最常用的是 IPCP它协商的内容包括本端 IP 地址、对端 IP 地址、DNS 地址。IPCP 的 Configure-Request 里如果 IP 地址填 0.0.0.0表示“我不知道自己该用什么地址请你告诉我”服务端收到后会回一个 Nak里面带上分配好的地址客户端再用这个地址重新发 Request服务端 Ack地址就定下来了。这个过程在 PPPoE 拨号里非常典型你路由器 WAN 口配的是“自动获取 IP”实际上就是 IPCP 在跟 BRAS 要地址。如果拨号一直卡在“正在获取 IP 地址”大概率是 IPCP 协商没完成可能是认证没通过也可能是 BRAS 侧地址池耗尽。排查时可以在路由器上debug ppp negotiation和debug ppp authentication一起开看认证有没有过IPCP 有没有拿到地址。如果认证过了但 IPCP 没动静检查接口下有没有ip address negotiated这条命令——没有它IPCP 不会主动去要地址。3. MP 多链路捆绑把两条慢链路拼成一条快的MPMultilink PPP是 PPP 的一个扩展解决的问题很具体你有一条 2M 的串口专线带宽不够用又拉了一条 2M 的怎么把两条捆起来当 4M 用MP 的做法是把上层数据包分片分别从多条链路发出去对端收齐后重组。这个机制在 RFC 1990 里定义现在运营商专线和一些老式拨号场景还在用。3.1 MP 的工作原理分片、排序、重组MP 在 PPP 帧里加了一个 2 到 4 字节的 MP 头包含序列号Sequence Number和分片标识Begin/End Fragment。发送侧把一个大包切成多个分片每个分片带上序列号和首尾标志从不同物理链路发出去。接收侧根据序列号排序把分片拼回原始包。这里的关键是MP 的两条链路必须属于同一个 bundle。怎么判断是不是同一个 bundle靠的是 LCP 协商时交换的 MRRU最大重组接收单元和端点描述符Endpoint Discriminator。如果两端配置的 bundle 名称不一致或者认证信息不匹配两条链路会各自建独立的 PPP 会话不会捆绑。配置上以 Cisco 为例服务端和客户端都要把物理接口加入同一个 multilink 组interface Serial0/0/0 encapsulation ppp ppp multilink ppp multilink group 1 ! interface Serial0/0/1 encapsulation ppp ppp multilink ppp multilink group 1 ! interface Multilink1 ip address 10.0.0.1 255.255.255.252 ppp multilink ppp multilink group 1 ppp multilink fragment delay 10 ppp multilink interleaveppp multilink fragment delay 10表示分片时按 10ms 的延迟来算分片大小这个值影响语音等实时流量的抖动。ppp multilink interleave允许大包分片和小包交错发送减少实时流量的等待时间。如果不配 interleave一个大文件传输的分片会把语音包堵在后面通话质量直接崩。3.2 MP 的带宽利用与常见误区MP 不是简单地把两条链路带宽相加。实际能跑多少取决于分片策略和流量特征。如果只有一个 TCP 流MP 的分片可以让这个流同时走两条链路吞吐量接近两条链路之和。但如果是多个小流每个流本身就不大分片收益不明显。常见误区一以为配了 MP 就自动负载均衡。MP 的分片是按包切的不是按流分的所以它做的是“包级负载分担”不是“流级负载均衡”。两条链路速率不一致时慢的那条会成为瓶颈因为接收侧要等所有分片到齐才能重组。常见误区二忽略链路延迟差异。如果两条链路延迟差很大分片到达顺序乱掉接收侧重组缓冲区会压力很大严重时丢包。我一般会要求 MP 的两条链路延迟差不超过 10ms否则宁可不用 MP。排查 MP 是否真的捆上了可以用show ppp multilink看 bundle 状态。输出里会显示每个 bundle 包含哪些链路、每条链路的序列号状态。如果看到两条链路分别在不同的 bundle 里说明 bundle 名称或认证配置不一致。4. PPPoE把 PPP 帧塞进以太网帧里PPPoE 是 PPP 在以太网上的载体。DSL 宽带刚普及时运营商需要在以太网上做用户认证和地址分配但又不想改以太网本身于是把 PPP 帧封装进以太网帧就有了 PPPoE。它的帧结构是以太网头 PPPoE 头 PPP 头 payload。PPPoE 头包含版本、类型、Code、Session ID 和 Length。4.1 PPPoE 的两个阶段发现阶段和会话阶段PPPoE 不是一上来就传 PPP 帧的。它先跑一个发现阶段Discovery Stage客户端广播一个 PADIPPPoE Active Discovery Initiation包寻找可用的 BRAS。BRAS 回 PADOOffer客户端再从多个 Offer 里选一个发 PADRRequestBRAS 回 PADSSession Confirmation带上 Session ID。发现阶段结束后双方用这个 Session ID 进入会话阶段开始跑 LCP、认证、IPCP。发现阶段的包是广播的会话阶段的包是单播的。Session ID 是区分不同用户会话的关键同一个以太网里可能有多个 PPPoE 会话靠 Session ID 区分。在 Linux 上可以用pppoe-discovery工具抓发现阶段的包sudo pppoe-discovery -I eth0输出会显示收到的 PADO 包包含 BRAS 的 MAC 地址和提供的服务名称。如果一直收不到 PADO说明二层链路有问题或者 BRAS 没响应。这时候先检查 VLAN 配置——很多运营商的 PPPoE 是带 VLAN 标签的路由器 WAN 口没配 VLAN 就发不出去。4.2 在 Linux 上跑通 PPPoE 拨号的最小配置Linux 下最常用的 PPPoE 客户端是pppd配合rp-pppoe插件。最小配置如下# 安装 rp-pppoe sudo apt install pppoe ppp # 编辑 /etc/ppp/peers/dsl-provider plugin rp-pppoe.so eth0 user your_username noauth defaultroute usepeerdns persist mtu 1492 mru 1492然后运行sudo pon dsl-providerplugin rp-pppoe.so加载 PPPoE 插件eth0指定物理接口user是运营商给的账号noauth表示不验证对端客户端一般不验证服务端defaultroute自动加默认路由usepeerdns自动获取 DNS。mtu 1492和mru 1492是 PPPoE 的经典值——因为 PPPoE 头占了 8 字节以太网 MTU 1500 减去 8 就是 1492。如果配成 1500大包会分片性能下降甚至丢包。拨号成功后ip addr show ppp0能看到分配的地址ip route能看到默认路由指向 ppp0。如果拨号失败看/var/log/syslog里 pppd 的输出通常会明确告诉你卡在哪个阶段LCP 超时、认证失败、还是 IPCP 没拿到地址。4.3 PPPoE 的 MTU/MSS 问题与排查PPPoE 最经典的坑就是 MTU。因为 PPPoE 头占了 8 字节实际可用 MTU 是 1492。如果本机 MTU 配成 1500发出去的大包在 PPPoE 封装后超过 1500会被分片或者丢弃。表现是能 ping 通小包但网页打不开、大文件传不了。排查方法ping -M do -s 1472 8.8.8.8。1472 是 1500 减去 20 字节 IP 头再减去 8 字节 ICMP 头。如果这个能通说明路径 MTU 至少 1500。如果不通逐步减小-s的值直到能通找到实际路径 MTU。PPPoE 环境下通常-s 1464能通1464 20 8 1492。除了改接口 MTU还可以配 MSS clamping让路由器自动把 TCP SYN 包里的 MSS 值改小避免大包发出。Linux 下用 iptablesiptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu这条规则会把经过的 TCP SYN 包的 MSS 改成路径 MTU 减去 40从源头避免大包。5. PPP 排错避坑认证失败、MP 不捆绑、PPPoE 拨不上的血泪记录PPP 相关的问题现象往往很模糊——“拨不上号”“链路起不来”“时通时不通”。但只要你按阶段拆开看大部分问题都能定位到具体环节。下面这几条是我在实际项目里踩过的坑每条都按现象、原因、解决来写。5.1 认证一直失败但密码明明是对的现象debug ppp authentication显示 CHAP 认证失败但用户名密码反复确认没错。原因CHAP 认证时客户端发送的用户名默认是设备的主机名不是ppp chap hostname配的值。如果服务端用username 客户端主机名 password xxx建的用户而客户端主机名改过就会对不上。解决在客户端接口下明确配ppp chap hostname 用户名服务端用这个用户名建本地账号。或者服务端用username 客户端主机名 password xxx确保主机名一致。我一般倾向于显式配 hostname避免依赖设备主机名。5.2 MP 配了但两条链路各自为政现象两条串口都 up 了但show ppp multilink显示两个独立的 bundle带宽没叠加。原因两端ppp multilink group编号不一致或者一端配了 group 另一端没配。MP 的 bundle 是靠 group 编号和端点描述符匹配的编号不同就不捆。解决两端物理接口和 Multilink 接口下的ppp multilink group编号必须一致。如果用的是ppp multilink不带 group则靠端点描述符匹配这时要确保两端ppp multilink endpoint配置一致。改完配置后shutdown再no shutdown物理接口让 LCP 重新协商。5.3 PPPoE 拨号卡在 PADI 阶段没响应现象pppoe-discovery发 PADI 后收不到任何 PADO日志里一直重传。原因最常见的是 VLAN 没配。运营商的 PPPoE 服务器在某个 VLAN 里路由器 WAN 口如果不带 VLAN 标签PADI 包根本到不了 BRAS。其次是物理链路问题比如光猫没桥接、网线没插对口。解决确认运营商要求的 VLAN ID在路由器 WAN 口配vlan-id。如果是 Linux 拨号需要先创建 VLAN 子接口sudo ip link add link eth0 name eth0.100 type vlan id 100 sudo ip link set eth0.100 up然后把 pppd 配置里的eth0改成eth0.100。VLAN ID 每个地区不同问运营商或者看光猫里的配置。5.4 IPCP 拿到地址但上不了网现象PPPoE 拨号成功ppp0有 IP但 ping 外网不通。原因默认路由没加或者 DNS 没配。pppd 的defaultroute选项在某些发行版上不生效需要手动加路由。另外usepeerdns拿到的 DNS 可能没写入/etc/resolv.conf。解决拨号后手动检查ip route如果没有默认路由加一条ip route add default dev ppp0。DNS 可以手动写/etc/resolv.conf或者用resolvectl配。更稳妥的做法是在 pppd 的ip-up脚本里自动处理路由和 DNS。5.5 CHAP 认证过了但 IPCP 协商超时现象认证阶段显示成功但 IPCP 一直没拿到地址拨号最终超时断开。原因服务端地址池耗尽或者服务端没配peer default ip address pool。另一种可能是客户端没配ip address negotiatedIPCP 根本没发起地址请求。解决服务端检查地址池配置确保有可用地址。客户端接口下确认有ip address negotiated。如果是 Cisco 客户端还可以用debug ppp negotiation看 IPCP 的 Configure-Request 有没有发出去。如果发了但没响应问题在服务端。6. 用 Wireshark 抓一次 PPPoE 拨号从 PADI 到 IPCP 的完整报文序列前面讲的都是配置和排错但真正让你对 PPP 建立过程有肌肉记忆的是亲手抓一次完整拨号流程。这一章我用 Wireshark 配合 Linux 的 pppd把从 PADI 到 IPCP 的报文序列拆开看每个阶段该看到什么包、字段怎么读、异常时哪里断一次讲清楚。先准备环境一台 Linux 机器一个能拨号的宽带线路或者用虚拟机桥接到光猫的桥接口。在拨号前启动 Wireshark抓 eth0或 VLAN 子接口的包过滤器设pppoe。然后执行sudo pon dsl-provider观察抓到的包。正常的报文序列是这样的阶段方向报文关键字段发现客户端→广播PADIService-Name 为空表示接受任意服务发现服务端→客户端PADOAC-Name 是 BRAS 标识Service-Name 是提供的服务发现客户端→服务端PADR带上选中的 Service-Name发现服务端→客户端PADSSession ID 非零后续会话用这个 ID会话双向LCP Configure-Request带 MRU、认证协议、魔术字会话双向LCP Configure-Ack确认对方选项会话服务端→客户端CHAP Challenge带随机数和挑战名称会话客户端→服务端CHAP Response带 MD5 哈希和用户名会话服务端→客户端CHAP Success认证通过会话双向IPCP Configure-Request客户端地址填 0.0.0.0会话服务端→客户端IPCP Configure-Nak带分配地址和 DNS会话客户端→服务端IPCP Configure-Request用分配地址重新请求会话服务端→客户端IPCP Configure-Ack地址确认在 Wireshark 里你可以展开每个包的 PPPoE 头和 PPP 头看 Code 字段和 Session ID。发现阶段的 Code 是 0x09PADI、0x07PADO、0x19PADR、0x65PADS。会话阶段的 Code 是 0x00表示纯数据。如果拨号失败看抓包断在哪一步。PADI 发了没 PADO二层问题PADO 有了没 PADR客户端选服务逻辑问题PADR 发了没 PADSBRAS 侧问题LCP 发了没 Ack协商选项不匹配CHAP Response 发了没 Success密码或用户名错IPCP Request 发了没 Nak服务端地址池问题。我自己的习惯是每次调 PPP 相关配置先开抓包再拨号拨完立刻停对着报文序列看一遍。这比看日志快得多因为日志只告诉你“失败了”抓包告诉你“卡在哪个包”。这个习惯帮我省了无数次来回猜的时间。希望帮到你。本文还有配套的精品资源点击获取