2. 上行帧结构基础:GPON上行帧的时隙划分、T-CONT概念、Alloc-ID与Port-ID的映射关系

好,咱们接着聊GPON的上行方向。下行方向是OLT在广播,所有ONU都在听,这个逻辑相对好理解。但上行方向就反过来了——多个ONU要往同一个OLT发数据,这就涉及到一个核心问题:怎么避免撞车?

说白了,GPON的上行传输就是一个“多对一”的时分复用系统。OLT给每个ONU分配一个时间窗口,轮到你了你才能发。这个时间窗口的划分,就是上行帧结构要解决的事。

2.1 上行帧的时隙划分

GPON的上行帧长度是固定的,125微秒。嗯,这个数字是不是很眼熟?跟下行帧一样。但上行帧内部的结构,跟下行完全不同。

一个上行帧由若干个时隙(Slot)组成。每个时隙可以分配给不同的ONU,也可以分配给同一个ONU的不同业务流。OLT通过BWmap(带宽映射)来告诉每个ONU:你在哪个时隙发、发多长。

我画了一张图,帮你理解上行帧的时隙划分逻辑:

GPON上行帧结构(125μs) PLOu 物理层开销 时隙1 ONU-1 Alloc-ID: 101 时隙2 ONU-2 Alloc-ID: 201 时隙3 ONU-1 Alloc-ID: 102 时隙4 ONU-3 Alloc-ID: 301 时隙5 ONU-2 Alloc-ID: 202 DBRu 动态 报告 时间轴 →

你看,每个上行帧的开头都有一个PLOu(物理层开销),用于帧同步和突发模式恢复。后面跟着若干个数据时隙,最后还有一个DBRu(动态带宽报告)区域。注意,同一个ONU可以在一个帧里出现多次——比如图中的ONU-1就占了时隙1和时隙3,分别对应不同的业务。

💡 我的经验: 在实际调试中,我经常用抓包工具看BWmap。有一次发现某个ONU的上行时隙总是对不齐,最后查出来是OLT侧的时间戳计算有偏差。嗯,这种问题光看协议文档是看不出来的,得动手抓数据。

2.2 T-CONT:传输容器的概念

接下来聊一个GPON里非常重要的概念——T-CONT(Transmission Container,传输容器)

你想想看,一个ONU下面可能接了多个用户,每个用户可能有不同的业务:有人在看视频,有人在打游戏,有人在下载文件。这些业务对带宽的需求不一样,对时延的敏感度也不一样。如果所有业务都挤在一个队列里发,那视频卡顿、游戏延迟高的问题就来了。

T-CONT就是用来解决这个问题的。它本质上是一个逻辑上的缓存队列,每个T-CONT有自己的QoS参数。OLT在分配上行带宽时,会根据T-CONT的类型和优先级来调度。

GPON标准定义了5种T-CONT类型:

类型 名称 带宽保障方式 典型应用
Type 1 固定带宽 固定分配,不竞争 TDM专线、语音
Type 2 保障带宽 保证最小带宽,可竞争额外 视频会议、VPN
Type 3 非保障带宽 尽力而为,无保证 网页浏览、邮件
Type 4 尽力而为 完全竞争,无优先级 P2P下载、后台同步
Type 5 混合型 以上任意组合 综合业务接入

我个人习惯把T-CONT理解成“业务通道”。每个通道有自己的“车道宽度”(带宽)和“通行规则”(调度策略)。OLT就像交通指挥中心,根据每个通道的优先级和当前拥堵情况,决定放行多少数据。

🔑 关键点: 一个ONU可以配置多个T-CONT,每个T-CONT对应一个Alloc-ID。OLT通过Alloc-ID来识别不同的T-CONT,从而实现精细化带宽管理。

2.3 Alloc-ID与Port-ID的映射关系

好,现在到了最容易混淆的部分——Alloc-IDPort-ID到底有什么区别?

我刚开始学GPON的时候,也被这两个ID搞晕过。后来在项目里调了一个多月的ONU注册流程,才彻底搞明白。咱们一步步拆解。

Alloc-ID(Allocation Identifier,分配标识符)

  • 用于上行带宽分配
  • 每个T-CONT对应一个唯一的Alloc-ID
  • OLT在BWmap中通过Alloc-ID指定哪个T-CONT在哪个时隙发送
  • 范围:0~65535(16位)

Port-ID(Port Identifier,端口标识符)

  • 用于GEM帧的复用/解复用
  • 每个GEM端口对应一个唯一的Port-ID
  • ONU在上行数据中携带Port-ID,OLT根据Port-ID将数据分发到不同的业务端口
  • 范围:0~4095(12位)

说白了,Alloc-ID管的是“什么时候发”Port-ID管的是“发到哪里去”。一个是时间维度的调度,一个是空间维度的路由。

它们之间的映射关系是这样的:

ONU T-CONT 1 (Alloc-ID 101) T-CONT 2 (Alloc-ID 102) T-CONT 3 (Alloc-ID 103) 映射关系 Alloc-ID 101 → Port-ID 1 Alloc-ID 102 → Port-ID 2,3 Alloc-ID 103 → Port-ID 4 OLT Port-ID 1 Port-ID 2 Port-ID 3 Port-ID 4

你看这个图就清楚了。ONU内部有多个T-CONT,每个T-CONT有自己的Alloc-ID。当数据从T-CONT发出去时,会被封装成GEM帧,每个GEM帧头部携带Port-ID。OLT收到后,根据Port-ID把数据送到对应的业务处理模块。

⚠️ 避坑指南: 我曾经在一个项目里遇到过这样的问题——ONU配置了多个T-CONT,但OLT侧始终收不到某些业务的数据。查了半天,发现是Alloc-ID和Port-ID的映射关系配反了。Alloc-ID 101对应的T-CONT里,GEM帧却带了Port-ID 2的标签,导致OLT把数据丢到了错误的端口。所以,映射关系一定要在ONU注册阶段就确认清楚

2.4 实际应用中的映射策略

在实际部署中,Alloc-ID和Port-ID的映射策略通常有以下几种:

  1. 一对一映射:一个T-CONT对应一个GEM端口。简单清晰,适合业务类型单一的场景。
  2. 一对多映射:一个T-CONT对应多个GEM端口。适合一个高优先级业务通道承载多个同类子业务的场景。
  3. 多对一映射:多个T-CONT对应同一个GEM端口。这种情况比较少见,一般用于特殊QoS需求。

我个人建议,除非有特殊需求,否则尽量用一对一映射。为什么?因为排查问题的时候,映射关系越简单,定位越快。你想想看,如果一对多映射,一个T-CONT里混了多种业务,一旦出现丢包或延迟,你很难判断是哪个业务出了问题。

💡 实用技巧: 在ONU的配置文件中,我习惯给每个T-CONT加一个描述字段,比如“T-CONT_1_VOIP”、“T-CONT_2_VIDEO”。这样在OLT侧看统计信息时,一眼就能知道每个Alloc-ID对应的是什么业务。这个小习惯帮我省了不少排查时间。

好了,关于上行帧结构的基础知识就聊到这里。记住三个核心点:时隙是OLT通过BWmap分配的,T-CONT是业务容器,Alloc-ID和Port-ID分别管调度和路由。把这些理清了,后面的动态带宽分配和DBA算法就好理解了。


专注资料整理