RoCE基础:RoCEv1/v2协议原理、帧格式、与InfiniBand和TCP/IP的对比

核心原理:从InfiniBand到以太网的“借道”方案

RoCE(RDMA over Converged Ethernet)的核心思想,是把InfiniBand(IB)网络中成熟的RDMA传输语义——包括队列对(QP)、完成队列(CQ)、可靠连接(RC)等——原封不动地搬到以太网物理链路上来。它并不重新发明一套传输协议,而是让IB的报文头直接“骑”在以太网帧上,从而让原本为IB设计的RDMA软件栈(如libibverbs、Mellanox OFED)无需修改即可运行在以太网交换机组成的网络中。

RoCEv1与RoCEv2的关键差异在于“承载位置”:

  • RoCEv1:IB全局路由头(IB GRH)直接封装在以太网II帧的EtherType字段(0x8915)之后,没有IP层。它要求收发双方处于同一个二层广播域(VLAN),无法跨子网路由。
  • RoCEv2:在IB GRH之前插入UDP头(目的端口4791)和IPv4/IPv6头,EtherType变为0x0800(IPv4)。这使得RoCE报文可以被传统IP路由器转发,实现了三层可路由。
关键认知:RoCEv2本质上是“IB语义 + UDP封装 + 以太网承载”。UDP端口4791并非用于传输用户数据,而是作为协议多路复用标识,让交换机/网卡能识别这是RoCE流量并应用对应的流控与拥塞控制策略。
RoCEv1 vs RoCEv2 帧格式对比 RoCEv1(二层承载) 以太网头 DA/SA/Type=0x8915 IB GRH 40字节 IB BTH+扩展头 12~36字节 Payload 数据 ICRC 4B FCS 4B ⚠ 无IP层 → 仅限同一VLAN二层互通,无法跨子网路由 RoCEv2(三层承载) 以太网头 Type=0x0800 IP头 20~40B UDP头 dst=4791 IB GRH 40B IB BTH+ 12~36B Payload 数据 ICRC 4B FCS 4B ✓ 引入IP+UDP → 可跨三层路由,支持ECMP负载均衡 协议栈分层对比 IB 传输层(RC/UC/UD) IB 网络层(GRH) IB 链路层(L2) InfiniBand 原生协议栈 IB 传输层(RC/UC/UD) IB 网络层(GRH) UDP/IP 封装层 以太网 MAC/PHY RoCEv2 协议栈 替换 RoCEv1:IB GRH直接置于以太网头之后(EtherType=0x8915),无IP/UDP RoCEv2:IB GRH之前插入UDP(端口4791)+IP头,EtherType=0x0800,可路由

帧格式细节:RoCEv2报文逐字段拆解

以RoCEv2为例,一个完整的发送报文在网卡内部按以下顺序组装(以IPv4为例):

以太网头: 目的MAC(6B) | 源MAC(6B) | EtherType=0x0800(2B)
IP头:     版本/IHL | DSCP | 总长度 | 标识 | 标志/片偏移 | TTL | 协议=17(UDP) | 头校验和 | 源IP(4B) | 目的IP(4B)
UDP头:    源端口(由QP号哈希生成) | 目的端口=4791(2B) | UDP长度(2B) | UDP校验和(2B)
IB GRH:   IP版本=6 | 流量等级 | Payload长度 | 下一头=0x1B | 跳限 | 源GID(16B) | 目的GID(16B)
IB BTH:   操作码(Opcode) | 目的QP号(24bit) | 报文序号PSN(24bit) | 分区键P_Key(16bit)
IB扩展头: 可选(如原子操作、XRC等)
Payload:  用户数据(通常为4KB~8KB,受MTU限制)
ICRC:     4字节不变CRC,覆盖IB头+Payload
FCS:      以太网CRC,由MAC层硬件生成
实操提示:抓包时若看到UDP目的端口为4791,即可判定为RoCEv2流量。源端口并非固定值,而是由QP号(Queue Pair Number)经哈希生成,用于在ECMP(等价多路径)场景下让不同QP的流量散列到不同物理链路上。

三协议对比:RoCE、InfiniBand与TCP/IP

维度 InfiniBand RoCEv2 TCP/IP
物理层 IB专用线缆/交换机 标准以太网(25/100/400G) 标准以太网
网络层 IB本地路由(LID/GID) IP路由(可跨三层) IP路由
传输层 IB传输(RC/UC/UD) IB传输(RC/UC/UD) TCP(可靠字节流)
数据搬运方式 RDMA(内核旁路) RDMA(内核旁路) send/recv(内核参与)
端到端延迟 ~0.7µs ~1.2µs(同DC内) ~10µs+(软件开销)
CPU卸载 完全卸载 完全卸载 依赖TSO/LRO等部分卸载
拥塞控制 IB CC(基于FECN/BECN) DCQCN / 自适应路由 TCP拥塞控制(CUBIC/BBR)
流控机制 链路级流控(信用机制) 以太网PFC(优先级流控) 滑动窗口(端到端)
部署成本 高(专用硬件) 中(复用以太网) 低(无处不在)

典型场景与选型逻辑

在数据中心里,RoCEv2最常见的部署场景是存储网络(NVMe-oF)和高性能计算(HPC)中的消息传递接口(MPI)通信。以NVMe-oF为例,主机端通过RoCEv2网卡发起RDMA Read/Write操作,将远端NVMe SSD中的数据直接搬入本地内存,绕过了SCSI协议栈和内核网络栈,单盘读延迟可从TCP/IP方案的~100µs降至~20µs。

选型时通常遵循以下判断路径:

  1. 是否需要跨三层通信? 是→RoCEv2;仅二层→RoCEv1或RoCEv2均可。
  2. 交换机是否支持PFC和ECN? 是→可部署无损RoCE;否→需考虑RoCE性能下降风险。
  3. CPU资源是否紧张? 是→RoCE(内核旁路);否→TCP/IP可能更简单。
  4. 生态兼容性要求? 需要与现有IP网络统一管理→RoCEv2;可接受独立网络→IB。

误区与复盘:RoCE部署中的常见陷阱

误区一:RoCEv2“有IP头”就等于可以像TCP一样随意路由。
实际上RoCEv2依赖无损网络(PFC)或ECN标记来避免丢包。若中间路由器缓存不足或未启用ECN,一旦发生拥塞丢包,RoCE的可靠连接(RC)会触发重传,但重传超时(TO)通常以毫秒计,远高于TCP的微秒级快速重传,性能会断崖式下跌。
误区二:RoCEv1和RoCEv2可以混用。
两者EtherType不同,且RoCEv1无法通过IP路由。若同一VLAN内混有RoCEv1和RoCEv2设备,RoCEv1流量会被RoCEv2网卡当作未知EtherType丢弃,反之亦然。实际部署中必须统一协议版本。

复盘建议:在规划RoCE网络时,先用ibstat或rdma link show确认网卡当前模式(RoCEv1/v2),再用tcpdump -i eth0 udp port 4791抓包验证实际报文格式。若发现抓不到RoCE流量,优先检查网卡驱动是否加载了rdma_rxe或厂商专用驱动模块,以及交换机端口是否启用了PFC(优先级流控)和ECN(显式拥塞通知)。