FEC、CRC和失真修复的区别?
引言—IB交换机的疑惑
最近在接触IB的交换机,其中的一些接口信息引起了小编的疑惑,由于这些信息涉及到了FEC和CRC,而在校期间一直以为这两货是一个东西,现在发现根本不是一回事,所以特此来梳理一下两者的区别;
引起疑惑的信息
首先,说明一下上图为IB交换机的一个接口的信息,重点关注图中的三个信息:
-
raw effective errors
接口接收到的原始报文后经过
CRC
校验确定的错包数量; -
effective physical errors
光模块使用
DSP
芯片对数模转换后失真的数字信号进行修复之后仍CRC错误的数量;这里的错误数量越多,说明模块的DSP芯片越垃圾;在发送端,信号经过数模转换(DAC),从数字信号变成模拟信号。在接收端,模拟信号经过模数转换(ADC),又变成数字信号。
一顿操作下来,得到的数字信号就有点乱,有点失真。这时候,需要DSP,对数字信号进行“修复”。
DSP就是一个跑算法的芯片。它拥有数字时钟恢复功能、色散补偿功能(去除噪声、非线性干扰等因素影响),可以对抗和补偿失真,降低失真对系统误码率的影响。
-
symbol errors
交换机接口使用
FEC
技术对报文中的数据进行纠错后,仍然CRC
错误的数量;所以在IB交换机接口侧,最主要查看的就是symbol errors,只要其为0,正常情况就不影响业务使用。
上面流程为:
CRC检测不通过—>raw effective errors—>失真修复+CRC检测不通过—>effective physical errors—>FEC+CRC检测不通过—>symbol errors
上面就涉及到四个主要概念:
CRC、FRC、DSP、失真修复
我们将一一解释各个概念和其发挥的作用;
失真修复
什么是失真?
指信号在传输或处理过程中,其原本的特性(如幅度、频率、相位、波形等)发生了改变,导致信号偏离原始状态,但不一定意味着数据内容的错误。例如,模拟音频信号在经过放大器时,由于放大器的非线性特性,输出的声音信号可能会出现谐波失真,听起来声音会变得不那么纯净,但不一定丢失或改变了原始音频的信息内容。在数字信号领域,失真可能表现为信号的波形畸变,比如信号的上升沿或下降沿变得不陡峭,出现过冲或下冲等情况。
什么是DSP?
光模块传输,即电信号转变为光信号,光信号转变为电信号的过程。在发送端,信号经过数模转换器 (DAC),将其从数字信号变为模拟信号。在接收端,模拟信号经过模数转换(ADC)并再次变为数字。经过一番运算后,得到的数字信号有点杂乱、失真。这时,就需要DSP,对数字信号进行“修复”。DSP是运行算法的芯片。它具有数字时钟恢复功能和色散补偿功能(去除噪声、非线性干扰等因素),可以对抗和补偿失真,减少失真对系统误码率的影响。并非所有传统光模块都有DSP,但在高速光模块中,信号要求较高,所以基本都需要DSP。
DSP如何修复失真?
DSP修复的是数字信号的失真而非误码;
数字信号是一种离散的信号,其取值仅为有限个特定值,通常用二进制数 “0” 和 “1” 来表示。这些离散值之间不存在中间过渡状态。例如,在计算机中,数据以二进制代码的形式存储和传输,每一位只有 “0” 或 “1” 两种状态,这就是典型的数字信号。
由于数字信号只有有限个离散状态,当信号受到噪声干扰时,只要干扰强度不足以使信号状态发生翻转(如 “0” 变成 “1” 或 “1” 变成 “0”),就可以通过适当的电路和算法进行恢复。使用该算法的芯片就是DSP芯片;他可以使用一些失真修复算法来恢复失真;
当然,如果信号状态发生翻转(如 “0” 变成 “1” 或 “1” 变成 “0”),也就是出现误码的时候,就需要使用另一种的技术,就是DSP芯片中的FEC来纠正误码;
FEC
什么是FEC(Forward Error Correction)?
向前纠错FEC(Forward Error Correction)是一种广域网差错控制技术,用于解决实时音、视频的网络丢包问题,保障重要音、视频流穿越广域网后仍能流畅播放,增强RTP流在广域网传输的可靠性。FEC的基本原理是:发送端将多个原始报文,通过RS(Reed Solomon)算法编码计算并增加冗余包后,以编码块为单位发送;接收端根据收到的原始报文和冗余包恢复出丢失的报文,还原原始数据。
平均抗丢包率
FEC技术中的重点和难点是生成适量的冗余包。生成的冗余包数量过多,会浪费网络带宽;生成的冗余包数量过少,则无法恢复出丢失的报文。冗余包的数量受编码块包数、编码算法和平均抗丢包率的影响。其中,编码块包数指编码块中原始报文的个数,由用户配置决定;编码算法出厂时己固定,不可配置;平均抗丢包率用于衡量FEC抗丢包的能力,通常会设置成大干链路平均丢包率的值。当编码块包数和编码算法已确定,平均抗丢包率对传输网络的影响如下:
- 平均抗丢包率越大,FEC抗丢包能力越强,但同时会产生更多的冗余包,占用更多的链路带宽,传输效率越低。
- 平均抗丢包率越小,FEC抗丢包能力越弱,同时产生的冗余包就少,占用的链路带宽越少,传输效率越高。
D-FEC和A-FEC
根据平均抗丢包率的配置方式不同,FEC分为D-FEC(Determined-FEC,固定的FEC)和A-FEC(Adaptive-FEC,自适应的FEC)两种类型:
- D-FEC使用固定的平均抗丢包率,适用于链路丢包率比较稳定的场景。
- A-FEC根据实时链路丢包率动态调节平均抗丢包率,实现机制比D-FEC复杂。可在保证通信质量和可靠性的前提下,尽量减小冗余包数量,提高传输效率。在广域网环境下,A-FEC应用更广泛。
处理流程
A-FEC处理流程如下
- 发送端识别业务报文,进行FEC编码处理后发送。
- 报文识别:发送端根据管理员配置的策略匹配需要重点保障的音、视频报文。对于匹配成功的报文,则进入FEC处理环节;对于匹配失败的报文,则正常转发。
- 缓存、编码:积攒多个原始报文(例如报文1、2、3、4),对这些报文进行编码,生成一个或多个冗余包R。冗余包报文头中携带原始报文和冗余包的个数、原始报文和冗余包的起始序号等信息。
- 组合发送:按顺序发送原始报文1、2、3、4和冗余包R。
- 在广域网中传输报文,编码块中的原始报文和冗余包都可能出现丢包。
- 接收端识别业务报文,进行FEC解码后发送给目的端。
- 报文识别:接收端根据和发送端相同的策略匹配音、视频报文。对于匹配成功的报文,则进入FEC解码环节;对于匹配失败的报文,则正常转发。
- 缓存、解码:接收端将原始报文缓存,收到冗余包时会根据几余包中携带的信息尝试解码。如果缓存的同一编码块中的原始报文与冗余包个数之和大于等于冗余包中携带的原始报文的个数,则可恢复丢失的数据,解码成功。如下图所示,接收端根据原始报文1、2、4和冗余包R可恢复出丢失的原始报文3。如果解码失败,则继续等待下一个冗余包来解码,或者等待解码超时,再进人发送环节。
- 发送:丢弃冗余包,发送原始报文。
- 接收端在执行步骤(3)的同时会计算每个编码块的丢包率,按周期对编码块的丢包率来样,并将采样的丢包率反馈给发送端。
- 发送端根据收到的丢包率计算平均值,动态调整平均抗丢包率,并从下一次编码开始,使用调整后的平均抗丢包率进行FEC编码。
CRC
什么是CRC(Cyclic Redundancy Check)?
循环冗余校验CRC(Cyclic Redundancy Check)是数据通信领域常用的一种数据传输检错技术。通过在发送端对数据按照某种算法计算出校验码,并将得到的校验码附在数据帧的后面,一起发送到接收端。接收端对收到的数据和校验码按照相同算法进行验证,以此判断接收到的数据是否正确、完整。
目录
CRC简介
我们知道,数据在传输过程中可能会因为传输介质故障或外界的干扰而产生比特差错(使原来的0变为1,原来的1变为0),从而导致接收方接收到错误的数据。为尽量提高接收方收到数据的正确率,在接收数据之前需要对数据进行差错检测,仅当检测的结果为正确时才接收数据。
差错检测的方式有多种,常见的有奇偶校验、求和校验、CRC校验等。他们的工作原理都是发送端对数据按照某种算法计算出来校验码,将校验码和数据一起发送到接收端,然后接收端进行检验确定数据是否发生变化。
CRC是由W. Wesley Peterson在1961年发表的论文中提出,由于CRC校验在速度、成本、正确率等方面比其他校验方式更具有优势,因此,CRC成为计算机信息、通信领域最为普遍的校验方式。例如在标准的以太帧格式中,最后有4个字节长度的冗余位,用于存储CRC校验的值,这个冗余位又常称为帧检验序列FCS(Frame Check Sequence)。
以太帧结构
CRC是如何计算的?
CRC的思想就是先在要发送的K比特长度的数据后面附加一个R比特长度的校验码,然后生成一个新帧发送给接收端。接收端接收到新帧后,根据收到的数据和校验码来验证接收到的数据是否正确。
数据+校验码示例
当然,这个附加的校验码不是随意添加的,要使所生成的新帧能与发送端和接收端共同选定的某个特定数整除(“模2除法”)。接收端把接收到的新帧除以这个选定的除数。因为在发送数据帧之前就已通过附加一个数,做了“去余”处理(也就已经能整除了),所以结果应该是没有余数。如果有余数,则表明该帧在传输过程中出现了差错。
在K比特数据后面再拼接R比特的校验码,整个编码长度为N比特,这种编码也叫(N,K)码。对于一个给定的(N,K)码,可以证明存在一个最高次幂为N-K=R的多项式g(x),根据g(x)可以生成R比特的校验码。其算法是以GF(2)多项式算术为数学基础的,原理如下图所示。
CRC计算公式
g(x)叫做这个校验码的生成多项式。不同的CRC生成多项式,其检错能力是不同的。要使用R位校验码,生成多项式的次幂应为R。以下为常见的一些标准多项式。
常见生成多项式
这些多项式的值便是模2除法的除数。而根据这个除数获得校验码并进行校验的原理可以分为以下几个步骤:
- 发送端、接收端在通信前,约定好除数P,也就是前面说的多项式的值。P应该是R+1位长度;
- 发送端首先在原来的K位数据后面加R个0,相当于原来的数据左移了R位;
- 然后进行模2除法运算(其实就是异或XOR运算),将加0之后的K+R位的数除以P,循环计算,直到余数的阶数小于R,这个余数就是附加的校验码,如果长度不足R位需要在前面加0补齐;
- 发送端将R位校验码附加在原数据后面发送给接收方;
- 接收方接收到数据后,将数据以模2除法方式除以除数P。如果没有余数,说明在传输过程中没有出现错误,否则说明有错误。
下面以一个简单示例来展示CRC的计算过程:
以g(x)为CRC-4=X4+X+1为例,此时除数P=10011。假设源数据M为10110011。
在发送端将M左移4位,然后除以P。
发送端CRC计算示例
计算得到的余数就是0100,也就是CRC校验码。将0100附加到原始数据帧10110011后,组成新帧101100110100发送给接收端。接收端接收到该帧后,会用该帧去除以上面选定的除数P,验证余数是否为0,如果为0,则表示数据在传输过程中没有出现差错。
接收端CRC校验示例
综述
失真修复、FEC和CRC都用于修复数据
DSP的失真修复使用失真修复算法修复失真,使得数据恢复01的样貌;
FEC和CRC都是使用冗余的数据来帮助数据鉴定
- FEC使用冗余的
数据包
来进行算法计算,可以逆向还原,修复原始数据包; - CRC使用冗余的
数据
来进行算法计算,不具备可逆性,只能用来检验数据包是否出现错误;