25GBASE-R 上的 RS_FEC 开销

网络工程 以太网
2022-02-03 18:54:12

我想估计启用 Reed-Solomon RS(528,544) 前向纠错 (RS-FEC) 时 25 GbE 链路 (25GBASE-R) 传输特定大小的以太网有效负载的有效容量,但是,我很难就与 RS 相关的开销得出结论。

为简单起见,我们假设所有以太网帧都是 1000 字节,每个帧都有 14 字节的 MAC 头,982 字节的有效负载和 4 字节的帧校验序列。

此外,我们假设除了传输 1000 字节帧所需的额外开销之外,链路上没有其他开销。这意味着,没有流量控制或暂停帧等。

每秒 25e9 位 我假设要计数的所有内容都以每秒 25e9 位 (25 Gbps) 的速度发送到链路上。我通过将 25.78125e9 波特的链路信号速率乘以 64 位/66 位编码率得出这一点。

这是 96.97% 的基本效率。

也可以将其视为每秒 3.125e9 字节,或简称为 3.125 GBps。

NON-FEC 案例 要估计非 FEC 案例的有效以太网有效负载容量,在我看来,我们只需要考虑链路上的以下传输:

12B 包间间隙 7B 前导 1B 帧开始定界符 14B 以太网报头 982B 以太网有效载荷 4B 帧校验序列 1020B

由于以太网有效负载占总 1020 个字节中的 982 个字节,因此链路相对于有效负载的效率为 96.27% (982B/1020B)。

如果上面列出的所有项目都以每秒 25e9 位 (25 Gbps) 的速度传输,那么可能实现的最大以太网有效负载将为每秒 3.0086e9 字节 (3.01 GBps)。

REED-SOLOMON FEC 开销? IEEE 802.3by 文档说 25GBASE-R RS_FEC 使用 RS(528, 514) 编码方案。(它还说它在符号大小为 10 位的 Galois 域 GF(2^10) 上运行,但我猜这与我的问题无关。)

如果我理解正确,RS(528, 514) 最多接收 8 个 64 位数据块,重新排序这些块,然后将它们分成两组,每组四个,每组分配 1 位开销。因此,最初的 512 位数据(64 字节数据)现在由 514 位表示。

RS_FEC 还会生成一个 14 位奇偶校验值以发送到链路上。

因此,原始的 512 位数据作为 528 位 RS_FEC 数据以 25 Gbps 的速度传输到链路上。每 66 个字节就有 2 个字节的开销。这也是 96.97% 的效率。

假设输入 RS_FEC 算法的数据已经以 64B/66B 编码,那么这会将链路效率从我最初计算的 96.97% 降低到 94.03% (0.9697 * 0.9697)

问题 (1) 输入 RS_FEC 算法的数据是否已经编码为 64B/66B,从而在应用 RS_FEC 后总效率下降到 94.03%?

(2) 有没有我没有考虑的管理费用?

(3) RS_FEC 控制传输的哪一部分?

例如,是否包括序言、SFD 和 FCS?

数据包间间隙期间的空闲情况如何?

(4) IEEE Standard for Ethernet Amendment 2 (IEEE Std 802.3by-2016) 表明“25GBASE-R RS-FEC 子层采用 Reed-Solomon 码 RS(528,514) 在 Galois Field GF(2^10) 上运行,其中符号大小为 10 位。” 我认为符号大小与我最初的问题无关。

该文件还说“应使用 91.5.2.7 中描述的编码器”。这是对 IEEE 以太网标准 (IEEE Std 802.3-2018) 文档第 6 节的参考,该文档实际上是关于 40 GbE 和 100 GbE。

如何将其转换为 25GBASE-R?

(5) 同一文档的第 5 节有一张图片显示 FEC 编码的以太网帧(图 65-7):S_FEC(5B) + PREAMBLE/SLD + FRAME+FCS + T_FEC(6B) + PARITY(14bits) + T_FEC( 6B)

这是否也适用于 25GBASE-R?如果是这样,那么我还有更多问题:

(6a) RS 算法是否只适用于 PREAMBLE/SLD + FRAME + FCS?

它是否包含包间间隙字符?

(6b) 如果以太网帧更长,每个 64 字节的输入数据块是否会有 S_FEC + T_FEC + PARITY + T_FEC?

或者,我们是否会在每个以太网帧中只看到一次 S_FEC 和最终的 T_FEC?

(6c) S_FEC 和 T_FEC 真​​的分别是 5 个字节和 6 个字节吗?如果是这样,那么这不是使 RS_FEC 算法效率极低吗?

在这些大小下,每 64 字节原始数据的开销将因此为 19 字节(5B + 2 位 + 6B + 14 位 + 6B)。这只是 77.11% ( 64 / (64 + 19) ) 的效率。

但是,如果对于帧的每个 64 字节块只有 T_FEC+PARITY 上,并且对于整个帧,在开始时只有一个 S_FEC,在结束时只有一个 T_FEC,效率会更高。

谢谢!汤姆


后续

据我了解,在转码过程中,代表原始 64b 数据块的 66b 块被输入 RS 算法,然后创建两个 257b 块,每个块有四个 66b 块加上一位开销。因此,我们有 514b 代表原始数据的 512b。这是 2b 的开销。

然后将其用于计算在 514b 块之后传输的 14b 奇偶校验值。因此,我们现在有 528b 代表原始数据的 512b。

因此链路的容量应该从 25e9 bps 减少到 24.24e9 bps (25e9 bps * 512/528)。

是否有任何其他 RS-FEC 开销位或字节发送到链路上?S_FEC和T_FEC怎么样,是插入以太网帧吗?

RS-FEC 是仅对帧进行操作,还是通过 RS-FEC 馈送通过链路的每个字符?

谢谢,汤姆

2个回答

无论您使用哪种以太网 PHY,标称速度始终是物理层顶部的有效带宽无论是否使用 FEC,哪个 PCS 代码等都无关紧要。物理线/光纤上的符号率适当地更高以适应。

因此,超过 25GE 的最大以太网帧需要 (1538 * 8 / 25,000,000,000) ≈ 49.2 μs。(1500 字节有效负载,18 字节 L2 开销,20 字节 L1 开销,包括 IPG),无论 PHY 及其选项如何。

例如,TCP over IPv4 over 25GE 的最大有效吞吐量为 (1460 / 1538) * 25,000,000,000 / 8 ≈ 2.967 GB/s。(几乎总是需要窗口缩放选项。)

正如 JFL 所指出的,实际吞吐量取决于您的硬件。并非所有 25GE 硬件都是非阻塞的。例如,25G NIC 至少需要 PCIe 3.0 x4、PCIe 2.0 x8 或等效插槽(和适当的后端)才能进行非阻塞传输。

RS-FEC 应用在 PCS(66b/64b 编码)和 PMA 子层之间(检查 IEEE 802.3 第 108 条)。它将 64b/66b 转码为 256b/257b (108.5.2.3) 以便为 RS 留出余量,因此不需要更高的波特率。

再跟进:物理层应用PCS线路码、RS-FEC转码等它们不会以任何方式更改数据链路层框架。通常,PCS、RS-FEC 等仅在较低的 PHY 中很重要。它们对上层PHY及以上完全没有影响。

我最近在看这个规范,所以我可以提供一些见解。以太网的所有 FEC 方案都设计为以与非 FEC 版本相同的线路速率和串行器速率运行(100GBASE-KP4 除外,它使用更高开销的 RS(544,514) FEC,但这是完全不同的动物因为它使用 PAM-4 并且不支持禁用 FEC)。因此,对于 10GBASE-KR,数据速率为 10 Gbps,串行器速率为 10.3125 Gpbs,无论是否启用 FEC。25 Gbps、40 Gbps 和 100 Gbps 以太网的想法相同。

他们这样做的方式很简单:FEC 层从其他协议组件“窃取”位以释放足够的位来传输所需的奇偶校验信息,然后在另一端恢复原始位。

让我们从 BASE-R FEC 开始。没有 FEC 的 10GBASE-R 以太网使用 64b/66b 线路代码传输 - 64 位数据块使用 LFSR 加扰,然后将 2 位同步头附加到每个块,数据以 10.3125 Gbps 串行发送。10GBASE-KR FEC 旨在添加前向纠错,同时保持编码前 10 Gbps 的相同数据速率和在线上 10.3125 Gbps 的相同数据速率。这是通过获取 32 个块 64b/66b 编码数据,剥离每个块上的一个同步位以释放 32 个位,添加 32 个缩短循环码(2112、2080)的奇偶校验位,加扰结果,然后发送在 10.3125 Gbps 的线上。

但是,这种方法需要权衡:由于同步标头已被有效删除,因此块锁定时间大大增加(PHY 需要检查多达 2112 个块,每个块 2112 位,而不是 66 个块,每个 66 位) ,将链接所需的时间延长了几个数量级。

较新的以太网 Reed-Solomon FEC 做了类似的事情,但块大小更大。64b/66b 数据一次转码 4 个块为 256b/257b,20 257 位块被分解为 514 个 10 位符号,用 RS(528,514) 编码生成 14 个 10 位奇偶校验符号,总共 528 个符号,然后打包并作为 5280 位块发送。使用 64b/66b 编码的原始数据也将占用 66*4*20 = 5280 位。

这两种编码方案都在 64b/66b 编码符号级别上运行,其中基本上包括所有内容 - 数据、前导码、帧间间隙、成帧控制字符、错误控制字符等。此外,因为它们在 64b/ 级别上运行66b 编码块,FEC 块完全独立于数据包本身。当链路空闲时,FEC 块将不包含任何数据。或者它可以包含一个数据包的一部分,一个完整的数据包,甚至多个数据包。一个 RS-FEC 块包含 640 字节的数据,因此这可能是多个最小长度帧或 MTU 帧的一部分。

底线:在链路上启用 FEC 不会造成任何类型的数据速率损失。