GMP (Generic Mapping Procedure,通用映射规程)是OTN (Optical Transport Network) 中用于将各种速率的客户信号(Client Signal)映射到OPUk(Optical Payload Unit)容器中的关键技术。
与传统的 AMP (Asynchronous Mapping Procedure) 相比,GMP 的最大特点是灵活和高效,它不依赖固定的正/负码速调整位置,而是通过计算动态确定每帧携带的数据量,并将其均匀分散。
以下为您详细介绍$C_m(t)$值的计算原理和数据在容器中的分布原理。
一、 核心概念:什么是$C_m(t)$?
在GMP 中,$C_m(t)$是最核心的参数。
-
定义:它表示在第$t$ 个 OPUk 服务器帧(Server Frame)中,实际装载的客户数据实体的数量。
-
单位:以$m$-byte 为单位(通常$m=1$到$256$,在 OPUk 中通常 $m=1$字节或$TS$时隙大小)。
-
作用: $C_m(t)$ 直接反映了客户信号相对于服务器时钟的速率。接收端通过读取 JC (Justification Control) 字节中的 $C_m(t)$ 值,就能知道这一帧里有多少有效数据,从而恢复出客户时钟。
二、$C_m(t)$值的计算原理(产生逻辑)
$C_m(t)$ 的计算本质上是一个频率比较和相位累加的过程。它的目的是保证映射后的数据流速率与客户侧输入速率保持一致。
1. 基本公式逻辑
在一个OPUk 帧周期 ($T_{server}$) 内,客户信号到达的比特数理论上是:
$$\text{Data}_{client} = f_{client} \times T_{server}$$
但是,由于 $f_{client}$和$f_{server}$ 都是模拟量且有波动,且数据必须以整数个实体 ($m$-byte) 传输,所以每帧传输的数量 $C_m(t)$会在两个整数之间跳变。
2. Sigma-Delta 算法(累加器模型)
GMP 使用类似Sigma-Delta 调制的算法来计算$C_m(t)$。想象一个“相位累加器”:
-
输入:客户时钟($f_{client}$) 和服务器时钟 ($f_{server}$) 的计数值。
-
累加: 每个服务器帧周期,计算客户侧积累了多少个 $m$-byte 的数据。
-
残余处理:
-
如果累积的数据不是整数(例如 15230.4 个),整数部分 (15230) 变为当前的 $C_m(t)$发送出去。
-
小数部分 (0.4) 也就是“相位误差”,会保留在累加器中,带入下一帧计算。
-
-
下一帧: 下一帧可能积累了 15230.4 + 0.4 = 15230.8,还是发 15230。再下一帧可能是 15230.8 + 0.4 = 15231.2,这时 $C_m(t)$就变成了15231 。
总结: $C_m(t)$的值通常在$Y$和$Y+1$两个整数之间变化,其平均值精确等于客户信号速率与服务器帧速率的比值。
三、 数据在容器中的分布原理(映射逻辑)
计算出这一帧要发多少个数据 ($C_m$) 后,接下来的问题是:这 $C_m$个数据块放在OPUk 净荷区的什么位置?
GMP 摒弃了 AMP 那种“固定位置存放数据,固定位置填充”的做法,而是采用均匀分散的策略,这对于降低抖动(Jitter)至关重要。
1. 容器结构
假设OPUk 的净荷区域总共有$P_{server}$个位置(以$m$-byte 为单位)。
-
有效数据量: $C_m$个。
-
填充数据量(Stuff): $P_{server} - C_m$个。
2. Sigma-Delta 分布算法(均匀插空)
GMP 再次使用Sigma-Delta 算法(有时称为“累加器算法”或“Bresenham 算法的变体”)来决定每一个位置是放“数据”还是放“填充”。
原理如下:
有一个累加器变量$j$,初始为 0。对于净荷区的每一个位置 $i$($1$到$P_{server}$):
-
我们将$C_m$累加到变量$j$中:
$$j = j + C_m$$
-
判断逻辑:
-
如果$j \ge P_{server}$:
-
当前位置$i$放置有效数据(Data) 。
-
累加器减去总容量:$j = j - P_{server}$。
-
-
如果$j < P_{server}$:
-
当前位置$i$放置填充字节(Stuff) 。
-
累加器保持不变(或者根据具体实现逻辑,反向理解亦可,核心是比例控制)。
-
-
3. 视觉效果:均匀混合
通过上述算法,有效数据和填充数据会非常均匀地混合在一起。
-
例子: 假设容器大小是 8,要放 5 个数据 ($C_m=5$),3 个填充。
-
分布结果不会是
DDDDDSSS(数据集中)。 -
而是类似
DADADADD(D=Data, A=Stuff/All-zero),数据均匀散开。
-
四、 总结与对比表
为了帮助记忆,我们可以将计算原理和分布原理总结如下:
| 特性 | C米(t )计算(Outer Loop) | 数据分布(Inner Loop) |
| 目的 | 决定发多少(速率适配) | 决定放哪里(抖动控制) |
| 输入 | $f_{client}$对比$f_{server}$(时钟差) | $C_m$(数据量) vs$P_{server}$(总容量) |
| 核心算法 | Sigma-Delta (相位累加) | Sigma-Delta (均匀插值) |
| 结果体现 | JC 字节中的数值变化 | 净荷区中Data/Stuff 的排列图案 |
| 优势 | 可以适应任意速率(Any-rate) | 接收端更容易恢复时钟,抖动极低 |
五、 形象化比喻
您可以这样理解GMP 的全过程:
-
$C_m$ 计算(装水):
你有一个水龙头(客户信号)往桶里流数(缓存)。每隔固定的时间(服务器帧),你从桶里舀出一勺水。因为水流速度不完全均匀,你这一勺有时候是 1000 滴水,有时候是 1001 滴水。这个数字就是 $C_m$。
-
数据分布(撒豆子):
你手里现在有$C_m$ 颗红豆(数据),你需要把它们放到一个有很多格子($P_{server}$)的盒子里。为了好看且平衡,你不能把红豆全堆在一头,而是利用数学算法,把红豆最均匀地撒在所有格子里,空出来的地方放绿豆(填充)。
举例:
Pserver = 8
cmt = 5
容器: * * * * * * * *
数据: 0 1 0 1 1 0 1 1 0:表示塞入 1:表示有效数据
j: 5 2 7 4 1 6 3 0