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的流控语义,拥塞控制必须依赖更上层的机制。
3.2 RoCEv2报文格式与封装结构
RoCEv2报文采用分层封装结构,从外到内依次为:以太网头、IP头、UDP头、IB BTH(Base Transport Header)、IB Payload(包含L4头和数据)、ICRC(Invariant CRC)、FCS。下图展示了RoCEv2报文在数据链路层和网络层的完整封装视图:
上图中需要特别关注三个字段: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)分别位于两个不同子网,中间通过三层交换机/路由器连接。通信流程如下:
- 主机A的RDMA应用发起Send操作,NIC将数据封装为RoCEv2报文:源IP=10.0.1.10,目的IP=10.0.2.20,源UDP端口=哈希(QP号),目的UDP端口=4791。
- 报文到达交换机1(接入层),交换机识别目的IP不在本子网,执行三层路由转发,将报文发往网关。
- 核心路由器根据路由表将报文转发至主机B所在子网。若路由器出口队列发生拥塞,且队列长度超过Kmin阈值,路由器将报文DSCP字段标记为CE(ECN=11)。
- 主机B的NIC收到带CE标记的报文后,解析出源QP号,生成CNP报文发送给主机A。CNP报文的目的IP为主机A的IP,目的UDP端口为4791,但BTH中的OpCode为CNP类型。
- 主机A收到CNP后,DCQCN算法将当前速率乘以(1-α/2),其中α为拥塞因子,初始值为1。随后启动定时器,在恢复阶段逐步增加速率。
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对低延迟的严格要求。
rdma ping 或 ib_write_bw 工具可快速验证连通性和带宽。