3. RoCEv2协议详解:报文格式、封装结构、路由与拥塞控制的关系

3.1 RoCEv2的诞生背景与协议定位

RoCE(RDMA over Converged Ethernet)v1版本将IB(InfiniBand)的报文直接封装在以太网链路层中,使用以太网类型字段0x8915标识。这种设计虽然延迟极低,但只能在二层网络中运行,无法跨越IP子网,严重限制了RDMA技术的可扩展性。RoCEv2(也称为IBoE,InfiniBand over Ethernet)则改变了封装策略:将IB数据报文封装在UDP/IPv4或UDP/IPv6报文之中,从而实现了三层路由能力。

RoCEv2的核心设计目标是在保留RDMA高带宽、低延迟、低CPU开销优势的同时,让报文能够像普通TCP/IP流量一样被传统交换机、路由器处理和转发。这一改变使得RoCEv2可以跨越数据中心的不同子网,甚至通过WAN连接多个数据中心,但也引入了新的问题——UDP封装使得网络设备无法直接感知RDMA的流控语义,拥塞控制必须依赖更上层的机制。

关键认知:RoCEv2不是简单的“IB over UDP”,而是将IB传输层(RC、UC、UD)的语义完整保留,仅将链路层承载方式从IB专属链路替换为UDP/IP网络。因此,IB协议中成熟的可靠连接(RC)、不可靠连接(UC)、不可靠数据报(UD)服务类型,以及基于信用(Credit)的接收端流控机制,都原样保留在RoCEv2中。

3.2 RoCEv2报文格式与封装结构

RoCEv2报文采用分层封装结构,从外到内依次为:以太网头、IP头、UDP头、IB BTH(Base Transport Header)、IB Payload(包含L4头和数据)、ICRC(Invariant CRC)、FCS。下图展示了RoCEv2报文在数据链路层和网络层的完整封装视图:

RoCEv2 报文封装结构(L2-L4) 以太网头 (Ethernet Header) 目的MAC (6B) | 源MAC (6B) | 可选VLAN Tag (4B) | EtherType = 0x0800 (IPv4) IP头 (IP Header) 版本/IHL | DSCP (用于ECN标记) | 总长度 | 协议 = 17 (UDP) | 源IP | 目的IP UDP头 (UDP Header) 源端口 (由QP号计算) | 目的端口 = 4791 (RoCEv2保留端口) | UDP长度 | UDP校验和 IB BTH (Base Transport Header, 12字节) OpCode (8b) | SE (1b) | M (1b) | Pad (6b) | TVer (8b) | P_Key (16b) | Dest QP (24b) | A (1b) | 保留 (7b) IB Payload (L4头 + 数据) RETH/RDMA头 (可选) | 数据段 (0~2^31字节) | ICRC (4B, 仅覆盖IB报文部分) 封装方向 关键点:UDP目的端口固定为4791;源端口由QP号经哈希计算得出,用于交换机负载均衡;DSCP字段承载ECN标记 ICRC仅覆盖IB BTH+Payload,以太网FCS覆盖整个报文——两者校验范围不同,需区分。

上图中需要特别关注三个字段:UDP目的端口4791是RoCEv2的IANA注册端口,网络设备可据此识别RoCEv2流量;UDP源端口由QP号(Queue Pair Number)通过哈希函数生成,目的是让交换机的ECMP(等价多路径)哈希能够将不同QP的流量分散到不同物理链路上;DSCP字段用于承载ECN(Explicit Congestion Notification)标记,这是RoCEv2实现拥塞通知的基础。

3.3 路由与拥塞控制的关联机制

RoCEv2引入IP路由后,拥塞控制面临的核心挑战是:传统IP网络只提供“尽力而为”的转发,没有IB网络中端到端的基于信用的流控。IB网络通过链路层的流控机制(Link-level Flow Control)确保不丢包,而RoCEv2跨越IP网络时,中间路由器可能因缓冲不足而丢包。RDMA协议对丢包极其敏感——一个丢包可能导致整个QP(Queue Pair)连接中断,重传开销远高于TCP。

因此,RoCEv2的拥塞控制必须依赖以下三个层面的协同:

  • ECN(显式拥塞通知):交换机检测到队列长度超过阈值时,在IP头的DSCP字段中标记CE(Congestion Experienced)位,而非直接丢包。接收端NIC感知到CE标记后,通过CNP(Congestion Notification Packet)报文反馈给发送端。
  • CNP(拥塞通知报文):接收端生成的二层控制报文,携带拥塞QP信息,发送给发送端。CNP本身是RoCEv2报文,但使用独立的QP号(QP0),优先级最高。
  • 发送端速率调整:发送端NIC收到CNP后,按照DCQCN(Data Center Quantized Congestion Notification)算法降低发送速率,并在恢复时间后逐步提升。
机制 工作层次 作用 关键参数
ECN标记 IP层(交换机) 早期拥塞通知 Kmin/Kmax阈值
CNP反馈 传输层(接收端NIC) 向发送端报告拥塞 CNP生成间隔
DCQCN速率控制 传输层(发送端NIC) 降速与恢复 α、g、timer周期

3.4 典型场景:跨子网RoCEv2通信

假设主机A(10.0.1.10)与主机B(10.0.2.20)分别位于两个不同子网,中间通过三层交换机/路由器连接。通信流程如下:

  1. 主机A的RDMA应用发起Send操作,NIC将数据封装为RoCEv2报文:源IP=10.0.1.10,目的IP=10.0.2.20,源UDP端口=哈希(QP号),目的UDP端口=4791。
  2. 报文到达交换机1(接入层),交换机识别目的IP不在本子网,执行三层路由转发,将报文发往网关。
  3. 核心路由器根据路由表将报文转发至主机B所在子网。若路由器出口队列发生拥塞,且队列长度超过Kmin阈值,路由器将报文DSCP字段标记为CE(ECN=11)。
  4. 主机B的NIC收到带CE标记的报文后,解析出源QP号,生成CNP报文发送给主机A。CNP报文的目的IP为主机A的IP,目的UDP端口为4791,但BTH中的OpCode为CNP类型。
  5. 主机A收到CNP后,DCQCN算法将当前速率乘以(1-α/2),其中α为拥塞因子,初始值为1。随后启动定时器,在恢复阶段逐步增加速率。
实践要点:在跨子网RoCEv2部署中,务必确保所有中间路由器都支持ECN标记,且DSCP值在整条路径上保持一致。若某台设备不支持ECN,拥塞信号将中断,发送端无法感知拥塞,最终导致丢包和QP超时。

3.5 常见误区与复盘

误区一:认为RoCEv2的UDP校验和可以省略。实际上,RoCEv2规范要求UDP校验和必须启用(UDP Checksum=1)。如果关闭校验和,IP层或交换机可能因校验错误而丢弃报文,且NIC无法检测数据损坏。在高速网络中,校验和计算由硬件完成,不会带来额外CPU开销。

误区二:混淆ICRC与FCS的校验范围。ICRC(Invariant CRC)只覆盖IB BTH和Payload部分,用于保证IB报文在端到端传输中的完整性;而FCS(Frame Check Sequence)由以太网硬件计算,覆盖整个以太网帧。当报文经过路由器时,FCS会被重新计算,但ICRC保持不变——这正是“Invariant”的含义。

误区三:忽视P_Key(分区键)的作用。P_Key用于IB网络中的分区隔离,RoCEv2同样保留该字段。若两端QP的P_Key不匹配,报文将被静默丢弃。在跨子网场景中,P_Key必须预先配置一致,否则即使网络连通,RDMA通信也会失败。

误区四:将RoCEv2的拥塞控制等同于TCP的拥塞控制。RoCEv2的DCQCN是基于ECN反馈的速率控制,而非基于丢包的窗口调整。TCP在丢包后线性减窗,而DCQCN在收到CNP后立即将速率减半(乘性减),恢复过程则采用加性增——这种“快减慢增”策略更适合RDMA对低延迟的严格要求。

排障提示:当RoCEv2跨子网通信出现性能骤降时,优先检查:①中间设备是否支持ECN(show interface 查看ECN标记计数);②UDP目的端口4791是否被ACL过滤;③DSCP值是否在整条路径保持一致;④两端NIC的P_Key配置是否一致。使用 rdma ping 或 ib_write_bw 工具可快速验证连通性和带宽。