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(等价多路径)能够基于五元组进行负载分担,从而提升带宽利用率。
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)的思想。其核心流程如下:
- 拥塞检测:交换机检测到队列长度超过阈值后,以概率P对经过的RoCEv2报文打上ECN标记(在IP头中置CE位)。
- 反馈生成:接收端收到带ECN标记的报文后,向发送端发送CNP(Congestion Notification Packet)报文。CNP是一个特殊的RoCEv2报文,目的端口仍为4791,但BTH中的OpCode为CNP。
- 速率调整:发送端收到CNP后,将当前速率乘以一个因子(如0.5),并进入快速恢复阶段;若无后续CNP,则周期性执行增窗(Additive Increase)恢复速率。
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会:
- 对经过的RoCEv2报文打上ECN标记(CE=1);
- 服务器B收到ECN标记后,向服务器A发送CNP报文;
- 服务器A收到CNP后,将发送速率减半,并进入快速恢复;
- 若拥塞持续,Leaf2的PFC阈值触发,向Leaf1发送Pause帧,逐跳反压。
2.5 复盘:RoCE部署中的关键检查清单
在进入后续章节的DCB深度调优之前,请确认以下基础项已满足:
- 所有交换机端口和网卡均支持并启用了DCBX(IEEE 802.1Qaz);
- PFC优先级在整条数据路径上保持一致(包括VLAN翻译场景);
- ECN功能在IP层启用(RoCEv2依赖IP头ECN位);
- UDP端口4791在所有中间设备上未被过滤;
- MTU设置一致(建议9000字节巨型帧,减少报文数量);
- 确认无损队列的缓冲分配足够(建议至少200KB/端口)。