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设计目标非常明确:
- 低延迟(Low Latency)
- 高吞吐(High Throughput)
- 硬件可实现(Hardware Friendly)
- 可靠传输(Reliable Delivery)
- 支持零拷贝(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
流程:
- 发送WRITE请求
- RNIC解析RETH
- 校验R_Key
- 查MR地址
- DMA写入
- 无需RQ参与
- 可选ACK(取决于模式)
特点:
- 无Receive WQE依赖
- 无CPU参与
- 单向高带宽路径
第10章 RDMA Read流程
Read为双向事务。
text
Requester → Read Request
Responder → Read Response
流程:
- 发READ REQUEST
- Responder解析RETH
- 执行DMA READ
- 生成RESPONSE
- 返回数据
特点:
- 需要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 = 完成事件队列