以太网之 L2-LLR 介绍

1、LLR 如何工作?

存在的问题:

集合操作导致的丢包:

硬件和布线导致包破坏:

UE 链路层减少丢包的网络栈:

L2-LLR如何工作的细节:

2、LLR 基础定位(Ultra Ethernet consortium)

LLR = Link Level Retry 链路层低时延重传 ,是 UEC 核心无损可靠性机制,工作在MAC 层之上、TCP/RoCE 等传输层之下 ,逐跳(hop-by-hop)帧级重传,替代 / 辅助 PFC 实现无损以太网,专门适配 AI/HPC 超低时延、高可靠需求。

核心优势:丢包只在相邻两台设备之间重传,不用端到端回退,大幅压低尾延迟;PFC 只解决拥塞丢包,LLR 同时处理线路误码、瞬时故障、少量拥塞丢包。

基础规则:

  1. 所有 LLR 使能帧分配唯一递增序列号 Seq(图中 1/2/3/4...)
  2. 发送端(LLR Sender):发出帧必须存入**Replay Buffer 重放缓冲区**,直到收到接收端 ACK 确认才能删除缓存
  3. 接收端(LLR Receiver):按 Seq 校验,连续正常收帧回ACK ;检测到 Seq 缺口(丢帧)立刻回NACK(否定确认)
  4. 双保护:NACK 主动重传 + 发送端超时兜底重传(防止 NACK 本身丢包)

3、逐帧拆解时序图完整流程

阶段 1:Sender 顺序发送 1~8 号帧

  1. Sender 依次发出帧 1、2、3、4、5、6、7、8,每帧打上 Seq,全部存入本地重放缓存;
  2. Receiver 侧接收情况:
  • 帧 1 正常到达 → 立刻回复 ACK1(绿色 ACK)
  • 帧 2 丢失(图中红色叉号),出现 Seq 缺口:收到 1 之后下一个收到 3,检测到 2 缺失
  • 帧 3、4、5、6、7、8 陆续抵达 Receiver

阶段 2:Receiver 生成 NACK2(丢包检测触发)

  1. Receiver 发现 Seq2 缺失,立即生成 LLR_NACK2(红色 NACK 报文)发回 Sender;
  • 这个 NACK 发出时刻 = LLR Discard Window 丢弃窗口的起点(图右侧注释定义)
  • NACK2 走反向链路传回 Sender,耗时半个 RTT;
  • 注意:NACK 在路上传输这段时间里,Sender 还在持续发新帧(9、10),同时 Replay Buffer 里还完整存着 1--8 所有未彻底确认的帧。

阶段 3:Sender 收到 NACK2,启动选择性重传

  1. Sender 收到 NACK2,立刻从重放缓存取出仅帧 2 ,单独重发(图里黄色线条就是重传帧 2、3、5、7...);
    LLR 是Selective 重传,不会回退重传全部,只补发丢失帧,这是低时延关键;
  2. 图里 Sender 侧标注 [2,3,4,5,6,7,8] 就是当前 Replay Window 重放窗口: 右侧定义:LLR Replay Window 起点 = 第一个未被 ACK 确认的帧(这里就是帧 2);终点 = 收到 ACK 之前最后一个发出的可 LLR 重传帧
    窗口内所有帧都必须留在缓存,不能释放内存。

阶段 4:重传帧抵达 Receiver,Discard Window 结束

  1. 重传帧 2(黄色)到达 Receiver,补齐 Seq 缺口; 右侧定义:LLR Discard Window 终点 = 收到携带预期 Seq 号的第一个重传帧(也就是收到重传帧 2 这一刻,Discard Window 关闭)
  2. Receiver 后续收到重传帧、新帧后,批量回复 ACK3、ACK5、ACK7、ACK9、ACK10:
  • ACKX 含义:Seq≤X 的所有帧全部正确接收,Sender 可以安全删除 Replay Buffer 里≤X 的缓存帧
  • 比如收到 ACK3 → 帧 2、3 都确认,缓存里 2、3 可释放,Replay Window 起点滑动到 4

阶段 5:窗口滑动、缓存回收、持续传输

  1. 每收到一个 ACK,Sender 的 Replay Window 左边界向右滑动,释放已确认帧的缓存;
  2. 帧 9、10 持续新发,不断追加到 Replay Window 右端;
  3. 全程新业务流量和重传流量并行发送,不会阻断发送管道。

4、两个核心窗口深度理解(对应图右侧注释)

  1. LLR Replay Window(重放窗口,发送端视角)
  • 起始:第一个还没收到 ACK 确认的帧(本例帧 2)
  • 结束:Sender 收到 ACK 报文那一刻,已经发出去的最后一个 LLR 可用帧
  • 本质:窗口内所有帧必须保存在 Sender 缓存,随时待命重传;窗口大小≈链路 BDP(带宽 ×RTT),和你之前问的 PFC 缓存逻辑同源:
    信号往返 RTT 时间内发送出去的数据,都要缓存兜底。
  1. LLR Discard Window(丢弃窗口,接收端视角)
  • 起始:Receiver 生成 NACK 报文的瞬间(发现丢包立刻计时)
  • 结束:Receiver 成功收到对应缺失序号的第一个重传帧
  • 作用:窗口内 Receiver 不会向上层上报乱序 / 缺口,耐心等待重传帧补齐;窗口结束后 Seq 恢复连续,正常向上交付数据。

5、对比 PFC,理清 LLR 和 PFC 分工

机制 解决问题 工作方式 时延影响
PFC 下游缓存满导致的拥塞丢包 Rx 发 PAUSE 让 Tx 整体停发整条优先级队列 停发会阻塞业务流,队列累积放大延迟
LLR 线路误码、瞬时故障、少量拥塞丢包 丢哪帧只重传哪帧,发送管道不中断 几乎不阻断新发流量,只有少量重传开销

UEC 推荐组合:PFC 做大拥塞防护,LLR 做微小丢包快速修复;极端场景可纯 LLR 弱化 PFC 依赖,减少 PFC 死锁风险。

一句话极简总结时序

  1. 发帧→存缓存→收方校验 Seq;
  2. 缺 Seq 立刻回 NACK;
  3. 发方收到 NACK 只补发丢的那一帧;
  4. 收方补齐 Seq 后回 ACK,发方释放已确认缓存、滑动重放窗口;
  5. Replay Window 管发送端缓存留存,Discard Window 管接收端等待重传的时间区间。

6、LLR CtlOS

核心运行规则

  1. 序列号 Seq 机制:所有 LLR 业务帧分配全局递增 Seq 号,收发两端严格按 Seq 有序校验。
  2. 发送端(Sender)
  • 发出的 LLR 帧存入Replay Window 重放缓存,收到 ACK 前绝不删除;
  • 双保护重传触发:
    ① 收到LLR_NACK:立刻选择性重传缺失 Seq(快速主保护)
    ② 帧超时未收到任何反馈:定时器兜底重传(后备保护,防止 NACK/ACK 自身丢失卡死链路)
  • 接收端(Receiver)
  • 顺序收帧 → 回复LLR_ACK(累积确认:ACK (X) = Seq 1~X 全部完好接收)
  • 检测 Seq 空洞(丢包)→ 立刻发送LLR_NACK(丢失Seq),开启Discard Window 丢弃等待窗口,暂不上报乱序给上层,等待重传补齐;
  • 选择性重传:无论 NACK / 超时,只补发丢失序号,不回退整个发送窗口,吞吐几乎无损耗。
  • 窗口体系
  • Replay Window(发送侧):起点 = 首个未 ACK 帧,终点 = ACK 到来前最后一个发送的 LLR 帧;窗口大小匹配链路 BDP(带宽 ×RTT)。
  • Discard Window(接收侧):起点 = 生成 NACK 时刻,终点 = 收到对应重传 Seq 帧。
  1. 链路初始化流程

上电 / 链路 UP 时依靠LLR_INIT + LLR_INIT_ECHO协商初始序列号,同步两端 Seq 计数起点,完成握手后链路才允许传输业务 LLR 帧。

6.2 LLR CtIOS 详解(Control Ordered Sets 控制有序集)

CtIOS 是 UEC 里承载 LLR 控制信令的标准 64/66B 块编码格式,4 种专用 LLR 控制有序集,用来在链路上双向传递握手、确认、丢包通知指令。

  1. 四类 CtIOS 功能定义
CtIOS 类型 发送方 核心作用 携带关键字段
LLR_ACK LLR 接收端 Rx 累积确认:告知发送端≤ack_nack_seq 的所有帧全部接收正常,发送端可释放对应 Replay 缓存 ack_nack_seq(完整 22bit 拆分:高 19bit + 低 3bit)
LLR_NACK LLR 接收端 Rx 否定确认:通知发送端ack_nack_seq 这个序号帧丢失,请求立刻重传该 Seq ack_nack_seq(同 ACK 位域拆分格式)
LLR_INIT 任意一端(发起方) 链路初始化握手:下发本端期望的初始序列号 init_seq,同步链路 Seq 基线 init_seq (22bit 拆分)、init_data 配置参数
LLR_INIT_ECHO 对端(应答方) 回应 INIT 握手:告知发起方已接收并解析 INIT,本端就绪,可以收发 LLR 业务帧 回带协商后的 init_seq、init_data
  1. 统一 64/66B CtIOS 块帧格式(表格拆解)

所有 LLR CtIOS 共用一套块封装结构,Sync、固定标记、块类型完全统一:

  1. Sync 同步位(bit0/1) :固定10,标识这是 64/66B 控制块
  2. D0 块类型字段 :固定0x4B区分 LLR 类控制集
  3. D1 子类型码(区分 4 种 CtIOS)
  • LLR_ACK = 0x01
  • LLR_NACK = 0x02
  • LLR_INIT = 0x03
  • LLR_INIT_ECHO = 0x04
  • 核心序号分段存储(D2 + D4 7:4
    22bit 序列号被拆成两段存放:
  • D2:高 19bit ack_nack_seq<19:4> / init_seq<19:4>
  • D4 高 4 位:低 3bit ack_nack_seq<3:0> / init_seq<3:0>
  • 固定填充位 D3=0x6,D5/D6/D7 默认填 0
  • INIT/INIT_ECHO 额外在 D5 携带init_data<15:0>初始化配置参数
  • ACK/NACK 无 init_data,D5/D6/D7 全部置 0 填充对齐块大小
  1. CtIOS 传输关键特性

  2. 有序传输保障:Ordered Sets 保证控制信令和业务帧的时序对齐,不会出现控制帧超前 / 滞后业务帧导致的 Seq 错乱;

  3. 双向承载:ACK/NACK 由 Rx 发给 Tx(反向反馈通道);INIT/INIT_ECHO 双向均可发起握手;

  4. 轻量开销:CtIOS 是标准 64/66B 块封装,相比独立以太网控制帧,封装开销极小,适配 200G/400G/800G 超高带宽低时延场景;

  5. 兼容性隔离:D0=0x4B 作为 LLR 专属标识,和 UEC 其他 CtIOS(如 PFC、故障告警控制集)互不冲突。

6.3 LLR + CtIOS 完整联动流程极简串联

  1. 链路初始化阶段
    设备 A 发 LLR_INIT CtIOS → 设备 B 收到后回复 LLR_INIT_ECHO CtIOS → 两端对齐 init_seq,链路就绪。
  2. 正常传输无丢包
    A 连续发业务 LLR 帧(Seq1/2/3...)→ B 逐帧接收,间隔回复LLR_ACK(X) CtIOS → A 收到 ACK 滑动 Replay 窗口、释放缓存。
  3. 发生单帧丢包(如 Seq2 丢失)
    B 检测 Seq 空洞 → 立即发送LLR_NACK(2) CtIOS;
    A 收到 NACK CtIOS → 从重放缓存取出 Seq2 选择性重传;
    重传 Seq2 抵达 B 补齐空洞 → B 回复新的LLR_ACK(3) CtIOS 确认。
  4. 极端场景(NACK CtIOS 自身丢失)
    B 发的 NACK 半路丢包,A 侧 Seq2 计时器超时 → A 主动重传 Seq2;重传帧到 B 后依然能补齐 Seq,后续正常 ACK CtIOS 收尾兜底。

最终一句话浓缩

  1. LLR:UEC 逐跳低时延选择性重传无损机制,靠 Replay/Discard 双窗口 + NACK / 超时双保护实现链路可靠;
  2. LLR CtIOS:承载 LLR 握手、ACK、NACK 四种控制信令的标准化 64/66B 有序控制块,是 LLR 收发两端交互指令的唯一载体。

7、LLR 协议层架构位置

  1. 层级插入位置
    LLR(Link Layer Retry)部署在 LLC/MAC Client(上层)MAC Control 子层(下层) 之间,属于链路层(Link)内部可选子模块。
  2. 完整协议栈从上到下:
    高层业务层 → LLC/MAC 客户端 → LLR(可选) → MAC Control(可选)→ MAC 介质访问控制 → Physical 物理层
  3. 定位意义:
    完全嵌套在标准以太网 MAC 体系内,不改动底层 MAC/PHY 基础框架,可按需开启 / 关闭 LLR 能力,兼容传统以太网流量。

8、LLR 序列号(Sequence Number)核心规则

  1. 按帧粒度区分流量
    MAC 下发的以太网帧被分成两类:
  • LLR-eligible(启用 LLR 重传保护):需要链路可靠重传的业务帧(如 RoCE、HPC、AI 算力流量)
  • LLR-ineligible(不启用 LLR):普通标准以太网流量,不走 LLR 重传逻辑
  1. 20bit 序列号分配规则
    LLR-eligible 帧 由 LLR 发送端分配一个20bit 唯一递增序列号 ;该 Seq 号直接嵌入在帧前导码(Preamble)的字节 1~3 中;
    非 LLR 帧无此 Seq 字段,使用传统标准前导。

9、两种帧的前导码(Preamble)字节格式对比

标准以太网前导共 8 字节(Byte0~Byte7,末尾 0xD5 为 SFD 帧起始定界符)

  1. LLR-ineligible 普通帧(标准以太网前导)
  • Byte0 ~ Byte6:全部固定 0x55(二进制1010 1010
  • Byte7:固定 SFD 0xD5(1010 1011
    无任何序列号嵌入,完全兼容传统以太网。
  1. LLR-eligible 受保护帧(改造型前导)
  • Byte0:依然标准 0x55(1010 1010
  • Byte1:高 4bit 固定标识1110(0x7 前缀,用来标记这是 LLR 帧),低 4bit 为 20bit Seq 的最高 4 位
  • Byte2 + Byte3:承载 20bit 序列号剩余 16 位
    → Byte1 低 4 + Byte2 (8bit) + Byte3 (8bit) = 完整 20bit LLR 序列号
  • Byte4 ~ Byte6:恢复标准 0x55
  • Byte7:标准 SFD 0xD5 不变

10、关键特性小结

  1. LLR 是可选子层,不强制部署,兼容传统以太流量;
  2. 前导码改造实现 Seq 号承载,无需修改以太网帧载荷头部,开销极低;
  3. 流量隔离:可混合传输受 LLR 保护的高可靠业务 + 无保护普通以太业务;
  4. 20bit 序号空间足够大,长链路、高速率场景下极少出现序号回绕问题。