RoCEv2

RoCEv2协议深度解析

第1章 RDMA基础与RoCEv2概述

1.1 什么是RDMA

RDMA(Remote Direct Memory Access,远程直接内存访问)是一种允许网络适配器直接访问远程主机内存的数据传输技术。

传统网络通信中,应用程序之间的数据交换需要经过操作系统协议栈处理。

以TCP Socket为例:

text 复制代码
Application
    ↓
Socket API
    ↓
TCP
    ↓
IP
    ↓
Ethernet
    ↓
NIC

接收端执行相反过程:

text 复制代码
NIC
 ↓
Ethernet
 ↓
IP
 ↓
TCP
 ↓
Socket
 ↓
Application

整个过程中存在三个主要开销:

数据拷贝

数据通常经历:

text 复制代码
User Buffer
    ↓
Kernel Buffer
    ↓
NIC DMA Buffer

接收端再次执行:

text 复制代码
NIC DMA Buffer
    ↓
Kernel Buffer
    ↓
User Buffer

导致多次Memory Copy。

上下文切换

应用程序和内核之间频繁切换:

text 复制代码
User Mode
 ↔
Kernel Mode

产生额外开销。

CPU参与协议处理

TCP需要完成:

  • 重传控制
  • 流量控制
  • 拥塞控制
  • ACK处理
  • 分片重组

大量消耗CPU资源。


1.2 RDMA解决的问题

RDMA的核心思想:

将数据传输从CPU转移到RNIC(RDMA NIC)完成。

数据路径变成:

text 复制代码
Application Memory
        ↓
      RNIC
        ↓
     Network
        ↓
      RNIC
        ↓
Remote Memory

CPU不再参与数据搬运过程。

因此获得:

特性 TCP/IP RDMA
数据拷贝 多次 零拷贝
上下文切换
CPU参与 极低
延迟 us~ms us级
吞吐率 中等 极高

这也是现代AI集群普遍采用RDMA网络的根本原因。


1.3 RDMA协议家族

RDMA并不是一个具体协议。

它是一种传输模型。

目前主要存在三种实现:

协议 网络
InfiniBand IB Fabric
iWARP TCP/IP
RoCE Ethernet

InfiniBand

InfiniBand是最早成熟的RDMA网络。

协议栈:

text 复制代码
IB Transport
     ↓
IB Link Layer
     ↓
IB Physical Layer

特点:

  • 专用交换机
  • 专用网卡
  • 原生RDMA
  • 延迟最低

缺点:

  • 成本较高
  • 生态封闭

iWARP

iWARP运行于TCP之上。

协议栈:

text 复制代码
RDMA
 ↓
DDP
 ↓
MPA
 ↓
TCP
 ↓
IP

优点:

  • 完全兼容TCP网络

缺点:

  • TCP协议开销较大
  • 实现复杂

目前市场占有率较低。


RoCE

RoCE(RDMA over Converged Ethernet)是目前应用最广泛的RDMA方案。

核心思想:

text 复制代码
InfiniBand Transport
+
Ethernet Network

既保留InfiniBand RDMA能力:

  • QP
  • CQ
  • MR
  • RC

又利用成熟的以太网基础设施。


第2章 RoCE协议演进

2.1 RoCEv1

RoCEv1最早由IBTA提出。

协议栈:

text 复制代码
IB Transport
      ↓
Ethernet

封装格式:

text 复制代码
Ethertype = 0x8915

报文格式:

text 复制代码
Ethernet Header
       ↓
IB Header
       ↓
Payload
       ↓
ICRC

2.2 RoCEv1的局限性

RoCEv1工作在二层网络。

因此:

text 复制代码
Host
  ↓
L2 Switch
  ↓
Host

能够正常通信。

但:

text 复制代码
Host
 ↓
Router
 ↓
Host

无法路由转发。

因为:

  • 没有IP头
  • 没有UDP头
  • Router无法识别

这成为RoCEv1最大的限制。


2.3 RoCEv2诞生

RoCEv2解决方案非常简单:

在IB Header外面增加:

text 复制代码
UDP
+
IP

协议栈变成:

text 复制代码
IB Transport
      ↓
UDP
      ↓
IP
      ↓
Ethernet

因此:

text 复制代码
RoCEv2
=
Routable RoCE

简称:

text 复制代码
RRoCE

2.4 RoCEv2设计原则

RoCEv2设计时遵循两个原则:

原则一:保留IB Transport

RoCEv2并没有重新定义:

  • QP
  • RC
  • ACK
  • NAK
  • Retry

全部沿用InfiniBand规范。

因此:

text 复制代码
RoCEv2 ≈ IB Transport
原则二:利用IP网络

新增:

text 复制代码
IPv4
IPv6
UDP

获得:

  • 路由能力
  • ECMP能力
  • 数据中心部署能力

第3章 RoCEv2协议栈

RoCEv2协议栈如下:

text 复制代码
+--------------------------------+
| Application                    |
+--------------------------------+
| RDMA Transport Layer           |
+--------------------------------+
| UDP                            |
+--------------------------------+
| IPv4 / IPv6                    |
+--------------------------------+
| Ethernet MAC                   |
+--------------------------------+
| Ethernet PHY                   |
+--------------------------------+

其中 Ethernet层负责 MAC寻址、VLAN、FCS校验


IP层负责 网络寻址、路由、TTL管理


UDP层负责Port标识、ECMP Hash

注意:UDP不负责可靠性。RoCE可靠性完全不依赖UDP。


RDMA Transport Layer

这是整个RoCEv2最核心部分。

负责:

text 复制代码
QP管理
PSN管理
ACK处理
NAK处理
Retry控制
Read请求
Write请求
Atomic请求

RNIC中绝大部分复杂逻辑都位于该层。


第4章 RoCEv2报文结构

典型RoCEv2报文:

text 复制代码
+----------------------+
| Ethernet Header      |
+----------------------+
| VLAN(Optional)       |
+----------------------+
| IPv4/IPv6 Header     |
+----------------------+
| UDP Header           |
+----------------------+
| BTH                  |
+----------------------+
| Extended Header      |
+----------------------+
| Payload              |
+----------------------+
| ICRC                 |
+----------------------+

可以发现:

RoCEv2本质上只是:

text 复制代码
UDP Payload
=
IB Packet

整个IB Transport Header被作为UDP Payload承载。


4.1 Ethernet Header

标准长度:

text 复制代码
14 Bytes

格式:

text 复制代码
Dst MAC
Src MAC
Ethertype

RoCEv2中:

text 复制代码
Ethertype = 0x0800
或
Ethertype = 0x86DD

表示 IPv4 或者 IPv6。


4.2 IPv4 Header

长度:

text 复制代码
20 Bytes

关键字段:

字段 说明
Version IP版本
Total Length 总长度
TTL 生存时间
Protocol 协议号
Source Address 源IP
Destination Address 目的IP

RoCEv2:

text 复制代码
Protocol = 17

表示UDP。


4.3 UDP Header

长度:

text 复制代码
8 Bytes

格式:

text 复制代码
Source Port
Destination Port
Length
Checksum

RoCEv2规定:

text 复制代码
Destination Port = 4791

这是RoCEv2保留端口。

RNIC通常通过:

text 复制代码
UDP Port 4791

识别RoCE流量。

第5章 IB Transport Layer(RoCEv2核心)

RoCEv2的关键并不在UDP/IP,而在 InfiniBand Transport Layer(IBT)。该层定义了所有 RDMA 语义,包括 QP、PSN、ACK/NAK、可靠传输以及 RDMA Read/Write/Atomic 行为。

可以理解为:

text 复制代码
RoCEv2 = IP网络外壳 + IB Transport内核

UDP只是"搬运容器",真正协议状态机全部在IB Transport中。


5.1 Transport层设计目标

IB Transport设计目标非常明确:

  1. 低延迟(Low Latency)
  2. 高吞吐(High Throughput)
  3. 硬件可实现(Hardware Friendly)
  4. 可靠传输(Reliable Delivery)
  5. 支持零拷贝(Zero Copy)

因此它完全绕开传统TCP复杂机制,例如:

  • 拥塞窗口
  • 滑动窗口
  • 重传缓冲区
  • 复杂流控算法

改为硬件可实现的轻量机制:

text 复制代码
PSN + ACK/NAK + Retry Counter

5.2 Transport Packet结构总览

IB Transport Packet位于UDP Payload内部:

text 复制代码
+----------------------+
| BTH                 |
+----------------------+
| Extended Headers    |
+----------------------+
| Payload             |
+----------------------+
| ICRC                |
+----------------------+

其中:

  • BTH:所有包必备
  • Extended Header:根据Opcode变化
  • Payload:用户数据
  • ICRC:端到端校验

第6章 Base Transport Header(BTH)

BTH是RoCEv2中最关键的字段结构,RNIC的所有解析逻辑都从BTH开始。

6.1 BTH基本定义

text 复制代码
Size: 12 Bytes

结构如下:

text 复制代码
 31              24 23            16 15            0
+------------------+----------------+---------------+
| Opcode | Flags   | P_Key          |
+-----------------------------------+
| Destination QP                    |
+-----------------------------------+
| PSN                               |
+-----------------------------------+

6.2 Opcode体系(核心分类)

Opcode定义了当前Packet的语义,是整个Transport层的"指令码"。

6.2.1 Send类

text 复制代码
SEND
SEND_FIRST
SEND_MIDDLE
SEND_LAST
SEND_ONLY

特点:

  • 依赖Receive Queue
  • 必须预先Post Receive WQE
  • 常用于控制面或小数据

6.2.2 RDMA Write类

text 复制代码
RDMA_WRITE_FIRST
RDMA_WRITE_MIDDLE
RDMA_WRITE_LAST
RDMA_WRITE_ONLY

特点:

  • 无需远端CPU参与
  • 直接写远端Memory
  • 最高性能路径

6.2.3 RDMA Read类

text 复制代码
RDMA_READ_REQUEST
RDMA_READ_RESPONSE_FIRST
RDMA_READ_RESPONSE_MIDDLE
RDMA_READ_RESPONSE_LAST

特点:

  • 双向事务
  • 需要Responder参与返回数据
  • 带outstanding request管理

6.2.4 ACK/NAK类

text 复制代码
ACK
RNR_NAK
SEQ_NAK

用于可靠性控制。


6.2.5 Atomic类

text 复制代码
FETCH_ADD
COMPARE_SWAP

用于分布式同步。


6.3 P_Key机制(隔离域)

P_Key类似VLAN:

text 复制代码
16-bit Partition Key

作用:

  • 逻辑隔离
  • 多租户支持
  • QoS域划分

RNIC处理规则:

text 复制代码
if (P_Key != QP_Context.P_Key)
    drop packet

6.4 Destination QP

QP是RDMA通信核心对象:

text 复制代码
QP = Queue Pair (SQ + RQ)

Destination QP用于:

  • 定位接收端QP Context
  • 决定WQE队列
  • 绑定连接状态

RNIC内部流程:

text 复制代码
Dest_QP → QP_Context_Table Lookup → State Machine

6.5 PSN(Packet Sequence Number)

PSN是可靠传输核心字段。

text 复制代码
Width: 24-bit

6.5.1 发送端行为

text 复制代码
Next_PS N++

每发送一个packet递增。


6.5.2 接收端行为

维护:

text 复制代码
Expected_PSN

6.5.3 正常情况

text 复制代码
RX: 100,101,102
Expected:100
→ OK
Expected → 103

6.5.4 丢包情况

text 复制代码
RX: 100,102
Missing:101

触发:

text 复制代码
SEQ_NAK

6.5.5 重复包

text 复制代码
RX: 101 again
→ drop

第7章 Extended Transport Header

Extended Header根据Opcode变化。


7.1 RETH(RDMA Extended Transport Header)

用于:

  • RDMA WRITE
  • RDMA READ REQUEST

结构:

text 复制代码
+----------------------+
| Virtual Address     |
+----------------------+
| R_Key               |
+----------------------+
| DMA Length          |
+----------------------+

7.1.1 Virtual Address

远端物理/虚拟映射地址:

text 复制代码
64-bit address

RNIC不直接使用OS虚拟地址,而是MR注册后的地址空间。


7.1.2 R_Key

权限控制核心:

  • 类似Access Key
  • 防止非法访问

检查逻辑:

text 复制代码
if (!match R_Key)
    generate Access Error

7.1.3 Length

本次DMA长度。

支持:

  • 1B ~ MTU * N

7.2 AETH(ACK Extended Header)

用于:

  • ACK
  • RNR NAK
  • READ RESPONSE

结构:

text 复制代码
+----------------+
| Syndrome       |
+----------------+
| MSN            |
+----------------+

7.2.1 Syndrome类型

类型 含义
ACK 正常确认
RNR 接收端未准备
SEQ PSN错误

7.2.2 MSN(Message Sequence Number)

用于:

  • 消息级确认
  • Send Queue语义

7.3 AtomicETH

用于原子操作:

  • Fetch Add
  • Compare Swap

结构:

text 复制代码
Virtual Address
R_Key
Compare Data
Swap Data

第8章 RC可靠连接机制

RC(Reliable Connection)是RoCEv2最重要的传输模式。


8.1 RC基本特性

RC提供:

  • 可靠传输
  • 顺序保证
  • 重传机制
  • ACK确认

8.2 RC状态机

QP状态:

text 复制代码
RESET → INIT → RTR → RTS

RESET

QP未初始化。


INIT

配置:

  • P_Key
  • Port
  • Access Flags

RTR

Ready to Receive:

  • 接收路径建立
  • QP Context完成

RTS

Ready to Send:

  • 可发送数据
  • PSN开始递增

8.3 ACK机制

接收端收到正确PSN序列:

text 复制代码
100,101,102

返回:

text 复制代码
ACK(102)

表示:

text 复制代码
所有<=102的数据已确认

8.4 NAK机制

8.4.1 SEQ NAK

PSN不连续:

text 复制代码
100,102

触发重传:

text 复制代码
request 101

8.4.2 RNR NAK

接收端无RQ WQE:

text 复制代码
Receive Queue Empty

发送:

text 复制代码
RNR NAK

发送端进入:

text 复制代码
RNR Retry Timer

8.4.3 Access Error

R_Key非法或权限错误。


8.5 Retry机制

发送端维护:

text 复制代码
Retry Counter

流程:

text 复制代码
Send Packet
→ Wait ACK
→ Timeout
→ Retry

超过最大次数:

text 复制代码
QP Error State

第9章 RDMA Write完整流程

Write是最高性能路径。

text 复制代码
Host A
   |
   | WRITE (BTH + RETH + Payload)
   ↓
Host B Memory

流程:

  1. 发送WRITE请求
  2. RNIC解析RETH
  3. 校验R_Key
  4. 查MR地址
  5. DMA写入
  6. 无需RQ参与
  7. 可选ACK(取决于模式)

特点:

  • 无Receive WQE依赖
  • 无CPU参与
  • 单向高带宽路径

第10章 RDMA Read流程

Read为双向事务。

text 复制代码
Requester → Read Request
Responder → Read Response

流程:

  1. 发READ REQUEST
  2. Responder解析RETH
  3. 执行DMA READ
  4. 生成RESPONSE
  5. 返回数据

特点:

  • 需要outstanding tracking
  • 性能低于WRITE
  • 用于数据拉取场景

第11章 ICRC校验机制

ICRC用于端到端数据完整性。

text 复制代码
Width: 32-bit

位置:

text 复制代码
Packet End

计算范围:

text 复制代码
BTH → Payload

不包含:

  • Ethernet header
  • IP header
  • UDP header

流程:

text 复制代码
Sender: Compute ICRC → Append
Receiver: Recompute → Compare

失败:

text 复制代码
Drop Packet

第12章 总结(协议核心抽象)

RoCEv2协议本质可以抽象为:

text 复制代码
              +---------------------+
              | RDMA Transport      |
              | (IB Semantics)      |
              +---------------------+
                         ↓
              +---------------------+
              | BTH + PSN + QP      |
              +---------------------+
                         ↓
              +---------------------+
              | Reliable Engine     |
              | ACK / NAK / Retry   |
              +---------------------+
                         ↓
              +---------------------+
              | Memory Semantics    |
              | Read / Write / Atom |
              +---------------------+
                         ↓
              +---------------------+
              | UDP/IP/Ethernet     |
              +---------------------+

RoCEv2的关键不是"网络封装",而是:

  • QP状态机
  • PSN可靠传输
  • BTH解析
  • RETH地址访问
  • ACK/NAK控制
  • Retry机制
  • ICRC完整性校验

这些才是 RNIC / DPU / RDMA IP 的核心设计点。

第13章 RC可靠传输完整语义(Protocol Level)

RC(Reliable Connection)是 RoCEv2 中唯一提供"类似TCP可靠性"的传输模式,但其实现方式完全不同于TCP。

TCP依赖:

  • Sliding Window
  • ACK Clocking
  • 重传缓冲区

RC依赖:

text 复制代码
PSN + ACK/NAK + Retry + QP Context

13.1 RC可靠性模型

RC的可靠性由三个核心机制构成:

机制1:PSN序列一致性

每个Packet携带24-bit PSN:

text 复制代码
Send PSN = NextPSN++

接收端维护:

text 复制代码
Expected PSN

机制2:ACK确认(累积确认)

RC采用 cumulative ACK

text 复制代码
ACK(x) = 所有PSN ≤ x 已正确接收

例如:

text 复制代码
RX: 100 101 102
→ ACK(102)

不是逐包ACK,而是累计确认。


机制3:NAK触发重传

当检测异常时,立即触发NAK:

类型 含义
SEQ NAK PSN缺失
RNR NAK 接收端无资源
Access Error R_Key非法

13.2 RC与TCP的本质区别

项目 TCP RC
传输单位 Byte Stream Packet
序列号 Byte Seq Packet Seq
重传 Segment Packet
ACK per byte cumulative PSN
拥塞控制 必需 可选(DCQCN/PFC)
处理位置 Kernel NIC Hardware

关键差异:

text 复制代码
TCP = 软件协议栈
RC  = 硬件状态机

第14章 RDMA Write深度语义

Write是RoCEv2中最重要的数据路径。


14.1 Write基本语义

text 复制代码
Requester → Responder Memory

特点:

  • 单向
  • 无RQ依赖
  • 无CPU参与
  • 可批量pipeline

14.2 WRITE Packet结构

text 复制代码
BTH
RETH
Payload
ICRC

RETH包含:

字段 含义
VA Remote Virtual Address
R_Key Access Key
Length DMA长度

14.3 Write执行流程(硬件视角)

RNIC执行流程:

text 复制代码
1. Parse BTH
2. Lookup QP Context
3. Validate PSN
4. Parse RETH
5. R_Key Check
6. MR Lookup
7. Address Translation
8. DMA Engine Write
9. Optional ACK generation

14.4 Write分片(Segmentation)

当Payload > MTU:

text 复制代码
WRITE_FIRST
WRITE_MIDDLE
WRITE_LAST

规则:

  • FIRST:携带RETH
  • MIDDLE:仅Payload
  • LAST:结束标记

14.5 Write异常模型

1. R_Key错误

text 复制代码
→ Access Error NAK

2. 地址越界

text 复制代码
→ Drop / Error Completion

3. PSN mismatch

text 复制代码
→ SEQ NAK

第15章 RDMA Read深度语义

Read是"请求-响应型"事务。


15.1 Read基本结构

text 复制代码
Requester → READ REQUEST
Responder → READ RESPONSE

15.2 READ REQUEST结构

text 复制代码
BTH
RETH

RETH定义:

  • Remote VA
  • R_Key
  • Length

15.3 READ RESPONSE结构

text 复制代码
BTH
AETH
Payload
ICRC

15.4 Read执行流程

Responder侧:

text 复制代码
1. Parse Request
2. Validate R_Key
3. Address Translation
4. DMA Read
5. Generate Response
6. Return Payload

15.5 Outstanding Read机制

RNIC必须维护:

text 复制代码
Outstanding Read Table

包含:

  • Request PSN
  • QP ID
  • Buffer pointer
  • Timeout timer

15.6 Read异常

1. Response丢失

→ Retry Request

2. 超时

→ QP Error State

3. R_Key错误

→ Access Error


第16章 RDMA Atomic语义

Atomic操作用于分布式同步。


16.1 支持类型

text 复制代码
FETCH_ADD
COMPARE_SWAP

16.2 Compare & Swap

语义:

text 复制代码
if (mem == compare)
    mem = swap;

16.3 Fetch & Add

语义:

text 复制代码
old = mem;
mem = mem + value;
return old;

16.4 Atomic执行流程

text 复制代码
1. Parse BTH
2. Parse AtomicETH
3. Validate R_Key
4. Read Memory
5. Compare/Compute
6. Write Back
7. Return Result

第17章 QP Context硬件结构

QP是RNIC核心数据结构。


17.1 QP Context内容

典型字段:

text 复制代码
QP State
Send PSN
Expected PSN
Retry Counter
RNR Timer
Retry Timer
P_Key
MTU
Path Info

17.2 QP状态机

text 复制代码
RESET → INIT → RTR → RTS → ERROR

17.3 状态含义

RESET

未配置

INIT

本地初始化

RTR

可接收

RTS

可发送

ERROR

不可恢复错误


17.4 QP Context访问路径

text 复制代码
Packet → QP Lookup → Context SRAM → Pipeline

第18章 PSN窗口与重传机制


18.1 PSN窗口模型

RNIC内部维护:

text 复制代码
Send Window:
    [Base PSN → Next PSN]

18.2 ACK推进窗口

text 复制代码
ACK received → Base PSN move forward

18.3 重传触发条件

  • ACK timeout
  • SEQ NAK
  • RNR NAK retry expired

18.4 重传行为

text 复制代码
Resend from Missing PSN

第19章 RNR机制(接收端资源控制)


19.1 RNR定义

Receiver Not Ready:

text 复制代码
RQ为空

19.2 行为

接收端返回:

text 复制代码
RNR NAK

发送端:

text 复制代码
Wait + Retry Timer

19.3 RNR Timer

关键参数:

  • RNR timeout
  • exponential backoff

第20章 ICRC完整性机制(协议级)


20.1 ICRC作用范围

覆盖:

text 复制代码
BTH + Payload + Extended Header

20.2 计算方式

发送端:

text 复制代码
ICRC = CRC32(packet)
append

接收端:

text 复制代码
recompute → compare

20.3 错误处理

  • mismatch → drop packet
  • no retry at ICRC layer(由RC负责)

第21章 协议整体抽象模型

RoCEv2可以抽象为四层状态机叠加:

text 复制代码
+----------------------+
| Application Semantics|
+----------------------+
| RDMA Operations      |
| Read / Write / Atom  |
+----------------------+
| Reliable Transport   |
| PSN / ACK / Retry    |
+----------------------+
| Packet Transport     |
| BTH / RETH / AETH    |
+----------------------+
| Network Layer        |
| UDP / IP / Ethernet  |
+----------------------+

21.1 核心本质总结

RoCEv2不是网络协议扩展,而是:

text 复制代码
一个硬件实现的可靠分布式内存访问协议

其核心机制:

  • QP(连接抽象)
  • PSN(可靠序列)
  • BTH(协议控制)
  • RETH(地址语义)
  • ACK/NAK(可靠性)
  • Retry(容错)
  • ICRC(完整性)

21.2 工程本质

从芯片角度:

text 复制代码
RoCEv2 = DMA Engine + State Machine + Packet Parser + Retry Logic

从验证角度:

text 复制代码
RoCEv2 = Sequence correctness + Ordering + Error recovery + Data integrity

第22章 RNIC硬件架构(RoCEv2实现视角)

RoCEv2在芯片中的实现主体是RNIC(RDMA Network Interface Controller),其本质是一个协议处理 + 内存访问 + 可靠性状态机 + DMA调度器的组合系统。

从硬件结构看,典型RNIC可抽象为:

text 复制代码
        +--------------------------+
        |   Packet Parser         |
        +--------------------------+
                    ↓
        +--------------------------+
        |   QP Context Lookup     |
        +--------------------------+
                    ↓
        +--------------------------+
        |   Transport Engine      |
        | (PSN/ACK/NAK/Retrans)   |
        +--------------------------+
                    ↓
        +--------------------------+
        |   RDMA Engine           |
        | (Read/Write/Atomic)     |
        +--------------------------+
                    ↓
        +--------------------------+
        |   DMA Engine            |
        +--------------------------+
                    ↓
        +--------------------------+
        |   Memory Subsystem      |
        +--------------------------+

第23章 Packet Parser(协议入口)

Packet Parser是RNIC第一阶段逻辑,负责从以太网输入流中提取RoCEv2协议字段。


23.1 解析层级

解析顺序:

text 复制代码
Ethernet → IP → UDP → BTH → Extended Header → Payload

23.2 UDP识别逻辑

RoCEv2识别条件:

text 复制代码
if (UDP.DstPort == 4791)
    packet_type = ROCEV2

23.3 Parser输出结构

Parser输出通常为内部descriptor:

text 复制代码
struct roce_desc {
    opcode;
    qp_num;
    psn;
    pkey;
    extended_type;
    payload_ptr;
}

23.4 Parser关键挑战

1. 多层解复用

必须支持:

  • IPv4 / IPv6
  • VLAN tag
  • Jumbo frame

2. Zero-copy解析

不能复制payload,仅生成指针。


3. Pipeline吞吐

通常要求:

text 复制代码
1 packet / cycle (or multi-lane)

第24章 QP Context Lookup Engine

QP Lookup是RNIC核心瓶颈之一。


24.1 QP索引方式

QP Number:

text 复制代码
24-bit QP ID

24.2 Lookup结构

通常使用:

SRAM Table

text 复制代码
QP_Context[QP_NUM]

Cache结构(高端NIC)

  • QP Cache
  • Hash Table
  • CAM(用于快速匹配)

24.3 Context内容

QP Context典型字段:

text 复制代码
Send PSN
Expected PSN
Retry Counter
RNR State
QP State
P_Key
MTU
Path Info
Memory Keys

24.4 Lookup输出

输出给Transport Engine:

text 复制代码
QP Context + Packet Descriptor

第25章 PSN处理引擎(核心可靠性模块)


25.1 PSN Compare逻辑

text 复制代码
if (rx_psn == expected_psn)
    ACCEPT
else if (rx_psn < expected_psn)
    DUPLICATE
else
    GAP DETECTED

25.2 三种关键路径

1. 正常序列

text 复制代码
100 → 101 → 102

→ expected++


2. 重复包

text 复制代码
101 again

→ drop


3. 丢包检测

text 复制代码
100 → 102

→ generate SEQ NAK


25.3 PSN窗口结构

RNIC维护:

text 复制代码
BasePSN
NextExpectedPSN
RetryPSN

25.4 PSN wrap问题

24-bit PSN:

text 复制代码
0xFFFFFF → 0x000000

必须处理:

  • wrap-around compare
  • modular arithmetic

第26章 ACK/NAK生成引擎


26.1 ACK生成条件

ACK触发:

  • 连续PSN正确
  • WQE完成
  • 消息边界结束

26.2 ACK类型

text 复制代码
ACK(x)

表示:

text 复制代码
所有 ≤ x 的PSN已接收

26.3 NAK生成逻辑

SEQ NAK

text 复制代码
missing PSN detected

RNR NAK

text 复制代码
RQ empty

Access Error

text 复制代码
invalid R_Key

26.4 ACK发送路径

text 复制代码
Transport Engine → UDP TX → Network

第27章 RDMA Write Engine(DMA路径核心)


27.1 Write执行路径

text 复制代码
Packet → RETH → Memory Write

27.2 DMA流程

text 复制代码
1. Parse RETH
2. Validate R_Key
3. Translate Address
4. Burst DMA Write
5. Update Completion

27.3 Write优化结构

Scatter-Gather DMA

支持:

text 复制代码
non-contiguous memory

Write coalescing

多个小包合并写:

text 复制代码
WRITE aggregation

第28章 RDMA Read Engine(请求-响应路径)


28.1 Read Request处理

text 复制代码
store request in outstanding table

28.2 Read Response生成

text 复制代码
DMA READ → generate response packet

28.3 Outstanding Table

结构:

text 复制代码
{
    QP,
    PSN,
    addr,
    length,
    timer
}

28.4 超时机制

text 复制代码
if timeout:
    retry or error

第29章 Atomic Execution Engine


29.1 Atomic特点

必须满足:

  • 原子性
  • 不可中断
  • 顺序一致

29.2 硬件实现方式

通常采用:

Lock-based

text 复制代码
memory lock

Pipeline serialization

text 复制代码
atomic queue

29.3 CAS流程

text 复制代码
read → compare → write

第30章 Retry FSM(可靠性核心状态机)


30.1 Retry触发

text 复制代码
ACK timeout
NAK received
RNR retry

30.2 FSM结构

text 复制代码
IDLE
 ↓
WAIT_ACK
 ↓
RETRY
 ↓
BACKOFF

30.3 Retry窗口

RNIC维护:

text 复制代码
RetryBuffer[PSN]

30.4 最大重试限制

text 复制代码
RetryCount > threshold → QP ERROR

第31章 ICRC硬件实现


31.1 CRC计算范围

text 复制代码
BTH + Payload + Extended Header

31.2 硬件实现方式

LFSR结构

text 复制代码
CRC32 polynomial engine

31.3 pipeline计算

text 复制代码
per-cycle streaming CRC update

31.4 校验失败处理

text 复制代码
drop packet

第32章 RNIC完整数据流模型


32.1 RX路径

text 复制代码
Ethernet RX
 → Parser
 → QP Lookup
 → Transport Engine
 → RDMA Engine
 → DMA Write

32.2 TX路径

text 复制代码
DMA Read
 → RDMA Engine
 → Packet Builder
 → UDP/IP
 → Ethernet TX

RoCEv2中的 CQ / WQ / QP 机制解析


1. 概念总览

在 RoCEv2 / InfiniBand 架构中,核心执行单元围绕三类结构展开:

  • QP(Queue Pair):连接与状态机实体
  • WQ(Work Queue):任务提交队列(SQ + RQ)
  • CQ(Completion Queue):完成事件队列

三者关系可以概括为:

QP = SQ + RQ + 状态机

WQ = SQ + RQ

CQ = completion event collector


2. QP(Queue Pair)

2.1 定义

QP 是 RDMA 通信的基本连接单元,表示一条逻辑通信通道。

它不是单一队列,而是一个"通信上下文容器":

  • Send Queue(SQ)
  • Receive Queue(RQ)
  • QP Context(状态机 + 配置)

2.2 QP本质

QP 的本质是:

连接 + 状态机 + 可靠性控制 + 权限控制

它维护:

  • PSN(Packet Sequence Number)
  • QP State(RESET / INIT / RTR / RTS / ERROR)
  • Retry counter
  • RNR state
  • MTU
  • P_Key
  • Memory access权限

2.3 QP状态机

RESET → INIT → RTR → RTS → ERROR

  • RESET:未初始化
  • INIT:本地配置完成
  • RTR:Ready to Receive
  • RTS:Ready to Send
  • ERROR:不可恢复错误

2.4 QP作用

QP 绑定:

  • 通信对端 QP
  • PSN序列一致性
  • RDMA权限(R_Key / P_Key)
  • 可靠性状态机

3. WQ(Work Queue)

3.1 定义

WQ(工作队列)是 RNIC 执行任务的入口队列。

严格来说:

WQ = SQ + RQ


3.2 WQE(Work Queue Entry)

WQ 中的基本执行单元是 WQE:

WQE = Work Queue Entry

典型内容:

  • opcode(SEND / WRITE / READ / ATOMIC)
  • buffer address
  • length
  • rkey
  • local/remote metadata

3.3 WQ执行模型

WQ 是"任务驱动模型":

CPU / Driver

Post WQE

RNIC fetch WQE

执行 RDMA 操作


4. SQ(Send Queue)

4.1 定义

SQ 用于发送 RDMA 请求。

属于:

Outbound queue


4.2 SQ WQE内容

典型 SEND/WRITE WQE:

  • opcode
  • local buffer pointer
  • remote address
  • rkey
  • length

4.3 SQ执行流程

SQ WQE

Transport Engine

Packetization (BTH + RETH)

UDP/IP/Ethernet TX


4.4 SQ特点

  • CPU写入
  • RNIC消费执行
  • 同一QP内严格有序
  • 依赖 PSN 维护可靠性

5. RQ(Receive Queue)

5.1 定义

RQ 用于接收数据缓冲区管理。

属于:

Inbound buffer queue


5.2 RQ WQE内容

  • buffer address
  • buffer length
  • scatter-gather list(SGL)

5.3 RQ机制(关键点)

RDMA 是 post-receive 模型

必须提前准备 RQ WQE:

Driver → post receive buffer

否则:

RNR NAK (Receiver Not Ready)


5.4 RQ执行流程

RX Packet

RQ WQE match

DMA write payload

CQE generate


6. CQ(Completion Queue)

6.1 定义

CQ 用于通知:

RDMA 操作完成事件


6.2 CQE(Completion Queue Entry)

CQ中存放 CQE:

典型字段:

  • opcode
  • status
  • qp_num
  • byte_len
  • wr_id

6.3 CQ触发条件

产生 CQE 的事件:

  • SEND 完成
  • WRITE 完成(可选)
  • READ RESPONSE 完成
  • RECEIVE 完成(RQ消费)

6.4 CQ工作方式

RNIC执行完成

生成 CQE

写入 CQ SRAM

通知 driver / interrupt / polling


6.5 CQ本质

CQ 是:

完成事件队列(not data queue)


7. 三者关系(核心结构图)

复制代码
         +----------------------+
         |         QP          |
         |----------------------|
         | SQ        |   RQ     |
         +-----+-----+-----+----+
               |           |
               v           v
        SEND/WRITE     RECEIVE BUFFER
               \           /
                \         /
                 v       v
             Transport Engine
                     |
                     v
                   DMA
                     |
                     v
                  Memory
                     |
                     v
                CQ (CQE)

8. 三者职责对比

组件 作用 数据方向 本质
SQ 发送任务 outbound command queue
RQ 接收缓冲 inbound buffer descriptor queue
CQ 完成通知 event completion event queue
QP 连接实体 control state machine

9. 工程本质总结

从芯片 / RNIC 角度:

SQ

发什么(send command stream)

RQ

收到数据放哪里(DMA target descriptor)

CQ

完成了什么(event notification)

QP

连接 + 状态机 + 可靠性控制中心


10. 与传统 Socket 对比

RDMA结构 TCP/IP结构
SQ send()
RQ recv buffer
CQ completion interrupt
QP socket + TCP state

11. 一句话总结

QP = 连接与状态机

SQ = 发送任务队列

RQ = 接收缓冲队列

CQ = 完成事件队列