3. 发现与注册:ONU自动发现流程、LLID分配机制、注册状态机详解
好,咱们今天聊点硬核的——ONU怎么被OLT“认出来”的。
你想想看,一台ONU刚上电,它跟OLT之间完全是“陌生人”。OLT不知道它的MAC地址,不知道它能支持多大带宽,甚至连它是个啥型号都不清楚。那怎么建立通信?
这就是发现与注册要干的事。
我个人习惯把这个过程比作“入职登记”。ONU是新人,OLT是HR。新人来了,先报到(发现),然后领工牌(分配LLID),最后签合同(注册完成)。
3.1 ONU自动发现流程
自动发现,说白了就是OLT在“喊话”:“有没有新设备要上线?”
OLT会周期性地发送一种特殊帧——发现GATE帧。这个帧里不指定具体的ONU,而是广播给所有未注册的设备。
我刚开始接触EPON时,有个误区:以为发现GATE帧和普通GATE帧一样。其实区别很大——
- 普通GATE帧:指定LLID,给已注册ONU授权发送窗口
- 发现GATE帧:不指定LLID,广播给所有未注册ONU
ONU收到发现GATE帧后,会等待一个随机时间(避免多个ONU同时响应造成冲突),然后发送注册请求帧(REGISTER_REQ)。
关键点:ONU的随机等待时间很重要。我曾经在实验室里见过两台ONU同时响应,结果OLT一个都没认出来。后来加了随机退避机制,问题就解决了。
OLT收到REGISTER_REQ后,会回复注册帧(REGISTER),同时分配LLID。ONU收到REGISTER后,再回复一个注册确认帧(REGISTER_ACK)。至此,发现流程结束。
3.2 LLID分配机制
LLID,全称Logical Link ID,逻辑链路标识。你可以把它理解成ONU在EPON网络里的“身份证号”。
每个ONU至少有一个LLID。但注意——不是只能有一个。有些场景下,一个ONU可以有多个LLID,比如同时承载数据、语音、视频业务。
LLID的分配时机,就在发现流程的REGISTER帧里。OLT在REGISTER帧中携带一个16位的LLID值。
嗯,这里要注意:LLID的范围是0x0000到0x7FFF(共32768个)。但实际可用的没那么多,因为有些LLID被保留做特殊用途。
| LLID范围 | 用途 |
|---|---|
| 0x0000 | 广播LLID,所有ONU都能接收 |
| 0x0001 - 0x7FFE | 单播LLID,分配给具体ONU |
| 0x7FFF | 保留,暂未使用 |
我建议你在做OLT开发时,LLID分配策略要提前规划好。比如:
- 按ONU的MAC地址哈希分配?
- 还是顺序递增分配?
- 或者预留一段给特定业务?
没有标准答案,但一定要保证不重复。我曾经见过一个项目,因为LLID分配冲突,导致两个ONU互相“抢信号”,折腾了两天才定位到问题。
3.3 注册状态机详解
状态机,说白了就是ONU在注册过程中“当前处于什么阶段”。
EPON标准定义了6个状态:
- 初始状态(Initial):ONU刚上电,啥也没干
- 发现状态(Discovering):ONU等待发现GATE帧
- 注册请求状态(Registering):ONU已发送REGISTER_REQ,等待REGISTER
- 注册确认状态(Acknowledging):ONU已收到REGISTER,等待发送REGISTER_ACK
- 注册完成状态(Registered):ONU注册成功,可以正常通信
- 去注册状态(Deregistered):ONU被OLT踢下线或主动离线
我画了一张流程图,帮你理清状态切换的逻辑:
状态机里有个容易踩坑的地方——超时处理。
比如ONU发送了REGISTER_REQ,但OLT没收到(可能因为光功率太低,或者冲突了)。ONU会等一个超时时间,然后重新发送。这个超时时间怎么设?
标准里建议是50ms到200ms之间。我个人习惯设100ms,太短容易频繁重试,太长影响用户体验。
避坑指南:我曾经遇到过一个案例,ONU在注册确认状态卡住了。原因是OLT发送的REGISTER帧里,LLID分配重复了。ONU收到后校验不通过,一直重试。最后查出来是OLT的LLID池管理有bug。
3.4 注册过程中的关键参数
注册过程中,OLT和ONU会交换一些关键参数。我整理了一张表:
| 参数 | 说明 | 携带帧 |
|---|---|---|
| MAC地址 | ONU的唯一硬件标识 | REGISTER_REQ |
| LLID | OLT分配的逻辑链路ID | REGISTER |
| 最大带宽 | ONU支持的最大速率 | REGISTER_REQ |
| 同步时间戳 | OLT的本地时间,用于测距 | REGISTER |
| ONU序列号 | 厂商自定义的序列号 | REGISTER_REQ |
嗯,这里要特别提一下同步时间戳。EPON是时分复用系统,所有ONU必须跟OLT保持时间同步。注册时OLT会把当前时间戳发给ONU,ONU据此校准自己的时钟。
如果时间戳不准,后果很严重——ONU可能在错误的时间窗口发送数据,跟其他ONU撞车。
小技巧:调试注册问题时,我建议先抓包看REGISTER_REQ和REGISTER帧。如果REGISTER_REQ正常发出但没收到REGISTER,大概率是OLT侧的问题。如果REGISTER收到了但REGISTER_ACK发不出去,可能是ONU侧的问题。
3.5 多ONU同时注册的冲突处理
实际网络中,不可能只接一台ONU。如果多台ONU同时上电,它们都会响应发现GATE帧。
冲突怎么解决?
标准里用了随机退避机制。每个ONU在发送REGISTER_REQ前,会随机等待0到某个最大值之间的时间。这个最大值由OLT在发现GATE帧里指定。
我建议你设成512个时间量子(约51.2μs)。太小了冲突概率高,太大了注册速度慢。
如果冲突还是发生了(OLT没收到任何REGISTER_REQ,或者收到了但校验失败),ONU会在下一个发现窗口重试。重试次数一般限制在3-5次,超过就报错。
我曾经在现网中遇到过极端情况——一个PON口下接了64台ONU,同时上电。结果注册过程持续了将近30秒。后来优化了退避算法,把时间降到了10秒以内。
3.6 注册完成后的LLID管理
ONU注册完成后,LLID就固定下来了。除非ONU掉线重新注册,否则LLID不会变。
但注意——OLT侧需要维护一张LLID映射表,记录每个LLID对应的ONU信息。这张表在后续的带宽分配、数据转发中都会用到。
我习惯把LLID映射表设计成哈希表,以LLID为key,ONU信息为value。查找效率高,插入删除也方便。
好了,关于发现与注册,核心内容就这些。记住三个关键词:发现GATE帧、LLID分配、状态机切换。把这三点搞明白,EPON的注册流程你就掌握了八成。
公众号:蓝海资料掘金营,微信deep3321