☰
G.709 OTN帧结构深度解析:从OTU1到OTU3的开销、FEC与实战排查
2026/10/6 7:11:32 网站建设 项目流程

简介:这份文档面向光通信与电信网络领域的工程师、运维人员及通信专业学生,系统讲解ITU-T G.709标准与OTN光传送网技术,帮助读者理解光网络接口协议、分层结构与帧格式等核心知识。压缩包内为1个doc文档,约1.07MB,内容以标准解读与帧结构分析为主,适合作为技术查阅与学习笔记使用。文档从背景介绍切入,依次展开OTUk帧结构及其开销、前向纠错FEC与加扰机制,ODUk的PM、TCM及其他开销,OPUk开销与映射相关字段,并涵盖OTN维护信号、客户信号映射方式,包括CBR2G5、CBR10G、CBR40G到OPUk的映射、10GE业务到OTU2的映射以及ODUk到ODTUjk的映射,还对比了同步映射与异步映射的差异。目前已有379人学习,适合需要系统掌握OTN帧结构与映射机制、查漏补缺的读者参考。

1. 为什么搞光传输的都得把 G.709 翻烂:从 OTU1 到 OTU3 的帧结构全景

干光传输这行,只要碰过波分设备,早晚得跟 G.709 这份标准死磕。你可能会问,现在设备厂商的网管都做得挺傻瓜了,点几下鼠标业务就开通了,还有必要去啃这种满是表格和字节定义的标准文档吗?我的血泪经验是:一旦线路出现误码、倒换失败或者客户业务映射不进去,网管上那些红红绿绿的告警根本说不清问题在哪,最后还得回到帧结构里一个字节一个字节地抠。这份 G.709 标准中文版把 OTN 的帧结构、开销定义、映射方式和维护信号讲得很细,尤其适合那些需要做开销字节级故障定位、或者要自己写脚本解析 OTN 帧的工程师。它不是什么科普读物,而是一本可以放在工位上随时翻的工具书。OTN 的帧结构是层层嵌套的,OTU 包着 ODU,ODU 又包着 OPU,每一层都有自己的开销区域,搞清楚了这三层关系,再看那些告警和性能事件,基本就能对上号了。下面我就按自己平时排查问题的思路,把这份标准里最核心的几个技术点拆开讲一遍。

2. OTUk 帧结构拆解:从 FAS 定位到 FEC 纠错的手把手分析

2.1 OTUk 帧的定长结构与字节发送顺序

OTUk 帧的长度是固定的,4 行 4080 列,总共 16320 个字节。这个数字不是随便定的,后面讲 FEC 的时候你会看到它跟 RS(255,239) 编码有直接关系。发送的时候按照先从左到右、再从上到下的顺序逐个字节往外吐,每个字节内部先发 MSB 再发 LSB。这个发送顺序看着简单,但在做 FPGA 或者 ASIC 逻辑设计的时候,位序搞反了就是整帧数据全错,而且这种错误在网管上往往表现为莫名其妙的帧失步,排查起来非常费劲。

OTUk 根据速率等级分为 OTU1、OTU2、OTU3 三种,帧结构完全一样,区别只在发送速率。OTU1 的标称速率是 255/238 × 2 488 320 kbit/s,约 2 666 kbit/s;OTU2 是 255/237 × 9 953 280 kbit/s,约 10 709 kbit/s;OTU3 是 255/236 × 39 813 120 kbit/s,约 43 018 kbit/s。容差都是 ±20 ppm。你可以这样理解:OTU1 就是 STM-16 加上 OTN 开销和 FEC 之后的帧结构和速率,OTU2 对应 STM-64,OTU3 对应 STM-256。注意这里的开销既包括普通开销字节,也包括 FEC 校验字节。

2.2 OTUk 开销区域:FAS、MFAS 与 SM 监测字节

OTUk 的开销位于第一行的第 1 列到第 14 列,共 14 个字节。这 14 个字节分成三块:帧对齐字节 FAS、复帧计数字节 MFAS、以及 OTUk 开销本身。

FAS 占 6 个字节,码型是 f6h f6h f6h 28h 28h 28h,跟 STM-1 的帧对齐字节一样。这 6 个字节的作用有两个:一是作为帧开头的标记,让接收端知道帧从哪里开始;二是这个特定的码型方便 CDR 芯片从整个 OTUk 码流中提取时钟。做硬件设计的兄弟应该对这个很熟悉,帧头码型选得不好,时钟恢复电路就很容易失锁。

MFAS 位于字节 (1,7),是一个复帧计数器。为什么需要它?因为有些开销信息需要跨越多帧才能传完,比如 TTI 信号有 64 个字节,但每帧只有一个 TTI 字节,所以需要连续 64 帧的 TTI 字节拼起来才能组成完整的 64 字节 TTI 信息。MFAS 每发一帧就加 1,加到 255 再加就回绕到 0。256 个连续的 OTUk 帧组成一个 OTUk 复帧。MFAS 为 0 时对应复帧的第一帧,为 255 时对应最后一帧。一个复帧会把 64 字节的 TTI 信息重复发送 4 次,MFAS 为 0、0x40、0x80、0xC0 时分别对应每组 TTI 的第一个字节。

OTUk 开销本身占 7 个字节,从 (1,8) 到 (1,14)。其中 (1,13) 和 (1,14) 是 RES 保留字节,规定全 0。(1,11) 和 (1,12) 是 GCC0,两个字节,是给两个 OTUk 终端之间通讯用的净通道,标准对格式不做定义,你可以传任何自定义信息。SM 段监测开销占 3 个字节,从 (1,8) 到 (1,10),这是平时排查问题用得最多的地方。

SM 开销里面包含 TTI、BIP-8、BDI、BEI/BIAE、IAE 和 RES。SM-TTI 在 (1,8),是一个 64 字节的数据结构,需要连续 64 帧拼起来。64 字节 TTI 的定义是:TTI[0] 是 SAPI[0],固定全 0;TTI[1] 到 TTI[15] 是 15 个字符的源接入点标识 SAPI;TTI[16] 是 DAPI[0],固定全 0;TTI[17] 到 TTI[31] 是 15 个字符的目的接入点标识 DAPI;TTI[32] 到 TTI[63] 是运营商自定义区域。这个跟 SDH 里的 J0 字节定义基本一致,只不过 J0 用在 SDH 帧里,SM-TTI 用在 OTUk 帧里。

SM-BIP-8 在 (1,9),是一个字节的位交叉偶校验码。计算方法是在第 i 个 OTUk 帧的 OPUk 帧中(从第 15 列到第 3824 列,包括所有 4 行)计算 BIP-8,然后把结果放到第 i+2 个 OTUk 帧的 SM-BIP-8 位置上。注意是 i+2 而不是 i+1,这个延迟两帧的设计是为了给接收端留出处理时间。SM-BDI 只有一位,在 (1,10) 的位 5,用来向上游传反向失效指示。为 1 表示下游节点检测到失效,为 0 表示正常。这个原理跟 SDH 里反向发送 MS-RDI 的过程基本一致。SM-BEI/BIAE 占 4 位,在 (1,10) 的位 1 到 4,用来向上游传送当前站点接收到的 SM-BIP8 误码个数,同时也可以传送接收对齐错误标识。当检测到 SM-IAE 时,BEI 字段会被置为 1011(0xB),表示当前已经接收到 IAE 错误。没有检测到 IAE 时,就把 BIP-8 误码个数 0 到 8 放到 BEI 字段里。SM-IAE 占一位,在 (1,10) 的位 6,为 1 表示有接收对齐错误。所谓接收对齐错误,是指当接收端没有 OOF 时,帧头每次都应该出现在期望的位置上。如果出现 OOF 或 LOF,退出 OOF 回到正常 IF 状态时,帧头位置跟原来期望的不一致,就认为出现了帧错位,此时就是 IAE 状态。检测到 IAE 后,应该把下游发送器的 SM-IAE 字段置 1,并且在多个复帧之内一直保持有效。接收到 IAE 有效时说明当前帧处于不稳定状态,此时应该停止向上游发送 SM-BEI。SM-RES 占两位,在 (1,10) 的位 7 和位 8,规定始终为 00。

2.3 FEC 编码与加扰:RS(255,239) 和多项式复位机制

OTUk FEC 的位置从每行的第 3825 列开始到最后一列 4080,共 4 行。FEC 的作用是给 OTUk 帧加入冗余校验信息,这样经过传输后即使引入个别误码,只要误码不超过一定数量,就能通过解 FEC 的方式纠正过来。标准规定 OTUk 的 FEC 采用 Reed-Solomon RS(255,239) 编码。RS(255,239) 是一种非二进制编码,以字节符号为单位,属于系统线性循环块编码类。239 字节的原始数据增加 16 字节校验信息,形成 255 字节的编码后信息。RS 编码最多允许同时纠正 8 个字节的错误,同时最多能够检测到 16 个字节的错误。超过 8 个字节但不到 16 个字节的错误,解码算法能检测出实际错误字节数,但无法纠正。由于冗余信息只有 16 个字节,算法最多只能检测到 16 个字节的错误。

在进行 FEC 编码时,每行 OTUk 帧被分为 16 个子行,每行 255 个字节。这 16 个子行以字节间插的方式形成。数据和校验信息是分开进行字节间插的:16 个子行中每行都分成 239 字节的数据和 16 字节的校验信息,16 个子行的数据进行字节间插得到 16×239=3824 字节的数据,然后 16 个子行的校验信息进行字节间插得到 16×16=256 字节的校验信息,组合到一起构成 OTUk 帧的一行。具体来说,第 1 列是子行 1 的第 1 个字节,第 2 列是子行 2 的第 1 个字节,以此类推,第 16 列是子行 16 的第 1 个字节,第 17 列是子行 1 的第 2 个字节,直到第 3824 列是子行 16 的第 239 字节。从第 3825 字节开始是进行了字节间插的校验信息。这样每行由前面的 3824 字节数据和后面的 256 字节校验信息组成,这也正是 OTUk 帧结构定义的由来。由于 FEC 码是按照 (255,239) 的方式实现的,OTUk 帧的每行必须是 255 字节的整数倍。OTUk 选择了一行由 16 个 FEC 项组成,每个 FEC 项 255 字节,其中校验信息 16 字节,数据信息 239 字节,每个 OTUk 帧再由 4 行组成,所以一行的长度是 255×16=4080 字节。在 OTUk 的 3824×4 字节数据信息中,前 16 列作为开销(包括 OTUk、ODUk 和 OPUk 的开销),后面的 (3824-16)×4 就是 OPUk 的净荷,也就是真正的数据信息 Payload。

OTUk 帧为了在线路上传输,必须保证码型中 1 和 0 的比例基本相当,避免出现长连 0 或者长连 1 的情况,这样才能保证接收设备能够从业务中提取出时钟。为此,OTUk 帧必须经过加扰后才能在线路上传输。加扰使用的多项式是 1 + x + x^3 + x^12 + x^16。加扰从 OTUk 帧的帧定位最后一个字节结束时开始,也就是说第一个被加扰的位是 MFAS 字节的 MSB。每次遇到 MFAS 的 MSB 时,加扰多项式会复位成默认值 0xFFFF,之后此位后面的所有位开始被加扰。x^16 的输出和业务数据位作模 2 加后得到加扰后的结果。由于加扰是从 MFAS 的 MSB 开始的,所以帧最开始的 6 个字节的帧定位信息没有被加扰。加扰是针对 OTUk 帧进行的,由于 FEC 为 OTUk 帧中的内容,所以加扰也是在 FEC 编码后进行的。注意,SDH 加扰使用的多项式是 1 + x^6 + x^7,跟 OTUk 的加扰多项式不一样。OTUk 需要在编码后进行加扰,经过传输后也必须解扰后才进行解码操作。解扰和加扰的算法完全一样,对加扰的信号再执行一次加扰操作就相当于进行了解扰。

3. ODUk 与 OPUk 开销实战:PM、TCM 和映射相关的字节级定位

3.1 ODUk 帧结构:PM 与 TCM 监测开销的字节位置

ODUk 的帧结构由两部分组成:ODUk 开销和 OPUk 帧。ODUk 的开销占用 OTUk 帧第 2、3、4 行的前 14 列。第一行的前 14 列被 OTUk 开销占据。ODUk 开销主要由三部分组成:PM 路径监测、TCM 串联连接监测和其他开销。PM 只有一组开销,而 TCM 有 6 组开销,分别为 TCM1 到 TCM6。PM 和 TCM 代表 ODUk 帧中不同的监测点。

ODUk PM 开销位于第三行,字节 (3,10) 到 (3,12),共 3 个字节。结构和 OTUk SM 开销差不多,唯一不同的是 SM-IAE 加 SM-RES 的位置被 PM-STAT 所代替。PM-TTI 在 (3,10),长度一个字节,用于传送路径监测中的 TTI 信息,由连续 64 帧中的此开销组成 64 字节的信息,定义同 SM-TTI 完全一致。PM-BIP-8 在 (3,11),长度一个字节,结构和定义基本同 SM-BIP-8,但用于路径监测中。PM-BIP8 的计算范围为整个 OPUk 帧(第 15 列到第 3824 列),第 i 帧的 BIP-8 校验结果放到第 i+2 帧的 PM-BIP8 开销位置上。PM-BDI 只有一位,在 (3,12) 的位 5,定义和 SM-BDI 基本一致,用来向上游反向发送路径检测时遇到的失效信息,1 指示有 ODUk 失效,0 为正常。PM-BEI 共 4 位,在 (3,12) 的位 1 至位 4,定义和 SM-BDI 基本一致但没有 SM-BIAE,用来向上游反向发送本节点的 PM-BIP8 误码个数,误码范围为 0 到 8。由于 PM-BEI 共有 4 位,但可能存在的错误数只有 0 到 8,所以取值 9 到 15 为非法值,应该认为此时误码为 0。PM-STAT 共 3 位,在 (3,12) 的位 6 至位 8,用来指示当前的维护信号。

TCM 开销有 6 组,TCM1 到 TCM6,每组的结构跟 PM 类似,但位置不同。TCM 的作用是支持多运营商或者多管理域的串联连接监测,每个 TCM 级别可以独立监测一段路径的性能。在实际组网中,TCM 的使用比较灵活,有的设备默认全部使能,有的只使能其中几级。排查问题时如果发现某一级 TCM 有误码但 PM 没有,说明问题出在那一段串联连接上,可以缩小排查范围。

3.2 OPUk 帧结构与客户信号映射方式

OPUk 帧由 OPUk 净荷和 OPUk 开销组成。OPUk 开销位于第 15 列到第 16 列,共 2 个字节。其中 (1,15) 到 (1,16) 是 PSI 净荷结构标识,(2,15) 到 (2,16) 是映射和级联专用开销,(3,15) 到 (3,16) 也是映射和级联专用开销,(4,15) 到 (4,16) 是保留字节。PSI 中的 PT 字节指示净荷类型,比如 0x02 表示异步映射的 CBR2G5 信号,0x03 表示异步映射的 CBR10G 信号,0x07 表示 10GE 业务等。做业务开通的时候,如果 PT 值配错了,客户信号就映射不进去,网管上会报净荷类型失配告警。

客户信号的映射方式主要有几种。CBR2G5、CBR10G 和 CBR40G 信号(也就是 STM-16/64/256)映射进 OPUk 的方式在标准第 2.5.1 节有详细描述。10GE 业务到 OTU2(11.1G)的映射在第 2.5.2 节。4 个 ODU1 到 1 个 OPU2 的映射,也就是 ODUk 信号映射进 ODTUjk 信号的方式,在第 2.5.3 节。同步映射和异步映射的比较在第 2.5.4 节。同步映射的优点是延迟低、抖动小,但对时钟同步要求高;异步映射对时钟偏差容忍度好,但会引入映射抖动。实际组网中选哪种映射方式,取决于客户信号的时钟质量和业务对抖动的敏感程度。

3.3 维护信号与常见告警的对应关系

OTN 的维护信号用于网络的运行监控。常见的维护信号包括 OTUk 的维护信号和 ODUk 的维护信号。OTUk 的维护信号主要有 OOF、LOF、LOM 等。OOF 是帧失步,表示接收端无法定位到帧头;LOF 是帧丢失,表示 OOF 持续了一段时间;LOM 是复帧丢失,表示 MFAS 无法正确解析。ODUk 的维护信号主要有 ODUk-AIS、ODUk-OCI、ODUk-LCK 等。ODUk-AIS 是告警指示信号,表示上游检测到了失效;ODUk-OCI 是开放连接指示,表示路径没有配置;ODUk-LCK 是锁定信号,表示路径被管理性锁定。这些维护信号通过 PM-STAT 字段来指示,不同的取值对应不同的维护信号。排查问题时,先看 PM-STAT 的值,就能快速判断是哪种维护信号,然后再往上追溯是哪个节点插入的。

4. 避坑与排查:OTN 开销解析中容易翻车的五个地方

4.1 BIP-8 误码计数正常但业务不通

现象是网管上 BIP-8 误码计数为零,但客户业务就是不通。原因可能是 BIP-8 的计算范围搞错了。SM-BIP-8 的计算范围是 OPUk 帧,从第 15 列到第 3824 列,包括所有 4 行。PM-BIP8 的计算范围也是整个 OPUk 帧。如果计算时把开销字节也算进去了,或者漏掉了某一行,BIP-8 的结果就会跟对端不一致,但误码计数可能仍然显示为零,因为双方都算错了。解决办法是仔细核对 BIP-8 的计算范围,确保只对 OPUk 净荷区域进行计算,并且四行都要算进去。

4.2 TTI 不匹配导致业务中断

现象是业务突然中断,网管上报 TTI 失配告警。原因是 TTI 的 64 字节信息需要连续 64 帧才能拼完,如果中间有帧丢失或者 MFAS 计数错乱,TTI 就会拼错。另外,SAPI 和 DAPI 的字符集如果包含非法字符,也会导致 TTI 比对失败。解决办法是检查 MFAS 计数是否连续,确认 TTI 的 64 字节是否跟 MFAS 对齐。MFAS 为 0、0x40、0x80、0xC0 时分别对应每组 TTI 的第一个字节。如果对齐关系错了,TTI 就会错位。

4.3 FEC 纠错能力被高估

现象是线路误码率稍微高一点,业务就中断了,但理论上 RS(255,239) 应该能纠 8 个字节的错误。原因是 FEC 的纠错能力是针对每个子行的,16 个子行是字节间插的,如果误码集中在某个子行上,那个子行的误码数可能超过 8 个,导致纠错失败。另外,如果误码是突发性的,跨越了多个子行,也可能导致纠错失败。解决办法是不要单纯依赖 FEC 的纠错能力,线路设计时要留足够的余量。如果误码率持续偏高,应该先查线路衰减和色散,而不是指望 FEC 能兜住。

4.4 加扰多项式复位时机错误

现象是接收端无法提取时钟,或者帧失步频繁发生。原因是加扰多项式的复位时机搞错了。加扰多项式在每次遇到 MFAS 的 MSB 时复位成 0xFFFF,第一个被加扰的位是 MFAS 字节的 MSB。如果复位时机提前或者延后了,加扰结果就跟对端不一致,接收端解扰后得到的数据就是错的。解决办法是仔细核对加扰逻辑,确保复位信号在 MFAS 的 MSB 位置产生,并且帧最开始的 6 个字节的 FAS 不被加扰。

4.5 PM-BEI 非法值处理不当

现象是网管上 PM-BEI 显示异常,误码计数跳变。原因是 PM-BEI 只有 4 位,但可能存在的错误数只有 0 到 8,取值 9 到 15 是非法值。如果接收端没有正确处理这些非法值,就会导致误码计数错误。解决办法是按照标准规定,把 9 到 15 的取值都当作误码为 0 来处理。SM-BEI 字段包含了 BEI 和 BIAE 两种信息,处理逻辑更复杂一些,需要根据 BIAE 的状态来决定 BEI 的取值。

5. 进阶技巧:用脚本解析 OTUk 帧并自动提取 TTI 信息

前面讲的都是手工分析的方法,但在实际工作中,面对几十上百个 OTN 端口,手工分析根本不现实。我一般会写一个 Python 脚本来解析 OTUk 帧的二进制数据,自动提取 TTI、BIP-8 误码计数和 PM-STAT 状态。下面是一个简化的示例,假设你已经从设备抓到了 OTUk 帧的原始字节流。

import struct def parse_otuk_frame(frame_bytes): """ 解析 OTUk 帧,提取 SM-TTI、SM-BIP-8 和 PM-STAT 信息。 frame_bytes: 长度为 16320 的字节数组,对应一个完整的 OTUk 帧。 """ # OTUk 帧是 4 行 4080 列,按行优先存储 rows = 4 cols = 4080 assert len(frame_bytes) == rows * cols, "帧长度不对" # 提取 SM-TTI 字节,位于 (1,8),即第 0 行第 7 列(从 0 开始计数) sm_tti_byte = frame_bytes[0 * cols + 7] # 提取 SM-BIP-8,位于 (1,9) sm_bip8 = frame_bytes[0 * cols + 8] # 提取 SM-BEI/BIAE 和 SM-BDI,位于 (1,10) sm_bei_biae_bdi = frame_bytes[0 * cols + 9] sm_bdi = (sm_bei_biae_bdi >> 4) & 0x01 # 位 5 sm_bei = sm_bei_biae_bdi & 0x0F # 位 1-4 # 提取 PM-STAT,位于 (3,12) 的位 6-8 pm_stat_byte = frame_bytes[2 * cols + 11] pm_stat = (pm_stat_byte >> 5) & 0x07 # 提取 PM-BEI,位于 (3,12) 的位 1-4 pm_bei = pm_stat_byte & 0x0F if pm_bei > 8: pm_bei = 0 # 非法值按 0 处理 return { "sm_tti_byte": sm_tti_byte, "sm_bip8": sm_bip8, "sm_bdi": sm_bdi, "sm_bei": sm_bei, "pm_stat": pm_stat, "pm_bei": pm_bei, } # 假设 frame_data 是从设备抓到的 16320 字节 # result = parse_otuk_frame(frame_data) # print(result)

这段代码的逻辑很直接:根据字节位置从帧数据里把开销字节抠出来,然后按位域拆解。参数说明一下:frame_bytes是一个长度为 16320 的字节数组,对应一个完整的 OTUk 帧,按行优先存储,也就是先存第 1 行的 4080 个字节,再存第 2 行,以此类推。sm_tti_byte只是 TTI 的一个字节,要拼出完整的 64 字节 TTI,需要连续采集 64 帧,然后按 MFAS 的顺序把每个帧的 TTI 字节拼起来。pm_stat的取值对应不同的维护信号,具体对应关系需要查标准里的表 5。

实际使用的时候,我一般会把这个脚本跟设备的 CLI 或者 NETCONF 接口结合起来,定期采集帧数据,然后自动比对 TTI 和误码计数。如果发现 TTI 不匹配或者误码计数持续增长,就自动触发告警。这样比人工盯着网管看效率高得多。从那以后我每次新开通 OTN 业务,都强制走一遍脚本自动比对 TTI 和 BIP-8 的流程,确认开销字节全部对齐了再放业务上线。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询