EPON 是基于以太网技术的无源光网络,是吉比特以太网与点对多点结构的结合。还记得以太网嘛,它是连在同一局域网的设备共享同一条链路;而 EPON 实现点对多点的拓扑结构。典型的光分路比为 1 : 32,即每个 EPON 口能够连接 32 台终端接入设备,
EPON 采用与吉比特以太网相同的帧格式与编码手段,能够提供 1 Gbits/s 的对称以太网速率,支持 10 和 20 km 两种最大传输距离。另外,EPON 采用波分复用技术,实现了单纤双向传输,上行波长范围为 1260 ~ 1360 nm,下行波长范围为 1480 ~ 1500 nm
下行( OLT → ONU )采用广播的方式将数据送往各台 ONU;而上行( ONU → OLT )采用时分复用的方式,分时间段收集各台 ONU 发来的数据,避免数据帧一起到达而发生碰撞的情况。关于时分复用相关技术将在之后详细讲解
MPCP 顾名思义即是,Multi-Points Control Protocol,多点控制协议,是定义在 Layer2 DataLink 层的 MAC 协议,用来管理 ONU 与 OLT 之间的通信流程
了解 EPON 最重要的就是要清楚 ONU 的注册过程,即是 MPCP 注册过程,类似于 TCP 的三次握手,如下图,
先对这张图有个大致的印象即可,我稍后会对其进行讲解。我们先通过个案例来说明该问题,当 ONU 第一次连接该 OLT 时,OLT 会通过一些检测手段发现这台新的 ONU,然后会向它发出邀请:问它是否要与 OLT 进行连接?如果要连接 OLT 的话,请在特定的时间范围内回应我:I’m in;在 OLT 收到 ONU 请求连接回复之后,会分配一个独一无二的 ID 给它,ONU 在收到 ID 后确认无误即可完成连接过程。下面针对上面这张图完整地阐释一下
首先,OLT 会周期性地向所有 ONU 发送 Discovery GATE 消息,它为所有非在线的 ONU 指定了一个共同的上行发现时间窗口( Discovery Window );然后 ONU 在收到 OLT 的 Discovery GATE 消息后得知,它可以在指定的发现时间窗口内向 OLT 发送注册请求( REGISTER_REQ 消息)
OLT 在收到有效的 REGISTER_REQ 消息后,会注册该 ONU 并为其分配 LLID( Logical Link ID,逻辑链路标识),然后 OLT 会向新发现的 ONU 发送 REGISTER 注册消息告知为其分配的 LLID。紧接其后,OLT 再次向 ONU 发送 Normal GATE 普通选通消息,为 ONU 发送 REGISTER_ACK 注册确认消息提供上行时间窗口
OUN 在收到 OLT 发来的 REGISTER 消息后会解析该消息并根据 LLID 等参数进行配置,然后回复 REGISTER_ACK 消息以完成注册。对应上图的 Dicovery handshake ok
在深入 MPCP 之前呢,我想先针对上/下行发包方式展开描述,如 一、EPON概念 所说,下行 OLT 采用广播的方式将数据发往所有 ONU,但是 ONU 并不一定会接收该帧,因为它不一定是发给自己的,这时就需要 ONU 通过自己的 LLID 进行判断(相同就收下来,否则就丢弃该帧)
上行采用时分复用( TDMA )的方式,每个 ONU 只能在 OLT 分配给其的特定时隙( Time Slot )才能发送数据帧,而且每个时隙只能由一个 ONU 发送数据帧,这样就避免了多个数据帧同时到达 PON 口而发生碰撞的情况
其中,如何确定发送上行数据帧的时隙是第一个需要被解决的问题。OLT 会通过测距以及结合各台 ONU 上报的上行带宽需求从而确定其时隙,关于测距,我们无需过多的了解,因为这是 OLT 的任务,测距测的是 OLT 和 ONU 之间的直线物理距离。下面,我们来看一看 OLT 与 ONU 如何通过时隙完成同步的
为了实现上行时隙的精确控制,我们需要 OLT 和 ONU 都有一个共同的时钟,记录着发送/接收 MPCP 消息的时间戳,我想通过下面这张图说明这个流程,
在讲解完 MPCP 注册流程之后,我想再针对两种 GATE 消息的具体格式展开说明,使我们能够对信息的具体内容有个了解,正如《程序员的自我修养》一书中所言,如果一个程序员不能完全掌控内存的所有字节,那么他不是个好程序员。不能对网络协议中的每个字段了如指掌,同样也是不到位的。如下图,
GATE 消息所用的字节数是固定的,64 bytes,其中的 Data 字段是可变的,Discovery GATE 消息是上半边的格式,而 Normal GATE 消息是下半边的格式。前两个字段 Destination/Source Address 不用过多解释;第三个字段 Length 固定值为 8808;第四个字段 Opcode 值为 0x0002 代表着这个消息是 GATE 类型的;之后的 Timestamp 字段记录了 OLT 发送该 GATE 消息的绝对时间;最后一个字段 FCS 是用来检测传输过程中是否出现了错误
再看 Data/Reserved/Pad 字段,当中的第一个字段 Numbers of grants/flags,它占 1 byte,分 8 bits。前 3 个 bits 合起来表示携带的发送窗口个数,最多不超过 4 个。如果窗口个数为 0,则表示仅仅是一种链接机制;第 4 个 bit 标记着该消息是 Discovery GATE(置 1)还是 Normal GATE(置 0)消息;后 4 个 bits 强制让 ONU 回复 REPOERT 消息;第二个字段 Grant start time 表示允许发送 REGISTER_REQ 消息的时间点;第三个字段 Grant length 表示允许发送的时间窗口的大小;其后的 Sync time 字段是同步时间,由 OLT 决定;最后一个 Pad 字段起到填充作用
对于 Discovery GATE 消息,GATE 消息的 Data 字段就演变成上边的情况,一般情况下,关于 Numbers of grants/flags 字段,携带的发送窗口个数为 1,在第 4 个 bit 处置 1,且不会强制哪个 ONU 回复,所以后 3 bits 置 0
对于 Normal GATE 消息,关于 Numbers of grants/flags 字段,携带的发送窗口是情况而定,最大为 4;第 4 bit 置 0;后 4 bits 也是视情况而定,如果需要 ONU 必须回复,那请在后续的 Grant 中指明时间和时长即可
与 GATE 消息相同的格式,如下图,
仅仅是 Data/Reserved/Pad 字段有所变化,但还是固定的 40 bytes。其中,第一个 Flags 字段置 1 表示这是请求注册;置 0 表示撤销注册请求,其余值保留;第二个 Pending grants 字段表示 ONU 此时还可以接收发送时间窗口参数的个数,告诉 OLT 目前 ONU 的发送进度,让 OLT 不要一股脑甩时间窗口给 ONU,因为多余的窗口 ONU 也利用不了,都会被丢弃的。另外,Opcode 值为 0x0004 表示为 REGISTER_REQ 消息
与 REGISTER_REQ 消息类似,如下图,
其中的第一个字段 Assigned port 指的是 LLID;第二个字段 Flags 置 1 表示已注册的 ONU 重新注册,置 2 表示已注册的 ONU 撤销注册,置 3 表示注册成功,置 4 表示注册失败,其余值保留;其后的 Sync time 字段是 OLT 接收的同步时间;Echoed Panding grants 是回复 REGISTER_REQ 消息中的 Pending grants 的,意在告诉 ONU:我 OLT 知道你目前的时间窗口缓存空间了。另外,Opcode 值为 0x0005 表示为 REGISTER 消息
同样,与上面的消息类似,如下图,
其中的第一个字段 Flags 置 0 表示不响应注册,置 1 表示确认注册;第二、三两个字段是用来回复 REGISTER 消息中的 Assigned port 和 Sync Time 的。另外,Opcode 值为 0x0006 表示为 REGISTER_ACK 消息
最后,需要注意的是,除了 REGISTER 消息,所有的 MPCP 消息的 Destination Address 都使用 01-80-C2-00-00-01 的组播地址;而 REGISTER 消息使用目标 ONU 的 MAC 地址。另外,MPCP 消息长度固定为 64 bytes
在 ONU 完成注册之后,还需要定期向 OLT 发送所谓的心跳包以维持这种注册关系。一般,在 EPON 网络中 Normal GATE 消息( OLT → ONU )扮演心跳包的角色,上行( ONU → OLT )是 REPORT 消息,且时间间隔为 1 秒,也就是说 1 秒之内如果没有收到对端发来的消息,则认为彼此的链路可能出现了问题,进而 OLT 会将这个已注册的 ONU 踢除
在某些场合,可能会存在 OLT 需要 ONU 重新注册( Reregister )的情况,这时 OLT 可以通过发送 REGISTER 消息(其 Flag 字段为 Reregister ),要求 ONU 重新进行注册;同样,ONU 也可以通知 OLT 注销该 ONU( Deregister ),这时 ONU 向 OLT 发送 REGISTER_REQ 消息(其 Flag 字段为 Deregister )
其中,Normal GATE 消息主要用于 OLT 为 ONU 分配上行的发送窗口(何时能够发送数据及发送时间的长度),如此一来,OLT 可以确保所有 ONU 能够在不同时刻发送数据,进而避免了他们在发送数据时发生冲突;同样,REPORT 消息是 ONU 用来告知 OLT 自身当前队列的状态,包括但不局限于发送的数据包数、需要的带宽等信息
总结一下,Normal GATE 和 REPORT 消息都是为了管理 OLT 和 ONU 之间的通信,以保证 EPON 网络的数据流量能够有序且高效的运行
下面,我还想针对 REPORT 消息的具体格式展开描述,如下图,
ONU 有 8 个优先级队列,如果队列不为空,则向 OLT 汇报队列的长度,其中的 Report bitmap 表示第 x 个队列是否存在。另外,Opcode 值为 0x0003 表示为 REPORT 消息