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的命脉。


专注资料整理