2、RoCE基础回顾:RoCEv1/v2协议栈、拥塞控制机制、无损网络需求

2.1 RoCE协议栈:从v1到v2的演进

RoCE(RDMA over Converged Ethernet)的核心思想是让RDMA能力跑在以太网上,从而复用以太网的生态与成本优势。理解RoCE必须先厘清其协议栈层次,尤其是v1与v2在网络层上的本质差异。

  • RoCEv1:基于以太网链路层(L2)承载IB GRH(Global Routing Header)+ IB BTH(Base Transport Header)。它要求收发双方处于同一二层广播域,不能跨VLAN路由,因此只能用于单数据中心内部的小规模无损域。
  • RoCEv2:在RoCEv1基础上引入UDP头(目的端口固定为4791)和IP头(L3),将IB报文封装进UDP/IPv4或UDP/IPv6。这使得RoCE可以跨三层路由,支持VXLAN等隧道叠加,成为当前DCB环境下的主流部署形态。

RoCEv2的报文封装顺序为:以太网头 → IP头 → UDP头(dport=4791) → IB BTH → 载荷。UDP头的引入不仅提供了多路复用能力,更重要的是让ECMP(等价多路径)能够基于五元组进行负载分担,从而提升带宽利用率。

关键点:RoCEv1是“二层RDMA”,RoCEv2是“三层可路由RDMA”。在DCB(Data Center Bridging)环境中,我们几乎只讨论RoCEv2,因为只有它才能支撑大规模、多路径、跨机房的部署。
RoCEv1 vs RoCEv2 协议栈对比 RoCEv1(L2 承载) 以太网头(Ethernet Header) IB GRH + IB BTH RDMA 载荷(Payload) ⚠ 限制 仅限同一二层域,不可跨VLAN路由 RoCEv2(L3/UDP 承载) 以太网头 IP 头(IPv4/IPv6) UDP 头(目的端口 4791) IB BTH RDMA 载荷 ✓ 能力 支持三层路由、ECMP负载均衡、跨DC部署 DCB 环境实际部署以 RoCEv2 为主

2.2 拥塞控制机制:从端到端到网络辅助

RoCE的拥塞控制分为端到端拥塞控制(ECC)和网络辅助拥塞控制两个层面。在DCB环境中,单纯依赖TCP式的端到端退避是不够的,因为RDMA要求极低的时延和零丢包。

2.2.1 DCQCN(Data Center Quantized Congestion Notification)

DCQCN是RoCEv2最常用的拥塞控制协议,它结合了QCN(Quantized Congestion Notification)和DCTCP(Data Center TCP)的思想。其核心流程如下:

  1. 拥塞检测:交换机检测到队列长度超过阈值后,以概率P对经过的RoCEv2报文打上ECN标记(在IP头中置CE位)。
  2. 反馈生成:接收端收到带ECN标记的报文后,向发送端发送CNP(Congestion Notification Packet)报文。CNP是一个特殊的RoCEv2报文,目的端口仍为4791,但BTH中的OpCode为CNP。
  3. 速率调整:发送端收到CNP后,将当前速率乘以一个因子(如0.5),并进入快速恢复阶段;若无后续CNP,则周期性执行增窗(Additive Increase)恢复速率。
实践要点:DCQCN的调参核心是ECN阈值(Kmin/Kmax)和CNP生成速率。阈值设置过小会导致频繁降速,浪费带宽;设置过大会造成交换机缓冲溢出丢包。通常建议Kmin设为交换机缓冲的30%~50%,Kmax设为Kmin的2~3倍。

2.2.2 PFC(Priority-based Flow Control)的辅助作用

PFC是DCB体系中的链路层流控,它按802.1p优先级(通常使用优先级3或4)对队列进行独立暂停。当接收端队列超过阈值时,发送PFC Pause帧通知对端暂停发送该优先级的流量。PFC与DCQCN的分工是:

  • PFC:逐跳、快速、粗粒度地防止丢包,是“最后一道防线”;
  • DCQCN:端到端、慢速、精细地调整发送速率,是“治本之策”。

两者必须配合使用:如果只有PFC没有DCQCN,拥塞会向上游扩散,形成PFC风暴(head-of-line blocking);如果只有DCQCN没有PFC,则在速率调整生效前就可能发生丢包。

2.3 无损网络需求:为什么RoCE离不开DCB

RoCEv2的IB传输层(RC服务)假设底层网络是无损的——即不丢包。一旦发生丢包,RoCE的Go-Back-N重传机制会触发大量重传,性能断崖式下降。因此,DCB环境必须提供以下三大能力:

DCB能力 对应标准 作用 典型配置
优先级流控 IEEE 802.1Qbb 按优先级提供无丢包通道 启用优先级3的PFC
增强传输选择 IEEE 802.1Qaz 带宽分配与调度 为RoCE分配30%带宽
DCBX协商 IEEE 802.1Qaz 自动协商DCB参数 交换机与网卡自动同步

值得注意的是,“无损”并不意味着网络永远不丢包,而是通过PFC将丢包转化为“暂停”,让上层协议有时间响应。真正的无损依赖端到端的拥塞控制(DCQCN)与逐跳的链路级流控(PFC)协同工作。

2.4 典型场景:RoCEv2在DCB中的部署形态

以一个典型的双机架场景为例,展示RoCEv2在DCB环境中的实际部署逻辑:

拓扑:服务器A(RoCEv2) → Leaf交换机1 → Spine交换机 → Leaf交换机2 → 服务器B(RoCEv2)

关键配置:
1. 所有交换机端口启用DCBX,协商PFC优先级=3,ETS带宽分配=30%
2. Leaf交换机上配置ECN阈值:Kmin=200KB, Kmax=400KB
3. 服务器网卡启用DCQCN,设置CNP生成间隔=10μs
4. 确认UDP端口4791未被ACL或安全策略阻断

在此场景中,当服务器A向服务器B发送大流量时,Leaf2的出口队列可能发生拥塞。此时Leaf2会:

  1. 对经过的RoCEv2报文打上ECN标记(CE=1);
  2. 服务器B收到ECN标记后,向服务器A发送CNP报文;
  3. 服务器A收到CNP后,将发送速率减半,并进入快速恢复;
  4. 若拥塞持续,Leaf2的PFC阈值触发,向Leaf1发送Pause帧,逐跳反压。
常见误区:很多初学者认为“只要启用了PFC,RoCE就不会丢包”。实际上,PFC只能防止因缓冲溢出导致的丢包,无法解决路由黑洞、ECMP哈希不均、网卡故障等问题。此外,PFC本身也可能引发死锁——当多个优先级的Pause帧互相等待时,网络会陷入停滞。因此,必须同时部署DCQCN并合理规划PFC优先级数量(建议不超过2个无损优先级)。

2.5 复盘:RoCE部署中的关键检查清单

在进入后续章节的DCB深度调优之前,请确认以下基础项已满足:

  • 所有交换机端口和网卡均支持并启用了DCBX(IEEE 802.1Qaz);
  • PFC优先级在整条数据路径上保持一致(包括VLAN翻译场景);
  • ECN功能在IP层启用(RoCEv2依赖IP头ECN位);
  • UDP端口4791在所有中间设备上未被过滤;
  • MTU设置一致(建议9000字节巨型帧,减少报文数量);
  • 确认无损队列的缓冲分配足够(建议至少200KB/端口)。