ARTICLE DETAIL

资讯详情

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

HyperFrame是什么?一文读懂FlexE超帧结构与时隙分配

HyperFrame是什么?一文读懂FlexE超帧结构与时隙分配 HyperFrames 这个词最早我是从 FlexE 1.0 规范里看到的。那时候团队刚接一个 5G 承载的前传项目客户要求在一对 100GE 物理链路上跑 120G 的流量传统以太网怎么都凑不齐最后只能上 FlexE。翻 OIF 文档时HyperFrame 这节把我卡了好几天——100 微秒、8 个子日历、20 个时隙、5Gbps 粒度这些数字绕来绕去单独看每个都懂合在一起就晕。后来拿着仪表一组一组地抓开销、核对 Slot 表才算把这层纸捅破。如果你也在查 HyperFrames大概率是和 FlexE、确定性网络、DCI 互联这些词一起出现的。它不是一个开源项目也不是某种视频编码概念而是 FlexE灵活以太网里用来做时分复用调度的“时间骨架”。这篇我把它的来龙去脉、结构拆解、带宽计算、设备配置和排障经验一次讲完适合刚接触 FlexE 的承载网工程师或者正在做数据中心互联方案的朋友。1. HyperFrames 到底是什么脱去外衣看 FlexE 超帧1.1 传统以太网被“端口速率”绑住了要理解 HyperFrame得先明白它要解决什么问题。传统以太网有个很尴尬的特性端口速率是固定的。100GE 端口就是 100Gbps40GE 就是 40Gbps中间没有平滑过渡的档位。业务需求不会总落在这些整数上比如你需要给 A 客户 35G给 B 客户 45G给 C 客户 75G。如果直接给三个客户各绑一个 100GE 端口物理端口倒是够用但带宽浪费得吓人354575155G却占用 300G 的物理资源。有人会说用链路聚合LAG不就行了。LAG 的确是按流哈希做负载分担的但它的粒度是“一条流”不是“一个带宽单位”。一条大流量如果哈希到某个成员端口就会把那个端口打满其他端口还闲着两条小流量如果哈希到同一个端口又可能互相挤兑。LAG 无法做到像 TDM 那样按 5Gbps 小颗粒精确切分更没法保证排队时延的确定性。所以 FlexE 的出现本质上是把“MAC 速率”和“PHY 速率”解耦客户侧的逻辑带宽不必等于物理端口带宽而是可以自由组合。比如用 3 个 100GE PHY 绑成一个 FlexE Group然后从里面切出若干个任意速率的 FlexE Client每个 Client 可以按 5Gbps 的整数倍来分配带宽。1.2 HyperFrame 就是 FlexE 的“日历”FlexE 用时分复用TDM的方式来分配带宽而 HyperFrame 就是这个时分系统的时间基准。可以把它理解成一张循环运行的日历每 100 微秒翻一页每页上划分出若干行若干列每个小格子代表一路 5Gbps 的调度通道。不同 FlexE Client 的数据就被均匀地填入这些格子里在接收端再按相同的时间规则取出来。之所以叫“超帧”是因为它不是一帧以太网数据而是由很多个连续的时间片段构成的一个大的复用周期。以太网帧还有长短之分HyperFrame 的长度却是严格的时间驱动——100μs哪怕你没有数据可发这个日历也照常滚动。它负责的是一种“空分复用”之外的“时分复用”同一个物理端口上不同客户的数据通过不同的时隙错开互不干扰。1.3 名词辨析HyperFrame、Calendar、Slot 别搞混刚接触 FlexE 的人特别容易把 HyperFrame、Calendar、Slot 这三个词混在一起。我建议用家里装修来类比PHY 是房子比如 100GE PHY 是 100 平米的户型。FlexE Group 是一栋楼可以有几套房子最多 8 套。Calendar 是每套房子里划分出的房间每个 100GE PHY 的日历上固定有 20 个房间。Slot 是房间里的床每个 Slot 占 5Gbps 带宽。HyperFrame 是整个小区的一周期管理表一个 HyperFrame 包含 8 个子日历每个子日历又包含 20 个 Slot总共 160 个 Slot。也就是说HyperFrame 不是挂在某个 PHY 上的独立帧而是横跨整个 FlexE Group 所有物理链路的时间复用总结构。你抓包的时候能在每个 PHY 上看到同样的 HyperFrame 计数这说明当前链路已经完成了对齐。2. 从 1 个超帧到 160 个时隙核心结构拆解2.1 一个 HyperFrame 等于 8 个子日历FlexE 官方标准里一个 FlexE Group 最多可以绑定 8 条 PHY。为了方便统一调度每个 PHY 对应一个“子日历Sub-Calendar”而一个 HyperFrame 恰好装下 8 个子日历。你可以想象成 8 个并行的传输带每个传输带承载一个 100GE 物理链路的时隙序列它们同步滚动接收端按同样的序号对齐。每个子日历固定包含 20 个 Slot。为什么是 20因为 100GE PHY 的总带宽是 100Gbps按每 Slot 5Gbps 划分正好是 20 个。这 20 个 Slot 并不要求在物理线路上连续传输而是分布在 100μs 周期内。调度器每隔一段时间切换一个 Slot把不同客户的数据插入对应的位置。于是整个 HyperFrame 的容量就是 20 Slot × 8 子日历 160 个 Slot总调度带宽 160 × 5Gbps 800Gbps。如果一个 FlexE Group 里只绑了 4 条 PHY那么只有 4 个子日历被激活剩下 4 个子日历空着容量就是 400Gbps。这个设计最大的好处是物理链路从 1 条扩到 8 条的过程中客户带宽不需要中断只需重新下发 Slot Map。2.2 开销信息塞在哪里HyperFrame 不只是承载用户数据的容器它还承担一个关键任务传递 FlexE 开销Overhead。FlexE 的开销包括管理消息、时隙分配表、同步状态、客户标识等。为了避免占用额外带宽这些开销被嵌入到子日历的前两个 Slot 里具体是每个子日历的第 1 和第 2 个 Slot。正常情况下这两个 Slot 不被用来传业务数据而是固定传 FlexE 开销块。开销块的结构类似一个 8 字节的 header里面有同步字段、日历配置版本、客户映射表等信息。两个物理链路要组成 FlexE 连接两边的 HyperFrame 必须对齐并且开销块读到对方的日历配置完全一致才能把时隙对应上。很多现场故障其实就是支付宝了两端 PHY 都亮着但 Slot Map 对不上最终表现为时报不通或者大量丢包。2.3 为什么时隙粒度要定为 5Gbps5Gbps 这个数字看起来有点奇怪但它有一个工程上的合理性IEEE 802.3 里 100G 以太网的 PCS物理编码子层通道数是 20每通道速率正好 5Gbps。FlexE 做 Slot 划分时直接借用 PCS 通道的边界可以最大程度减少额外缓冲和校准逻辑。换句话说时隙边界天然与物理层通道对齐调度器只需要按照定长的“通道窗口”往各个 Slot 里塞数据而不需要再做一次复帧重组。这个粒度对大部分业务是友好的10G、20G、40G、50G、100G、150G 这些常见带宽都是 5Gbps 的整数倍。但如果你的业务粒度是 1Gbps 或者 2.5Gbps比如一堆 10GE 子接口聚合过来的小颗粒流量5Gbps 的 Slot 就会造成明显浪费。FlexE 标准里不提供更小粒度的子时隙所以这种情况只能考虑尽量把多个小客户拼到一个 Slot 里或者改用其他承载方案。HyperFrame 参数数值说明HyperFrame 周期100μs整个超帧循环一次的时间子日历数量8对应最多 8 条物理 PHY每子日历 Slot 数20对应 100GE PHY 的 20 个 PCS 通道总 Slot 数20 × 8 160一个完整 HyperFrame 的可调度单元每 Slot 带宽5Gbps最小分配粒度总调度容量800Gbps理论最大 FlexE Group 容量开销位置每子日历前 2 个 Slot用于同步、Slot Map、管理信息3. 时隙分配怎么算手把手做一张 Slot Map3.1 从客户带宽换算成 Slot 数量假设你有一条 30Gbps 的客户业务要放到 FlexE Group 里。每个 Slot 5Gbps所以 30Gbps 需要占用 30 ÷ 5 6 个 Slot。这 6 个 Slot 不能随意摆必须通过 Slot Map 明确指定落在哪个子日历的哪个位置。再看一个混合场景两个客户A 客户 10GbpsB 客户 25Gbps。A 需要 2 个 SlotB 需要 5 个 Slot总共 7 个 Slot。如果这个 Group 是 2×100GE 组成的 200Gbps 管道那么总可用 Slot 数是 2 个子日历 × 20 40 个。分配完还剩 33 个 Slot足以继续接纳新业务。需要注意的是Slot 分配必须保证每个客户在其所属的 Slot 集合内是“等间隔”调度的不能说把 A 的 2 个 Slot 挤在相邻位置连续突传。FlexE 调度器会把每个客户占用的多个 Slot 尽可能均匀地散布在子日历里以平滑突发、控制时延抖动。这也是为什么在手工配置时你看到的 Slot Map 通常长得像跳跳棋客户 A 可能分到 Slot 1、5、9客户 B 分到 Slot 2、3、7 等。3.2 写个小工具自动生成 Slot Map我在测试环境里经常要核对不同带宽组合的分配方案手工填表格不现实。这里分享一个 Python 小脚本可以模拟 FlexE Group 的 Slot 分配逻辑把客户带宽转成具体的时隙位置。它不是厂商设备里的真实算法但用来理解映射关系和验证容量结果足够了。SLOT_BW_GBPS 5 SUBCALENDAR_COUNT 8 # 最多 8 个 PHY也就是 8 个子日历 SLOTS_PER_SUBCALENDAR 20 # 每个 100GE PHY 有 20 个时隙 # 用到的客户需求: [(名称, 带宽Gbps), ...] demands [ (Cust-A, 10), (Cust-B, 25), (Cust-C, 40), ] def build_slot_map(demands): total_slots SUBCALENDAR_COUNT * SLOTS_PER_SUBCALENDAR slot_owner [None] * total_slots slot_index 0 for name, bw_gbps in demands: need bw_gbps // SLOT_BW_GBPS if bw_gbps % SLOT_BW_GBPS ! 0: print(f[!] {name} 带宽 {bw_gbps}G 不是 5G 的整数倍无法完整分配) continue if slot_index need total_slots: print(f[!] {name} 需要 {need} 个 Slot但剩余 Slot 不足) break # 按顺序分配并把每个 Slot 标记为所属的 PHY子日历和槽位编号 for _ in range(need): slot_owner[slot_index] name slot_index 1 # 输出每个 PHY子日历的时隙占用情况 print( Slot Map ) for cal in range(SUBCALENDAR_COUNT): row [] for slot_pos in range(SLOTS_PER_SUBCALENDAR): idx cal * SLOTS_PER_SUBCALENDAR slot_pos owner slot_owner[idx] row.append(owner if owner is not None else -) print(fSubCal{cal1:02d}: .join(f{x:7s} for x in row)) total_allocated_bw 0 used_slots 0 for name, bw_gbps in demands: used bw_gbps // SLOT_BW_GBPS total_allocated_bw used * SLOT_BW_GBPS used_slots used print(f{name}: {used} 个 Slot带宽 {total_allocated_bw} Gbps) print(f总占用 {used_slots} Slot剩余 {total_slots - used_slots} Slot) if __name__ __main__: build_slot_map(demands)这段脚本输出的 Slot Map 是一个二维矩阵行是子日历列是 Slot 位置。运行之后你能直观看到Cust-A 占了 2 个 SlotCust-B 占 5 个Cust-C 占 8 个总共 15 个 Slot剩余 145 个。虽然这里用的是最朴素的顺序填充方式真实设备会做均匀交织但容量数学是完全一致的。3.3 边界情况不是所有带宽都能完美映射上面脚本里输出了一个警告如果客户带宽不是 5Gbps 的整数倍就没法用整数个 Slot 完整映射。比如客户需要 7Gbps按最小粒度必须给它 2 个 Slot10Gbps 容量白白浪费 3Gbps。更难受的是那些小于 5Gbps 的客户哪怕只需要 100Mbps也要占 1 个 Slot。这正是 FlexE 面向“大管道粗粒度”场景的设计取向不适合拿来承载大量小颗粒业务。另一个边界情况是超大型客户。一个客户想占满整个 8×100GE Group带宽是 800Gbps那么它需要全部 160 个 Slot。这种情况下该客户成为 Group 内唯一业务物理上等价于把 8 条 100GE 捆绑成一个逻辑 800GE 管道。配置时虽然不复杂但要注意客户侧 MAC 也必须能支持 800Gbps 的速率不能出现客户口速率小于分配带宽的情况否则数据会在入口丢包。4. 实操手记路由器上配置 FlexE Group 的完整过程4.1 先分清哪一层做 FlexE很多同学一开始容易蒙圈FlexE 是在接口下配还是在控制器下配以常见厂商的风格为例一般分三层第一层是创建 FlexE Group把物理 PHY 加进来。第二层是创建 FlexE Client给 Client 指定带宽。第三层是把 Client 映射进 Group并在 Client 口上跑普通的路由或交换业务。物理 PHY 本身仍然是一个 100GE 端口但一旦被 FlexE Group 占用它就不能再当作普通物理口使用。配置顺序如果反了先给物理口配了 IP再要加进 Group设备通常会直接报错需要先删掉物理口的业务配置。我踩过这个坑第一次在现网设备上操作时被一串“interface is in use”的报错拦了半天。4.2 常见风格配置示例以某厂商 NCS 系列为例下面这段配置是基于常见设备风格的伪配置用于展示配置逻辑。不同厂商、不同版本的命令字差异很大但思路是一样的大家看的时候重点关注层次关系而不是背命令# 1. 创建 FlexE Group controller FlexE-Group 1 phy 0/0/0/0 phy 0/0/0/1 # 2. 创建 FlexE Client并把带宽设为 150Gbps controller FlexE-Client 150 speed 150 flexe-group 1 # 3. 给 Client 口配置业务 interface GigabitEthernet0/0/0/0 ipv4 address 10.0.0.1 255.255.255.0这里的关键是把两个 100GE PHY 绑进一个 Group总容量 200Gbps然后给其中一条客户业务分配 150Gbps剩下 50Gbps 还可以分配给其他 Client。如果客户带宽是 120Gbps就需要 24 个 Slot同样可以分配到两个 PHY 上比如在 PHY 0 的子日历里分 14 个 Slot在 PHY 1 的子日历里分 10 个 Slot。这种跨 PHY 分配能力是 FlexE 相对传统 LAG 最大的优势——LAG 做不到按带宽精确切分FlexE 可以。4.3 配置完成后必须检查三个状态第一检查 HyperFrame 是否对齐。设备上通常有类似show controller flexe group 1的命令输出里会有 HyperFrame Offset、Calendar Alignment 之类的状态正常应该是 Locked 或 Aligned。如果显示失锁说明两端 PHY 的时隙基准不对齐第一时间检查光模块、物理链路和时钟源。第二检查 Slot Map 是否生效。配置下发后Slot Map 要经过开销信道同步到对端设备。你可以用show flexe calendar之类的命令查看本端和下发的远端 Slot Map确保两端一致。最常见的不一致原因是两端客户带宽配速不匹配比如本端这个 Client 配了 100G对端对应 Client 配成了 150G。第三检查时延和丢包计数。FlexE Client 口上做show interface时可以看到常规的错包计数。如果是 FlexE 层的问题通常物理口是 Up 的Client 口却是 Down 的或者物理口有少量 CRC。遇到这种情况不要先在业务层排障赶紧回到 FlexE Group 的统计里去查 Slot 级别的计数器。4.4 时钟同步不是可选项FlexE 的时分复用要求所有 PHY 的时钟频率一致。如果两个 PHY 的时钟漂移HyperFrame 周期会逐渐错位轻则偶尔丢包重则整条链路报错。因此实际部署中必须给 FlexE Group 开启同步以太网SyncE或频率同步源确保所有 PHY 使用同一个参考时钟。我在实验室里曾偷懒只配了端口速率没配时钟结果测试仪看到明显的周期性丢包。后来给所有 PHY 都指了同一台 BITS 时钟源丢包立刻消失。所以时钟同步不是网管层面锦上添花的东西而是 HyperFrame 机制正常工作的前提。5. 超帧落地时一定会遇到的 5 个问题5.1 时隙碎片化大客户分配失败和设备磁盘一样Slot 分配也会碎片化。比如你先分配了很多 10G 小客户把每个子日历的时隙都零散占用了后面突然来一条 300G 的大客户理论上 Group 总剩余容量足够但由于它要求连续且等间隔的 Slot 集合分散的碎片拼不出完整的映射。解决思路有两个一是提前做好带宽规划把大客户放在最前面分配二是使用支持自动平铺算法的设备让它重新排序 Slot Map但这通常需要短暂中断业务。5.2 两端开销版本不一致FlexE 标准在演进不同版本对开销字段和时隙定义略有调整。如果一端跑的是 OIF FlexE 2.0另一端跑的是 1.0双方对开销字段解析不一致轻则告警重则业务不通。上线前最好用仪表抓一下开销块确认版本字段和日历配置一致。很多跨厂商互通测试最容易挂在版本兼容性上。5.3 5Gbps 粒度导致小颗粒业务浪费严重前面已经算过一个小于 5Gbps 的客户也要占用完整 Slot。如果你需要在 FlexE 上同时跑大量 1Gbps 的小客户比如接入层某些专线业务会非常不划算。我的建议是让这些小客户先在汇聚设备上聚合成大管道再进入 FlexE。比如 5 个 1G 的客户流量合到一个 5G 的 FlexE Client 里这样 Slot 占用不变利用率从 20% 提升到 100%。5.4 跨子日历带来的时延抖动一个客户的数据如果同时分布在多个 PHY 的子日历里它天然会引入额外的时延抖动PHY 1 的 Slot 和 PHY 2 的 Slot 之间数据要经历跨 PHY 的重排缓存。这个问题在 HyperFrame 设计中无法完全消除。实际测试时我们测过 4×100GE 绑定的 Group在满负载下客户口时延抖动大约在几十微秒量级对普通数据业务无感但对需要稳定时延的金融专线或 5G 前传业务就要评估缓存深度和组网距离。问题现象建议时隙碎片化大客户分配失败大客户优先分配或启用自动平铺版本不一致开销解析告警设备互通前抓开销核对版本小颗粒浪费带宽利用率低小客户先聚合再进 FlexE跨 PHY 抖动时延测试毛刺大评估缓存深度和调度策略时钟失锁周期性丢包开启 SyncE统一参考时钟5.5 排障时最常见的误区去查业务层 MAC 地址你可能觉得链路不通肯定是路由或 MAC 问题但 FlexE 环境的特例是只要 Slot Map 没对齐业务层就永远学不到 MAC。我曾经在一台接入设备上抓了半小时 VPLS 报文后来发现是 FlexE Group 里有一个 PHY 的光模块被插到了另一个端口槽位导致 Slot Map 错位。这个教训反复出现遇到 FlexE 场景的异常第一件事永远是看 HyperFrame 状态和 Slot Map而不是查路由表和 MAC 表。6. 关于 HyperFrames我最后想说的几句话我在实际调试里最大的感受是HyperFrames 并不是一个可以直接“看到”的报文结构它是整个 FlexE 调度体系背后那台看不见的钟表。很多工程师习惯用抓包工具分析以太网帧但在 FlexE 环境中真正要盯的是开销块里的 Calendar 配置和时隙同步状态。理解了 HyperFrame 这个时间骨架以后Slot Map 从一串没意义的数字变成了一张活地图哪个客户占哪几个格子、跨了几条 PHY、还剩多少容量一目了然。如果你正准备上 FlexE 项目建议先在实验室里把 8 子日历、160 时隙的模型跑熟再用手头的设备做一两次 Group 扩容和 Slot 重新分配。这个过程能帮你把概念真正内化也能提前暴露不少厂商实现上的细节差异。最后再分享一个小技巧当测试仪表显示链路有误码但又找不到原因时把 FlexE Group 里所有 PHY 的 HyperFrame 计数清零再打一轮压力流量对比各 PHY 的失锁计数器。哪个 PHY 计数涨得快问题基本就在哪条物理链路上。
返回列表