PPP 协议详解
PPP(Point-to-Point Protocol,点对点协议)是串行通信链路上的数据链路层协议,定义在 RFC 1661 中,用于建立直接连接的网络通信,支持多种网络层协议和认证机制,是早期拨号上网和广域网连接的基础。
1. PPP 协议概述
基本概念
- 作用:在点对点链路上封装多协议数据包
- 工作模式:全双工、点对点
- 链路层:OSI第2层,封装IP、IPX等协议
- 物理层:支持串行线、调制解调器、以太网等
- 标准化:IETF RFC 1661(1992)
PPP vs SLIP
特性 | PPP | SLIP |
---|
多协议支持 | 是 | 仅IP |
认证机制 | CHAP、PAP | 无 |
错误检测 | FCS校验 | 无 |
动态配置 | LCP/NCP | 静态 |
压缩 | 支持 | 有限 |
状态 | 当前标准 | 已废弃 |
典型应用场景
- 拨号上网:调制解调器连接ISP
- 广域网:串行链路、ISDN、DSL
- VPN基础:PPTP、L2TP
- 路由器互联:串口WAN连接
2. PPP 协议栈结构
协议组件
物理层 (串行、调制解调器)
↓
PPP链路控制协议 (LCP) - 链路建立、配置、测试
↓
网络控制协议 (NCP) - IPCP、IPXCP等协议配置
↓
网络层协议 (IP、IPX、AppleTalk)
LCP(Link Control Protocol)
- 链路建立:协商MRU、认证、压缩
- 链路维护:回环检测、协议死机检测
- 链路终止:优雅关闭
NCP(Network Control Protocol)
- IPCP:IP地址分配、DNS配置
- IPv6CP:IPv6地址配置
- OSINLCP:OSI网络层
- 每个网络协议独立NCP
3. PPP 帧格式
标准PPP帧结构
+----------+----------+----------+----------------+----------+
| Flag | Address | Control | Protocol (2B) | Information|
+----------+----------+----------+----------------+----------+
| 1B | 1B | 1B | 2B | Variable |
+----------+----------+----------------+----------------+----------+
| FCS (Frame Check Sequence) |
+------------------------------------------------------------+
| 2-4B (CRC-16/32) |
+------------------------------------------------------------+
字段说明
字段 | 大小 | 值 | 说明 |
---|
Flag | 1字节 | 0x7E | 帧定界符(0x01111110) |
Address | 1字节 | 0xFF | 全1,表示点对点(无MAC地址) |
Control | 1字节 | 0x03 | 未确认、无序号控制 |
Protocol | 2字节 | 见下表 | 上层协议标识 |
Information | 可变 | – | 封装的网络层数据 |
FCS | 2/4字节 | CRC-16/32 | 帧校验序列 |
Protocol字段值
值 | 协议 |
---|
0x0021 | IP (IPv4) |
0x0057 | IPv6 |
0x002d | LCP |
0xc021 | LCP Echo |
0x8021 | IPCP |
0xc023 | PAP |
0xc223 | CHAP |
4. PPP 状态机和阶段
PPP连接建立阶段
1. 链路建立阶段 (Physical Layer)
- 物理连接建立 (串行、调制解调器握手)
2. LCP配置阶段
- Configure-Request/Reply/Ack/Nak/Reject
- 协商MRU、认证、魔术数字、压缩
3. 认证阶段 (可选)
- PAP:明文用户名/密码
- CHAP:挑战响应认证
4. NCP配置阶段
- IPCP/IPv6CP等协议配置
- IP地址分配、DNS服务器
5. 网络层协议启用
- IP数据包传输
LCP状态转换
Down → Establish → Authentication → Network → Open → Terminate → Down
配置选项协商
Configure-Request:
- MRU (Maximum Receive Unit): 默认1500
- ACCM (Async Control Character Map): 转义控制字符
- Authentication Protocol: PAP/CHAP
- Magic Number: 链路完整性检测
- Protocol Compression: 协议字段压缩
- Address/Control Compression: 地址/控制字段压缩
5. PPP认证协议
PAP(Password Authentication Protocol)
1. 认证请求方发送用户名/密码对
2. 认证服务器验证凭据
3. 接受/拒绝响应
特点:明文传输,安全性低
CHAP(Challenge Handshake Authentication Protocol)
1. 服务器发送挑战(Challenge)和标识符
2. 客户端用共享密钥+挑战计算MD5哈希
3. 服务器验证哈希值
4. 周期性重新认证
特点:无明文,防重放攻击
配置示例
# /etc/ppp/chap-secrets
# "username" server password IP地址
alice * mypassword 192.168.1.*
bob * secret123 *
6. PPP压缩机制
压缩类型
压缩 | 描述 | 开销 |
---|
Stac LZS | 字典压缩 | 中等 |
MPPC | Microsoft Point-to-Point Compression | 高 |
Deflate | zlib压缩 | 低 |
VJ压缩 | Van Jacobson TCP/IP头部压缩 | 低 |
协议字段压缩
- PFC:协议字段从2字节压缩到1字节
- ACFC:地址/控制字段省略(固定FF/03)
7. LCP协议消息
主要消息类型
类型 | 值 | 说明 |
---|
Configure-Request | 1 | 配置请求 |
Configure-Ack | 2 | 配置确认 |
Configure-Nak | 3 | 配置拒绝/建议 |
Configure-Reject | 4 | 配置选项拒绝 |
Terminate-Request | 5 | 终止请求 |
Terminate-Ack | 6 | 终止确认 |
Code-Reject | 7 | 未知代码拒绝 |
Protocol-Reject | 8 | 未知协议拒绝 |
Echo-Request | 9 | 回环检测 |
Echo-Reply | 10 | 回环响应 |
Discard-Request | 11 | 丢弃请求 |
Echo请求示例
Echo-Request (Code=9, ID=1, Length=20)
Magic Number: 0x12345678
Data: 测试数据
用途:检测链路完整性、魔术数字冲突
8. IPCP(IP Control Protocol)配置
IPCP选项
选项 | 代码 | 说明 |
---|
IP-Addresses | 1 | IP地址协商 |
IP-Compression-Protocol | 2 | IP压缩协议 |
IP-Address-Compressed-TCP | 3 | TCP头部压缩 |
IP地址分配方式
- 本地配置:手动指定IP地址
- 服务器分配:服务器动态分配
- 地址协商:客户端提议,服务器确认
配置示例
# 服务器端 /etc/ppp/ip-up
#!/bin/sh
# 动态分配IP
IPADDR=`ifconfig ppp0 | grep -o 'inet addr:[0-9.]*' | cut -d: -f2`
echo "分配IP: $IPADDR"
/sbin/ip route add default via 192.168.1.1 dev ppp0
9. PPP实现和配置
Linux PPP配置(ppp)
# /etc/ppp/peers/dialup
# 拨号连接配置
/dev/ttyS0 115200
connect '/usr/sbin/chat -v AT OK ATDT1234567 CONNECT ""'
noauth
defaultroute
usepeerdns
persist
maxfail 3
/etc/ppp/chap-secrets认证
# 用户名 * 密码 IP地址范围
dialuser * mypassword 192.168.1.100-192.168.1.200
admin * adminpass *
启动PPP连接
# 启动拨号
pon dialup
# 停止拨号
poff dialup
# 状态检查
ifconfig ppp0
Windows PPP配置
# 拨号网络配置
netsh ras set linktype protocol ppp
netsh interface ip set address "拨号连接" dhcp
10. PPP多链路协议(MLPPP)
MLPPP功能
- 带宽聚合:多条链路并行传输
- 负载均衡:数据包分布
- 容错:单链路故障不中断
- 链路碎片:大包分片重组
工作原理
Bundle = 多个物理链路 + MLPPP头部
- 序列号:确保按序重组
- 碎片ID:大包分片标识
配置示例
# Cisco路由器MLPPP
interface Multilink 1
ip address 192.168.1.1 255.255.255.0
ppp multilink
!
interface Serial0/0
encapsulation ppp
ppp multilink
ppp multilink group 1
!
interface Serial0/1
encapsulation ppp
ppp multilink
ppp multilink group 1
11. PPPoE(PPP over Ethernet)
PPPoE封装
以太网帧 → PPPoE头部 + PPP帧
PPPoE Session ID: 唯一会话标识
PPPoE发现阶段:PADI/PADO/PADR/PADS
ADSL宽带应用
# Linux PPPoE配置
# /etc/ppp/peers/dsl-provider
plugin rp-pppoe.so
nic-eth0
user "dslusername"
password "dslpassword"
persist
mtu 1492
mru 1492
# 启动
pppd call dsl-provider
12. 安全和认证增强
EAP(Extensible Authentication Protocol)
- EAP-MD5:CHAP增强版
- EAP-TLS:证书认证
- PEAP:保护EAP(RADIUS隧道)
- EAP-TTLS:隧道传输层安全
RADIUS集成
# pppd + RADIUS
# /etc/ppp/peers/radius
plugin radius.so
radius-config-file /etc/radiusclient/radiusclient.conf
auth
13. 故障排除和诊断
常见问题
问题 | 原因 | 解决 |
---|
LCP协商失败 | MRU不匹配 | 检查配置,降低MRU |
认证失败 | 凭据错误 | 验证chap-secrets |
IPCP失败 | 地址冲突 | 检查IP池,释放旧连接 |
链路抖动 | 物理层问题 | 检查线路,调制解调器 |
诊断工具
# PPP日志
tail -f /var/log/syslog | grep pppd
plog # PPP日志查看
# 抓包分析
tcpdump -i ppp0 -w ppp.pcap
wireshark filter: ppp
# LCP调试
pppd debug nodetach
状态检查
# 接口状态
ifconfig ppp0
ip link show ppp0
# 路由表
ip route show
netstat -rn | grep ppp
# 认证日志
grep "CHAP\|PAP" /var/log/auth.log
14. 编程接口和扩展
Python PPP控制
import subprocess
import pexpect
def start_ppp(interface, username, password):
cmd = f"pppd connect '/usr/sbin/chat -v AT OK ATDT{number} CONNECT' " \
f"noauth defaultroute user {username}"
child = pexpect.spawn(cmd)
child.expect("Login:")
child.sendline(username)
child.expect("Password:")
child.sendline(password)
# 监控连接状态
child.expect("IPCP.*up", timeout=60)
print("PPP连接建立成功")
# PPP状态监控
def check_ppp_status():
result = subprocess.run(['ifconfig', 'ppp0'],
capture_output=True, text=True)
return 'UP' in result.stdout
C语言PPP实现
// 简化PPP帧处理
struct ppp_frame {
uint8_t flag;
uint8_t address;
uint8_t control;
uint16_t protocol;
uint8_t *info;
uint16_t fcs;
};
int ppp_fcs(uint8_t *data, int len) {
uint16_t fcs = PPP_INITFCS;
for (int i = 0; i < len; i++) {
fcs = (fcs >> 8) ^ fcstab[(fcs ^ *data++) & 0xff];
}
return fcs;
}
15. 现代替代和演进
PPP的替代方案
场景 | PPP | 现代替代 |
---|
家庭宽带 | PPPoE | DHCP、静态IP |
企业WAN | 串行PPP | MPLS、SD-WAN |
移动数据 | PPP | GTP(GPRS Tunneling) |
VPN | PPTP | IPsec、OpenVPN |
PPPoE在DSL中的持续使用
- ISP管理:集中认证和计费
- 兼容性:支持传统PPP认证
- 安全性:结合IPsec增强
PPP协议通过模块化设计和丰富的扩展机制,为点对点网络连接提供了灵活的解决方案。虽然在现代以太网主导的环境中应用减少,但其在DSL宽带、传统广域网和某些嵌入式场景中仍有重要作用。理解PPP有助于掌握数据链路层协议设计的核心原则。