2. MPCP协议基础:协议栈位置、帧结构、状态机
大家好,我是老张。今天咱们聊聊MPCP协议的基础。说实话,这个协议是EPON系统的灵魂。没有它,ONU和OLT就是两个陌生人,根本没法通信。
我刚开始接触EPON时,总觉得MPCP不就是几个控制帧嘛,有啥难的?后来在现网调试中栽了跟头,才明白细节里藏着魔鬼。嗯,咱们一步步来。
2.1 MPCP协议栈位置
先看MPCP在协议栈里待在哪。你想想看,一个数据包从OLT发到ONU,要经过好几层。MPCP位于MAC控制子层,紧贴着MAC层。
具体来说:
- 物理层:负责光电转换,把0和1变成光信号
- MAC层:负责成帧、寻址、差错检测
- MAC控制子层:MPCP就住在这里
- OAM层:运维管理
- 上层:IP、TCP/UDP等
我习惯把MPCP比作「交通警察」。它不负责运货(传数据),但负责指挥交通——什么时候发车、谁先走、遇到拥堵怎么办。
关键点:MPCP帧的源MAC地址是设备自己的MAC,目的MAC是组播MAC(01-80-C2-00-00-01或01-80-C2-00-00-02)。普通数据帧不会用这些地址,所以MPCP帧不会被转发到上层协议栈。
这里有个坑。我曾经遇到一个案例:某厂商的ONU把MPCP帧误当成普通数据帧转发到了用户侧,结果导致整个PON口下的ONU全部掉线。排查了三天才找到原因——MAC地址过滤没做好。
2.2 MPCP帧结构
MPCP帧长啥样?说白了,它就是在标准以太网帧的基础上,加了一个MPCP专用的头部。
标准以太网帧格式:
| 前导码(7B) | SFD(1B) | 目的MAC(6B) | 源MAC(6B) | 长度/类型(2B) | 数据(46-1500B) | FCS(4B) |
MPCP帧的特别之处在于:
- 长度/类型字段:固定为
0x8808(这是IEEE分配的慢协议类型) - 数据字段:前2字节是MPCP操作码,后面跟着具体参数
MPCP帧具体结构:
| 目的MAC(6B) | 源MAC(6B) | 0x8808(2B) | 操作码(2B) | 时间戳(4B) | 参数(变长) | 填充(0-43B) | FCS(4B) |
操作码定义了MPCP帧的类型:
| 操作码 | 帧类型 | 方向 | 用途 |
|---|---|---|---|
| 0x0001 | GATE | OLT→ONU | 授权ONU发送数据 |
| 0x0002 | REPORT | ONU→OLT | 报告ONU缓存状态 |
| 0x0003 | REGISTER_REQ | ONU→OLT | 请求注册 |
| 0x0004 | REGISTER | OLT→ONU | 确认注册 |
| 0x0005 | REGISTER_ACK | ONU→OLT | 确认注册完成 |
我个人习惯把GATE和REPORT称为「核心帧」,因为它们在正常运行时最频繁。REGISTER系列是「注册帧」,只在ONU上线时用。
小技巧:抓包时,如果看到大量0x8808帧,说明MPCP在正常工作。如果0x8808帧很少甚至没有,那OLT和ONU之间肯定出问题了。我曾经用Wireshark抓过,一秒钟能看到几百个GATE/REPORT帧,这是正常的。
2.3 MPCP协议状态机
状态机是MPCP最核心的部分。说白了,就是ONU从「冷启动」到「正常工作」要经历哪些阶段。
ONU侧的状态机:
+----------------+ +----------------+ +----------------+
| INITIAL | ---> | DISCOVERY | ---> | REGISTERING |
| (初始状态) | | (发现状态) | | (注册中) |
+----------------+ +----------------+ +----------------+
|
v
+----------------+ +----------------+ +----------------+
| NORMAL | <--- | ACKNOWLEDGED | <--- | REGISTERED |
| (正常工作) | | (已确认) | | (已注册) |
+----------------+ +----------------+ +----------------+
每个状态的含义:
- INITIAL:ONU刚上电,啥也没干。等待发现窗口。
- DISCOVERY:ONU收到OLT的发现GATE帧,开始随机等待,然后发送REGISTER_REQ。
- REGISTERING:ONU发了REGISTER_REQ,等OLT回复REGISTER。
- REGISTERED:收到REGISTER,发REGISTER_ACK。
- ACKNOWLEDGED:OLT确认了ACK,ONU进入正常工作。
- NORMAL:正常收发数据,定期REPORT。
OLT侧的状态机相对简单:
+----------------+ +----------------+ +----------------+
| LISTENING | ---> | PROCESSING | ---> | CONFIRMING |
| (监听) | | (处理中) | | (确认中) |
+----------------+ +----------------+ +----------------+
|
v
+----------------+ +----------------+
| OPERATIONAL | <--- | COMPLETED |
| (运行中) | | (完成) |
+----------------+ +----------------+
这里有个我踩过的坑。ONU在DISCOVERY状态时,会随机选择一个退避时间。如果多个ONU同时上线,退避算法没写好,就会导致冲突。我曾经在一个项目中,32个ONU同时上电,结果只有5个注册成功,剩下的全卡在DISCOVERY状态。后来发现是退避窗口设置得太小了。
注意:ONU在NORMAL状态下如果连续丢失多个GATE帧(一般是3-5个),会认为链路中断,自动回到INITIAL状态重新注册。这个机制是为了防止OLT挂了后ONU一直傻等。
为什么会这样?因为MPCP的设计原则是「OLT主导,ONU跟随」。OLT不发GATE,ONU就不能发数据。所以一旦OLT挂了,ONU必须能自己检测到并重新尝试注册。
嗯,MPCP的基础就这些。协议栈位置决定了它的「身份」,帧结构决定了它的「语言」,状态机决定了它的「行为」。三者缺一不可。
我个人觉得,理解状态机是最重要的。因为你在现网中遇到的90%的问题,都可以通过分析ONU当前处于哪个状态来定位。比如ONU频繁掉线,多半是在NORMAL和INITIAL之间来回跳,那就要查光功率、查GATE帧是否正常。
好了,这一节就到这。记住我说的:MPCP是EPON的指挥系统,搞懂它,你就掌握了EPON的命脉。