
【网络】前向纠错FEC技术

💡简介
前向纠错(Forward Error Correction, FEC)是一种通过在数据中增加冗余信息来提升通信可靠性的技术。本文将介绍FEC的基本原理、常见类型(D-FEC与A-FEC)、典型应用场景,并结合实际网络环境分析其优势与局限性,帮助读者全面理解FEC在现代网络中的作用。
🖼️背景
在调研RoCE(RDMA over Converged Ethernet)环境下的丢包恢复机制时,发现传统网络领域已经广泛应用前向纠错(FEC)技术来提升数据传输的可靠性。为此,本文对FEC相关技术进行了系统梳理和总结,旨在为高可靠性网络设计提供参考。
🧠整理
FEC 前向纠错[1]
简介:
- 前向纠错(Forward Error Correction,简称FEC)是一种增加数据通讯可信度的数据编码技术,通过流分类识别指定数据流,为其增加携带校验信息的冗余包,如果网络中出现了报文丢失或者报文损伤,则通过冗余包还原报文。
简单地说,FEC通过传输冗余包,包损坏丢失时支持直接恢复,避免重传 - 适合带宽高、重传代价高场景,如实时通讯和高误码率的通讯环境。
实现:
如下图所示,FEC优化技术按照以下流程:
- 发起端接收流量报文,识别出需要进行抗丢包优化的指定数据流;
- 发起端基于数据流的原始包,按照算法编码(如XOR编码、RS编码)生成冗余包;
- 发起端的CPE(Customer Premise Equipment,指移动信号接入设备)对原始包封装FEC私有头。
- 发起端的CPE对一批原始包进行FEC编码,生成FEC冗余包。
- 发起端可以根据编码矩阵(即生成矩阵)算法对多个原始包生成多个冗余包。
- 将原始包与冗余包一起发出。网络情况较差时,报文和冗余包都可能出现丢失。
- 接收端的CPE对接收到的原始包和冗余包进行FEC解码。
- 接收端CPE从网络收包,检测丢包信息,进行FEC解码。
- 根据编码矩阵和实际收到的包计算出解码矩阵(即还原矩阵),根据解码矩阵和收到的包解码出丢失的原包。
- 只要一个编码块中的丢包数不超过冗余包数量,就可以恢复该编码块中的丢包。
- 接收端CPE解码完成后,恢复丢包,剥掉私有头。
- 接收端的CPE把恢复后的包按顺序发给接收端的其他设备。
对于每次编解码,会以包为单位进行丢包检测与恢复。
分类:
FEC有两种,分别为Determined FEC(D-FEC)和Adaptive FEC(A-FEC)
- D-FEC(Determined FEC,固定冗余率 FEC):按固定的丢包率生成冗余报文。
- A-FEC(Adaptive FEC,自适应 FEC):根据解码侧返回的丢包信息动态生成冗余报文。
D-FEC 固定/静态 前向纠错[1]
简介:
- 在FEC技术的基础上,D-FEC按固定的丢包率生成冗余报文,冗余包数量不变。
分析:
- 优点:机制简明,实现简单
- 缺点:
- 浪费带宽
- 固定的丢包率无法动态调整,在实际网络丢包率低的时候,冗余校验包往往造成带宽的浪费。尤其在网络出现拥塞的时候,增加过多的冗余校验包会进一步加剧网络负担,对其他业务带来影响。
- 不足以恢复丢包
- 当实际网络丢包率异常增高,并大于手动配置的固定丢包率,会使得短时间内产生的FEC冗余校验包数量不足,无法恢复丢包。
应用场景:
- 当网络带宽充足、不怕浪费,但是网络质量差、丢包率变化波动大时,优先选择D-FEC。
A-FEC 自适应/动态 前向纠错[1,5]
简介:
- A-FEC是对D-FEC的改进,改进了D-FEC浪费带宽和实际网络丢包率过高时不能恢复丢包的问题。
- 如下图,A-FEC可以检测网络中的报文丢失情况,自动调整FEC冗余率,从而实现:
- 在丢包率低的时候节约带宽。
- 在丢包率高的时候保证恢复能力。通过适应性地提高冗余率,以抵消网络报文丢失造成的影响。
实现:
如下图所示,A-FEC优化技术按照以下流程,在简单FEC的基础上额外增加第6、7步骤以自适应动态调整冗余率:
- 发起端接收流量报文,识别出需要进行抗丢包优化的指定数据流;
- 发起端基于数据流的原始包,按照算法编码(如XOR编码、RS编码)生成冗余包;
- 发起端的CPE(Customer Premise Equipment,指移动信号接入设备)对原始包封装FEC私有头。
- 发起端的CPE对一批原始包进行FEC编码,生成FEC冗余包。
- 发起端可以根据编码矩阵(即生成矩阵)算法对多个原始包生成多个冗余包。
- 将原始包与冗余包一起发出。网络情况较差时,报文和冗余包都可能出现丢失。
- 接收端的CPE对接收到的原始包和冗余包进行FEC解码。
- 接收端CPE从网络收包,检测丢包信息,进行FEC解码。
- 根据编码矩阵和实际收到的包计算出解码矩阵(即还原矩阵),根据解码矩阵和收到的包解码出丢失的原包。
- 只要一个编码块中的丢包数不超过冗余包数量,就可以恢复该编码块中的丢包。
- 接收端CPE解码完成后,恢复丢包,剥掉私有头。
- 接收端的CPE把恢复后的包按顺序发给接收端的其他设备。
- 接收端的CPE实时统计丢包信息反馈给发起端的CPE。
- 发起端的CPE对接收的丢包信息进行处理。
- 根据丢包信息计算出所需冗余率。
- 计算冗余率时,可采用三种方式:(参考开源工具WebRTC (Web Real-Time Communications)[6])
- a.使用当前丢包率。
- b.使用一阶指数平滑算法,拟合一阶线性函数,预测丢包率。
- c.使用一段窗口期内的最大丢包率。
- 计算冗余率时,可采用三种方式:(参考开源工具WebRTC (Web Real-Time Communications)[6])
- 根据所需冗余率,计算出下次数据传输所需冗余包数量。
分析:
- 优点:自适应调控,节约带宽的同时保障恢复能力。
- 缺点:实现复杂,响应偏慢。
应用场景:
- 当网络带宽不足,网络质量差,但是丢包率不剧烈波动的网络,优先选择A-FEC。
🏥反思
RoCE通常在DC内使用,当扩展到DC间或其它不稳定网络(例如无线网络)时,传统重传方案可能不太适用(每次重传都要付出巨大代价),此时使用修复/恢复技术会是一个好的选择(已有论文考虑相关内容[12])。当然,暂时还没看到业界到底如何实践,也不确定应用于真实场景是否会出现额外问题。
对于FEC的具体分类,D-FEC和A-FEC各有优劣,实际应用中需结合网络带宽、丢包率波动等因素灵活选用。
此外,FEC的引入虽然提升了可靠性,但也带来了实现复杂度和带宽开销的权衡,后续可进一步关注其在新型网络架构中的优化与演进。
此外,华为的文档总结得非常清晰,感恩!
- 希望这篇博客对你有帮助!如果你有任何问题或需要进一步的帮助,请随时提问。
- 如果你喜欢这篇文章,欢迎动动小手给我一个follow或star。
🗺参考文献
【FEC基础介绍】
[1] 华为,《FEC技术》,https://info.support.huawei.com/hedex/api/pages/EDOC1100413637/FZN1022J/01/resources/zh-cn_topic_0000001441471753.html
[2] 深圳领存技术有限公司,《什么是向前纠错码(FEC)》,https://zhuanlan.zhihu.com/p/695187928
[3] 维基百科,《前向纠错》,https://zh.wikipedia.org/zh-hans/前向錯誤更正
【FEC数学分析】
[4] CSDN,《FEC算法数学推导》,https://blog.csdn.net/u010178611/article/details/82656838
【动态FEC介绍】
[5] 华为,《什么是A-FEC?》,https://info.support.huawei.com/info-finder/encyclopedia/zh/自适应前向纠错.html
[6] CSDN,《webrtc QOS方法二.3(FEC冗余度配置)》,https://blog.csdn.net/CrystalShaw/article/details/103183607
【FEC实现】
[6] CSDN,《webrtc QOS方法二.3(FEC冗余度配置)》,https://blog.csdn.net/CrystalShaw/article/details/103183607
[7] Github-kcptun,《动态fec 支持》,https://github.com/xtaci/kcptun/issues/376
[8] 知乎,《前向纠错技术(FEC)的测试和验证》,https://zhuanlan.zhihu.com/p/445235472
[9] CSDN,《流媒体弱网优化之路(FEC)——FEC的应用奥秘(附demo)》,https://blog.csdn.net/qw225967/article/details/123405797
[10] CSDN,《FEC(forward error correction) 前向纠错算法库函数解析》,https://blog.csdn.net/m0_46213128/article/details/133885883
[11] 专利CN106656422A,《一种动态调整fec冗余度的流媒体传输方法》,https://patents.google.com/patent/CN106656422A/zh
【其它】
- 标题: 【网络】前向纠错FEC技术
- 作者: Fre5h1nd
- 创建于 : 2025-05-15 09:22:07
- 更新于 : 2025-05-15 13:57:16
- 链接: https://freshwlnd.github.io/2025/05/15/Forward-Error-Correction/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。