PPP 协议

PPP 协议详解

PPP(Point-to-Point Protocol,点对点协议)是串行通信链路上的数据链路层协议,定义在 RFC 1661 中,用于建立直接连接的网络通信,支持多种网络层协议和认证机制,是早期拨号上网和广域网连接的基础。

1. PPP 协议概述

基本概念

  • 作用:在点对点链路上封装多协议数据包
  • 工作模式:全双工、点对点
  • 链路层:OSI第2层,封装IP、IPX等协议
  • 物理层:支持串行线、调制解调器、以太网等
  • 标准化:IETF RFC 1661(1992)

PPP vs SLIP

特性PPPSLIP
多协议支持仅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)                                        |
+------------------------------------------------------------+

字段说明

字段大小说明
Flag1字节0x7E帧定界符(0x01111110)
Address1字节0xFF全1,表示点对点(无MAC地址)
Control1字节0x03未确认、无序号控制
Protocol2字节见下表上层协议标识
Information可变封装的网络层数据
FCS2/4字节CRC-16/32帧校验序列

Protocol字段值

协议
0x0021IP (IPv4)
0x0057IPv6
0x002dLCP
0xc021LCP Echo
0x8021IPCP
0xc023PAP
0xc223CHAP

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字典压缩中等
MPPCMicrosoft Point-to-Point Compression
Deflatezlib压缩
VJ压缩Van Jacobson TCP/IP头部压缩

协议字段压缩

  • PFC:协议字段从2字节压缩到1字节
  • ACFC:地址/控制字段省略(固定FF/03)

7. LCP协议消息

主要消息类型

类型说明
Configure-Request1配置请求
Configure-Ack2配置确认
Configure-Nak3配置拒绝/建议
Configure-Reject4配置选项拒绝
Terminate-Request5终止请求
Terminate-Ack6终止确认
Code-Reject7未知代码拒绝
Protocol-Reject8未知协议拒绝
Echo-Request9回环检测
Echo-Reply10回环响应
Discard-Request11丢弃请求

Echo请求示例

Echo-Request (Code=9, ID=1, Length=20)
Magic Number: 0x12345678
Data: 测试数据

用途:检测链路完整性、魔术数字冲突

8. IPCP(IP Control Protocol)配置

IPCP选项

选项代码说明
IP-Addresses1IP地址协商
IP-Compression-Protocol2IP压缩协议
IP-Address-Compressed-TCP3TCP头部压缩

IP地址分配方式

  1. 本地配置:手动指定IP地址
  2. 服务器分配:服务器动态分配
  3. 地址协商:客户端提议,服务器确认

配置示例

# 服务器端 /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现代替代
家庭宽带PPPoEDHCP、静态IP
企业WAN串行PPPMPLS、SD-WAN
移动数据PPPGTP(GPRS Tunneling)
VPNPPTPIPsec、OpenVPN

PPPoE在DSL中的持续使用

  • ISP管理:集中认证和计费
  • 兼容性:支持传统PPP认证
  • 安全性:结合IPsec增强

PPP协议通过模块化设计和丰富的扩展机制,为点对点网络连接提供了灵活的解决方案。虽然在现代以太网主导的环境中应用减少,但其在DSL宽带、传统广域网和某些嵌入式场景中仍有重要作用。理解PPP有助于掌握数据链路层协议设计的核心原则。

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注