ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

超帧与复帧详解:从OTN MFAS到E1/SDH帧同步调测

超帧与复帧详解:从OTN MFAS到E1/SDH帧同步调测 上周在客户机房调OTN仪表上反复报MFAS不连续。值班的小伙子问我MFAS到底管什么用。我说你把这串OTU帧当成一本书FAS是每页的页眉MFAS就是页码从0数到255翻完一整本——这一整本就是hyperframe超帧。其实“hyperframes”这个词在不同行当里的指向完全不一样。搞视频的看到它想到的是把连续多帧图像堆起来做光流或时空特征搞网络的看到它想到的是传输协议里由多个帧聚合形成的更大帧组。网上关于这个词的讨论很零散我这次就按通信链路里最常遇到的超帧结构结合自己调设备时攒下来的笔记整理成一篇能直接落地的内容。如果你是从视频编解码或自动驾驶多帧融合那边搜过来的我也留了一小节做对照看完就能明白两边到底是不是一个东西。这篇文章主要适合做光传输、SDH/PDH、接入网、协议栈开发以及平时要跟E1/OTN打交道的工程师参考。我自己是干传输设备调试出身的文里所有思路都是在现网故障和联调现场验证过的东西不是课本上的概念复读。1. 超帧到底在解决什么问题1.1 先说清楚帧、复帧、超帧怎么叠出来的通信协议里的“帧”是一个很具体的概念它是一次传输的最小封装单元有固定长度、固定开销位置比如E1帧是125微秒长、32个时隙OTU帧则是4行乘4080列的一个块。单帧能承载的东西其实非常有限因为协议设计者会在每一帧里预留开销字节但OAM信息、信令信息、保护倒换信息往往比一帧能装下的多得多。那怎么办最笨的办法是把帧做大。但帧一旦做大设备里的缓存就要跟着变大时延也会上升这在传输网里是不能忍的。于是协议设计者换了一个思路保持单帧物理长度不变把多个帧按固定周期组合成一个更大的逻辑单元。这个组合出来的单元在PCM里叫复帧在SDH里也经常叫复帧在OTN里规范叫法是“通过MFAS构造的复帧框架”而工程圈为了省事直接叫它超帧。hyperframes这个词一般就是指这一类“由帧组成的帧”。可以拿快递做类比单个帧是一辆货车每个货车有自己的车牌和通行证但真正跑长途干线时几百辆货车组成一个车队车队有一份统一的调度单排班、目的地、交接点都写在调度单上。超帧就是这份调度单的“装订线”它把散落的每一帧串成一个有序整体让接收端知道“现在读到的是哪一页”。在这个结构里复帧和超帧的分工其实有点模糊。有人把2到16帧级别的聚合叫复帧把上百帧级别的聚合叫超帧也有人完全混着用。我的建议是不要纠结中文叫什么聚焦在“层次”上帧级同步解决的是“这一帧从哪开始”超帧级同步解决的是“这是第几帧”。两个层次一旦混在一起调试时就会非常痛苦。1.2 超帧不是把帧变大而是给帧编页码理解了超帧的物理形态再看它存在的理由就顺了。我这些年总结下来超帧解决的核心问题只有三个开销扩展、周期匹配、可靠性提升。开销扩展是最直接的动因。拿OTN来说一帧里同一位置的字节如果只能表达一种含义那OAM能传递的信息量就被锁死了。有了超帧同一列开销在不同帧号下可以被赋予不同含义MFAS就是页码。比如帧号为0时某个字节代表通道A的状态帧号为7时代表通道B的状态接收端先读页码再按页码解释内容。这本质上就是用“时间换空间”拿多帧的周期换来开销字段的逻辑扩展。周期匹配则是对业务特性的妥协。E1里随路信令的abcd四个比特每2毫秒更新一次就够了不需要每帧125微秒都传一遍SDH里VC-12的通道开销也是类似V5、J2、N2、K4四个字节正好分布在4个帧里循环。协议设计者其实是在告诉设备这些信息本身不是高频信息没必要每一帧都传也不需要接收端每一帧都解析。可靠性这一点容易被忽略。单帧的同步信息非常脆弱一两个比特的误码就可能让接收端误判帧边界或开销含义。所以通信协议普遍采用“确认型同步”帧同步需要连续N帧确认才对超帧同步也需要连续多个MFAS递增无误才成立。这里的N和M都是精心权衡过的参数后面讲FPGA实现时我会具体说。最后再补一个很多人没想通的问题为什么不做成更大的帧呢答案是延迟和缓存。帧越大设备需要缓存的比特就越多端到端时延就会变大。超帧的价值恰恰在于它用“逻辑长度扩展”替代了“物理长度扩展”——书还是那些页但页码字段让同一本书可以表达更多内容。这个设计哲学理解了看任何带超帧结构的协议都不会再发怵。2. 四个不同领域里的超帧别把页号当成帧号2.1 E1复帧信令藏在一摞帧里E1是我最早接触的“超帧”只是当时它叫复帧。E1每个帧125微秒分32个时隙TS0用来做帧同步TS16专门留给随路信令其余30个时隙全部承载64kbps的话路。问题来了信令信息每个话路有abcd四个状态位30条话路就要120个比特一帧的TS16只有8个比特根本塞不下。解决方案就是把16个E1帧组成一个复帧周期2毫秒。复帧的第0帧TS16用于复帧定位和复帧失步告警第1帧到第15帧TS16分别承载两条话路的abcd信令15帧乘2正好是30条话路。这个设计精妙在哪它把TS16这个“窄通道”变成了一个慢速轮询总线每2毫秒把所有话路的信令状态完整轮一遍单路信令速率刚好是4比特除以2毫秒等于2kbps足够传拨号、挂机、占线这些传统电话信令。我在调试中最常遇到的问题就是复帧相位错位。帧同步已经正常话路也能通但信令就是乱的一查发现对端设备把TS16的“第0帧”定义成了第3帧整条信令的ABCD位置全错。这种问题靠抓单帧完全看不出来必须把16个帧摆在一起看才能发现“页码”从中间开始算了。记住一句话E1里语音是每帧都在传但信令是复帧周期里才完整一遍排查时必须切换到复帧视角。2.2 SDH里最常见的4帧循环VC-12通道开销SDH的帧结构比E1更复杂但超帧的思路一脉相承。STM-1帧是9行乘270列125微秒一帧净负荷区用来装各种虚容器。我们最常用的2M支路映射到VC-12而VC-12的开销字段有V5、J2、N2、K4四个字节分布在基本帧的不同位置如果只靠单帧不可能把这四个字节全部交代清楚。于是VC-12使用了一个4帧的复帧结构4个基本帧组成一个VC-12复帧周期V5字节主要承担BIP-2误码校验、远端误码指示、远端失效指示这些关键OAMJ2用于通道跟踪字节N2用于网络运维K4则承载高阶通道保护状态和复帧指示。因为复帧长度是4接收端需要用K4中的特定比特来确认当前处于4帧周期里的第几帧这与OTN中MFAS的角色非常相似。现场遇到“VC-12通道报LOMLoss of Multiframe”时说明设备已经能锁定帧边界但无法确定当前是四帧循环的哪一帧。这种故障通常不指向物理层而指向指针调整或复帧指示的异常。排查顺序应该是先确认AU-4指针没问题再确认TU-12指针没问题最后确认VC-12的复帧指示位是否连续。一旦跨过这一层后面看V5的误码统计才有意义。顺带说一句SDH里的同步状态字节S1在不少设备的实现中也不是只看单帧而是连续多个帧采样后按多数判决利用的正是“多帧打包”抵抗误码的思想。这也是超帧/复帧存在感的又一个体现。2.3 OTN超帧一个字节的MFAS撑起整本账OTN是目前超帧概念最标准、最值得学透的地方。OTUk帧有4行乘4080列第一行的前6个字节是帧定位信号FAS固定图案就是0xF6F6F6282828这一点在抓包和仪表分析时非常有用紧接着FAS后面的第7个字节就是MFAS。MFAS从0开始每收到一个OTU帧就加1加到255后再归零256个帧构成一个完整的超帧周期。设备靠MFAS知道当前帧在超帧里的位置也靠MFAS判断开销字段的含义。ODU层的TCM连接监控、保护倒换APS、通用通信通道GCC这些开销很多都依赖MFAS做“页码”复用。没有超帧这些OAM信息压根没有位置可放。这里必须强调一个关键点OTN的超帧周期是256帧而不是16或4。原因很简单因为MFAS本身就是一个字节计数器0到255刚好转一圈。这给我一个特别实用的启发看到MFAS循环范围先判断协议设计者把这个计数器做成了多宽。8比特计数器对应256帧周期4比特对应16帧周期。如果对端设备把一个8比特字段错误截断成4比特来计数你看到的MFAS序列就会在0到15之间循环两边对接时就会发生超帧不同步。跨厂商对接时超帧失步是重灾区。A设备开销终结模式的MFAS按0到255跑B设备却把MFAS当普通开销字段做了透传或者双方对“MFAS0作为超帧起点”的定义不一致都会导致两边看起来帧同步都正常但APS保护一直对不上、GCC通道报文解析乱码。这种故障的迷惑性极强不检查MFAS连续性根本定位不到。2.4 视频里的hyperframes跟通信是一回事吗顺手把另一个主流用法说清楚。在计算机视觉和视频编码里hyperframes一般指把时间轴上连续的若干图像帧组合成一个处理单元比如光流估计时一次输入连续5帧、视频预测时把过去多帧堆叠成多通道张量。这里的“帧”是图像帧跟通信的“帧”完全是两个世界的概念。但这两个世界有一个本质共通点都是在把时间上离散的单元聚合成一个更大结构并为其定义边界和顺序。通信里超帧的边界靠MFAS和复帧定位字标识视频里超帧的边界靠时间戳和帧索引标识通信里超帧搞错会导致开销解析错乱视频里超帧窗口没对齐会导致推理结果跳变。所以不管你在哪个领域遇到hyperframes都可以先问三个问题为什么要把帧组起来边界怎么找对齐机制是什么这三个问题想通了陌生协议也能很快上手。3. 亲测好用的超帧调测套路先对页码再看开销3.1 两个必看指标帧同步与超帧同步很多刚接触传输设备的同事都有一个共同的毛病仪表一报故障就冲到开销解析页面去看TCM、APS结果越看越乱。我的经验是必须先回答两个基础问题帧同步了吗超帧同步了吗这两个问题的答案直接决定了后面所有开销解读是否可信。第一步先锁FAS。用仪表的光通道分析功能或网管开销解析找到连续出现的0xF6F6F6282828图案这叫帧定位。FAS能稳定锁定说明物理层正常、接收端能准确找到每一帧的起点。第二步再盯MFAS序列。在帧定位的基础上把MFAS字段打出来正常情况下应当是0、1、2、3……一直到255然后归零重来。如果MFAS跳变不连续或者周期长度不符合规范比如只到15就归零说明超帧层没有对齐仪表上会报LOM。我印象最深的一次跨厂商故障就是这里。A端仪表一直报ODU2的LOMB端说自己设备没有任何告警两边FAS都能锁上。我们把两端的MFAS序列拉出来对比A端看到的是0到255完整循环B端却只有0到15。查到最后才发现B端某块老版本支路板把MFAS当成普通开销剥掉了下游重新生成MFAS时把周期写死成了16。换了固件、把超帧周期调回256帧之后业务立刻稳定。这个案例说明一个道理超帧层的问题必须从页码序列入手不能只看单帧开销。3.2 在FPGA里实现超帧同步状态机附代码如果你是做设备开发而不是运维那超帧同步大概率要落在FPGA逻辑里。我简单写一个OTN场景下的示意代码帮你把状态机的骨架搭起来。完整工程还需要位同步、FIFO缓存、帧起始指示这些前置模块这里只展示核心思想。先看数据通路假设已经有一个信号frm_start在每个新OTU帧起始时拉高一个周期fas_ok表示当前帧FAS校验通过mfas_inc_ok表示当前帧的MFAS等于上一帧MFAS加1。主状态机就是经典的“HUNT-PRESYNC-SYNC”三段式reg [1:0] state; localparam HUNT 2d0, PRESYNC 2d1, SYNC 2d2; reg [7:0] mfas_cnt 8h00; reg [2:0] ok_cnt, err_cnt; always (posedge clk or negedge rst_n) begin if (!rst_n) begin state HUNT; mfas_cnt 8h00; ok_cnt 3d0; err_cnt 3d0; end else case (state) HUNT: begin ok_cnt 3d0; err_cnt 3d0; if (frm_start fas_ok mfas_inc_ok) begin ok_cnt ok_cnt 1b1; if (ok_cnt 3d3) state PRESYNC; end end PRESYNC: begin if (frm_start fas_ok mfas_inc_ok) begin ok_cnt ok_cnt 1b1; if (ok_cnt 3d5) state SYNC; end else if (frm_start) begin ok_cnt 3d0; state HUNT; end end SYNC: begin if (frm_start) begin if (fas_ok mfas_inc_ok) begin err_cnt 3d0; end else begin err_cnt err_cnt 1b1; if (err_cnt 3d5) state HUNT; end mfas_cnt mfas_cnt 1b1; end end endcase end这段代码的思路是先在HUNT态连续3个帧确认FAS和MFAS都正确进入PRESYNC再连续5个帧保持正确才算真正同步避免误码带来的假同步进入SYNC后一旦连续5个帧发现异常立即回到HUNT重新搜索。三个数字N3、M5是常见起步参数实际设备会结合误码率、同步时间指标调整。比如抗误码要求高的链路会用N5、M32代价是失步后恢复时间变长。这个权衡没有绝对最优必须看设备规范。代码里mfas_cnt在同步后每帧加1这就是超帧计数器的硬件实现。一个8比特计数器天然就能跑出0到255的周期不需要额外判断回卷逻辑。看到这里你应该能更直观理解为什么OTN选256帧做超帧周期——因为硬件上就是一个字节的事。3.3 E1复帧失步现场排查三步走E1的复帧排查比OTN更偏向现场操作。我之前在DDF机架上处理过不少信令故障总结成三步。第一步用PCM信令分析仪接在E1的RX口先看物理层和帧同步状态LOS、LFA必须全部消失。第二步把仪表切到信令时隙解析页面确认复帧同步指示灯是否点亮也就是能否稳定识别复帧定位。第三步把TS16的16个子信道打出来逐个核对第0帧的复帧定位和对告位再核对第1到15帧的信令abcd是否与交换机侧配置的话路对应。这套流程里最容易出问题的是第三步。很多工程师看到TS16有数据就认为信令正常忽略了“复帧相位”这件事。相位不对时原本分配给1号话路的abcd会被错装到16号话路头上轻则单通重则全乱。语音信道因为是纯透明传输往往一点毛病看不出来这恰恰是复帧故障最阴险的地方。所以我的习惯是凡是涉及随路信令的故障先把“话路正常”这个信息从脑子里暂时删掉默认问题就在复帧层。4. 常见超帧故障与排查实录4.1 超帧故障现象速查表这些年攒下来的超帧相关故障大多能归到下面这几种。我整理成速查表现场排查时可以直接对着查。故障现象可能原因首要排查动作OTN业务频繁中断仪表报LOMMFAS连续性校验失败超帧对齐异常抓OTU开销打印MFAS 0到255序列E1话路正常但信令全乱复帧相位错位TS16未从帧0起算用信令分析仪查看复帧同步状态与TS16子信道顺序VC-12通道误码网管报LOMVC-12四帧复帧错位或K4指示异常检查TU-12指针与K4字节的复帧指示位跨厂商对接APS保护不联动双方MFAS周期或超帧起点定义不一致对比两端MFAS序列与开销终结模式视频超帧推理结果跳变多帧输入窗口未对齐或时间戳断帧检查帧索引连续性、时间戳与光流状态前四条都是通信里的经典故障最后一条是我给视频方向朋友留的对号入座。本质上都是同一件事超帧边界没有对齐。4.2 我踩过的三个坑第一个坑是把复帧和超帧混为一谈。有次在会议桌上讨论E1信令故障我说“复帧失步”同事坚持说“超帧没问题”双方说的其实是一个东西但因为这个用词差异来回拉扯了半小时。现在我在团队里强制约定说话时必须带层次词帧级、复帧级、超帧级分开说避免歧义。第二个坑是拿单帧内容解释跨帧开销。OTN里有些开销字段只在特定MFAS值下有效如果设备的日志打印没有把MFAS带出来直接看开销字节很容易误判。我自己就犯过这个错看到TCM状态字节异常排查半天才发现是因为当前帧号不对那个字节在别的帧号下根本不该被解析。从那以后我在脚本和日志里一律要求把MFAS和开销字节同时打印。第三个坑是只查对端不查本端。跨厂商对接时A端报LOMB端说没告警双方僵持住。常规思路是怀疑A端接收有问题但实际故障往往出在本端设备的开销终结模式上——如果本端把MFAS透传或者错误终结了对端解析当然会失败。遇到超帧失步先确认自己这边是不是把页码这个字段正确处理了再去找别人这个顺序能省下半天的扯皮时间。4.3 调试工具与一个小脚本仪表方面EXFO、Viavi这类光通信分析仪自带OTN开销解析直接能看到MFAS序列。现场没有仪表时也可以靠网管日志或者自己抓码流分析。我自己写过一个小工具思路很简单从原始二进制码流中按固定帧长滑窗搜索FAS图案0xF6F6F6282828命中后读取FAS后面的MFAS字节再统计其连续性。FAS b\xf6\xf6\xf6\x28\x28\x28 FRAME_LEN 16320 # OTU1: 4行 x 4080列 def find_mfas(data): pos data.find(FAS) if pos -1: return None return data[pos 6] # MFAS位于FAS之后第7字节 def check_mfas_seq(data, max_frames300): seq [] pos data.find(FAS) for _ in range(max_frames): if data[pos:pos 6] ! FAS: break seq.append(data[pos 6]) pos FRAME_LEN return seq raw open(otu_stream.bin, rb).read() seq check_mfas_seq(raw) print(前20个MFAS值:, seq[:20])这个脚本只适合从收到的原始码流文件里做离线分析实际设备里还要考虑FAS在净荷中偶尔出现的伪匹配风险所以完整逻辑会增加“连续多帧确认”的校验。但拿来快速定位MFAS周期异常已经足够。重点是理解思路先找页眉再翻页码然后判断这本书的装订是否正常。4.4 一张分层检查单治好了我的跨层焦虑最后分享一个我用了很久的现场检查单。排查超帧相关故障时我从底层往上逐层核对每一层没有确认通过之前绝不跳到下一层去猜。物理层查LOS、LSS、RF确保信号连续且无强干扰。帧定位层查FAS、LOF确认接收端能找到每一帧的起点。超帧/复帧层查MFAS、复帧定位、LOM确认页码连续且周期正确。开销/通道层查TCM、APS、GCC、V5等按页码正确解析开销含义。业务层查误码、时延、丢包验证业务质量是否恢复。这个检查单看起来极其朴素但能把排查过程从“玄学”变成“流水线”。我见过太多疑难杂症最后都落在第二层或第三层——不是业务坏了而是上层逻辑拿着错误的页码在拼图。你把这个习惯带到任何涉及“帧组”的领域都会觉得世界一下子清晰了。说到最后还是那句老话遇到任何叫hyperframes的陌生协议先问三个问题——为什么要把帧组起来边界在哪怎么对齐把这三个问题答明白这个技术你就已经吃透了一大半。剩下的事无非是到现场踩几个坑再把这些坑写出来告诉后来人罢了。
返回列表