3. RDMA协议栈解析:InfiniBand、RoCEv2与iWARP的层次与报文
3.1 三种协议栈的定位与核心差异
RDMA并非单一协议,而是指远程直接内存访问这一类能力。真正决定报文如何封装、路由如何完成、可靠性如何保证的,是底层的传输协议。当前主流的三种协议——InfiniBand(IB)、RoCEv2(RDMA over Converged Ethernet version 2)和iWARP——分别代表了“专用网络”“融合网络”和“通用TCP网络”三条技术路线。理解它们的协议层次差异,是进行端到端性能调优的前提。
三种协议最大的区别在于网络层与链路层的归属:
- InfiniBand:拥有完整的自有协议栈,从链路层到传输层均为IB规范定义,需要专用交换机与HCA(Host Channel Adapter)卡。
- RoCEv2:将IB的报文格式(IBA Global Routing Header,GRH)封装在UDP/IPv4或IPv6报文中,复用标准以太网交换机,但要求无损以太网(PFC/ECN)支持。
- iWARP:直接使用TCP/IP协议栈,将RDMA语义映射到TCP连接上,兼容性最好,但性能受限于TCP/IP协议栈的处理开销。
3.2 InfiniBand协议层次与报文结构
InfiniBand的报文结构是理解RDMA封装的基石。一个完整的IB报文由多个头(Header)与载荷(Payload)组成,其层次关系如下:
| LRH (8B) | GRH (40B, 可选) | BTH (12B) | 扩展头 (ETH, 可选) | Payload (0~4KB) | ICRC (4B) | VCRC (2B) |
- LRH(Local Routing Header):8字节,包含源/目的LID(Local Identifier)、VL(Virtual Lane)和SL(Service Level)。LID用于子网内交换机转发,VL用于流量隔离,SL映射到服务等级。
- GRH(Global Routing Header):40字节,仅在跨子网通信时存在,包含128位源/目的GID(Global Identifier)。GID由子网前缀+端口GUID构成,相当于IB世界的“IP地址”。
- BTH(Base Transport Header):12字节,是传输层的核心。包含OpCode(操作码,如RDMA Write/Read/Send)、目的QP号(Dest QP)、PSN(Packet Sequence Number,包序号)等。PSN是IB可靠传输实现乱序重组与重传的关键字段。
- ICRC/VCRC:分别用于校验报文不变部分与可变部分,保证数据完整性。
3.3 RoCEv2报文封装:IB语义与UDP的融合
RoCEv2的核心设计思想是:保留IB的传输层语义(BTH),但将网络层替换为UDP/IP。这样既继承了IB高效的QP/可靠性机制,又能利用标准以太网交换机进行三层路由。其报文格式如下:
| 以太网头 (14B) | VLAN (可选) | IPv4/IPv6头 | UDP头 (8B) | GRH (40B) | BTH (12B) | Payload | ICRC | FCS |
关键字段说明:
- UDP目的端口固定为4791:这是RoCEv2的“协议标识”,交换机或网卡据此识别RoCE流量并应用无损策略。
- GRH仍然保留:虽然UDP/IP已提供路由信息,但GRH中的SGID(Source GID)和DGID(Destination GID)用于标识RDMA域内的端口,且GID中的Interface ID与MAC地址存在映射关系。
- BTH中的OpCode:与IB完全一致,支持RC(可靠连接)、UC(不可靠连接)、UD(不可靠数据报)等传输服务。
3.4 iWARP的层次映射与MPA机制
iWARP的协议栈最为“厚实”,因为它需要将RDMA语义映射到TCP之上。其层次结构为:
| 以太网头 | IP头 | TCP头 | MPA头 (2B) | DDP头 (3B) | RDMAP头 (1B) | Payload |
- RDMAP(RDMA Protocol):定义RDMA操作(Read/Write/Send),位于最上层。
- DDP(Direct Data Placement):负责将数据直接放置到对端用户指定的缓冲区,避免中间拷贝。DDP头中的MO(Message Offset)字段用于标识数据在消息中的位置。
- MPA(Marker PDU Aligned):解决TCP字节流与RDMA消息边界不对齐的问题。MPA在每个消息前插入2字节长度字段,并周期性插入Marker,使接收端能快速定位消息边界。
iWARP的最大优势是无需无损网络,因为TCP本身提供可靠传输和拥塞控制。但代价是:TCP的ACK机制、重传超时(RTO)和拥塞窗口(cwnd)调整会引入额外的延迟与CPU开销。在高速网络(25GbE以上)中,TCP协议栈的处理往往成为瓶颈。
3.5 报文格式对比与关键参数速查
| 对比维度 | InfiniBand | RoCEv2 | iWARP |
|---|---|---|---|
| 传输层头 | BTH (12B) | BTH (12B) | TCP头 + MPA/DDP/RDMAP |
| 网络层 | GRH (40B) | IPv4/IPv6 + UDP (4791) | IP |
| 链路层寻址 | LID (16bit) | MAC地址 | MAC地址 |
| 可靠性机制 | PSN + 重传(硬件) | PSN + 重传(硬件) | TCP序号 + 重传(软件/硬件) |
| 拥塞控制 | IB CC(可选) | ECN + DCQCN | TCP拥塞控制(CUBIC等) |
| 最大Payload | 4KB(经典)/ 8KB(扩展) | 同IB(受MTU限制) | 受TCP MSS限制(通常1460B) |
| CPU卸载程度 | 极高(全硬件) | 高(需网卡支持RoCE引擎) | 中(依赖TCP卸载引擎TOE) |
3.6 案例复盘:RoCEv2报文抓包分析
在一次RoCEv2性能问题排查中,通过抓包发现以下异常:
Frame 1: 1514 bytes on wire
Ethernet II, Src: 00:0c:29:a1:2b:44, Dst: 00:0c:29:7e:3d:11
Internet Protocol Version 4, Src: 192.168.1.10, Dst: 192.168.1.20
User Datagram Protocol, Src Port: 40000, Dst Port: 4791
Source Port: 40000
Destination Port: 4791
Length: 1472
InfiniBand
Base Transport Header
OpCode: RDMA WRITE (0x0a)
Dest QP: 0x000012
PSN: 0x3a2f1c
Payload: [前64字节为数据]
分析发现:源端口为40000(非固定),目的端口为4791(正确)。但PSN出现乱序,且伴随大量重复ACK。进一步检查发现,交换机上PFC(优先级流控)配置错误,导致RoCEv2流量与普通TCP流量共享同一优先级队列,在拥塞时RoCEv2报文被丢弃,触发重传。
3.7 协议栈选型与调优核心要点
在实际部署中,协议栈的选择往往由现有网络架构决定,但调优方向差异显著:
- IB网络:重点调优子网管理器(Subnet Manager)的路径计算、SL↔VL映射、以及自适应路由(Adaptive Routing)。
- RoCEv2:核心是构建无损以太网——配置PFC(建议使用DSCP-based PFC)、ECN阈值、以及DCQCN(数据中心量化拥塞通知)参数。
- iWARP:关注TCP参数(如MTU、窗口缩放、Nagle算法禁用)以及网卡TOE卸载能力是否开启。