从零读懂RoCEv2数据包构造:从WQE到线缆上的完整旅程

RoCEv2将InfiniBand的传输层报文封装在UDP/IP中,使得RDMA可以跨路由、跑在标准以太网上。但一个完整的RoCEv2数据包是如何从WQE一步步加上头部、填上校验,最终变成线缆上的比特流的?这篇文章从硬件视角,按构造顺序逐层拆解。

一、起点:WQE里的信息

硬件从SQ中取出WQE,里面已经包含了软件填入的所有参数:

  1. 操作类型:SEND、RDMA WRITE、RDMA READ、ATOMIC等;
  2. 本地数据地址:用于取数据的虚拟地址、长度、L_Key;
  3. 远程地址(针对Write/Read/Atomic):remote_addr和R_Key;
  4. 操作数(Atomic only):compare_add和swap;
  5. 控制标志:是否产生CQE、是否请求ACK等;

硬件接下来要做的,就是把这些信息"翻译"成一个或多个RoCEv2数据包,并添加层层头部。

二、RoCEv2数据包的分层结构

一个典型的RoCEv2数据包从外到内包含以下部分:

  1. MAC头(二层可携带一层vlan);
  2. IP头(IPV4或IPV6);
  3. UDP头;
  4. IB传输层头部(BTH);
  5. IB传输层扩展头部(RETH/AtomicETH等);
  6. IB负载(payload);

而报文如果是分层构造,那则是由内向外构造,首先构建IB负载和传输头,再逐层添加UDP、IP、以太网头。最后计算ICRC(覆盖IB部分)和VCRC(覆盖整个包)。

三、构造IB负载

1、SEND/WRITE:负载就是用户数据。硬件根据WQE中的数据地址,通过PCIE DMA将数据从主机内存搬到网卡包缓冲区;

2、READ请求:无负载。请求包本身只有头部,不含数据;

3、ATOMIC请求:无负载。操作数放在扩展头中;

4、ACK / NAK:无负载,只有头部;

5、对于长消息(超过MTU),硬件会自动拆分为First/Middle/Last多个包,每个包的负载不超过路径MTU。

四、添加IB传输层头部

IB传输层头部以BTH(Base Transport Header,12字节)为必须基础。之后根据操作类型附加不同的扩展头。

BTH的结构在本篇文章不做过多介绍,我们接下来将单独分析这个头部字段分别是什么含义。

五、添加UDP头

RoCEv2强制使用UDP封装。UDP头固定8字节,包含:

  1. 源端口;
  2. 目的端口;
  3. 长度(整个UDP报文长度,从UDP头到IB负载末尾);
  4. UDP校验和(通常设为0);

六、添加IP头

这个也不做过多介绍了,我们仅介绍一下ECN,ECN是两个比特,位置在IPv4 ToS字段的最低2位或IPv6 Traffic Class的最低2位。

七、添加以太网头

以太网头包含:

  1. 目的MAC地址;
  2. 源MAC地址;
  3. vlan tag(根据配置添加);
  4. ether type(0x0800(IPv4)或0x86DD(IPv6));

八、第6步:计算CRC

硬件构造完所有头部和负载后,先计算ICRC并追加到IB负载后,再计算VCRC并追加到帧尾。

1、ICRC(Invariant CRC,4字节)

覆盖范围:IB传输层头部 + 扩展头 + 负载(即UDP负载的全部)。

计算方法:网卡硬件使用多项式(如CRC-32)计算,结果附在IB负载之后。

接收端网卡收到后,首先校验ICRC,丢弃错误包。

2、VCRC(Variant CRC,4字节)

覆盖范围:整个以太帧(从MAC头到ICRC)。

作用:链路层保护,通常由交换机/网卡硬件自动计算和校验。

注意:VCRC是串行线路上的校验,不在最终存储的包格式中显式列出,但硬件在发送前会附加。

九、总结

RoCEv2数据包的构造过程是一个自内向外、逐层封装的流水线:

WQE决定了操作类型、数据源和远程地址。

IB传输层加上BTH和必要的扩展头(RETH/DETH/AtomicETH),并附上数据负载(如果有)。

ICRC覆盖IB部分,保证端到端数据完整性。

UDP+IP封装使得报文可路由,目的端口固定4791,IP头支持ECN。

以太网头完成链路层寻址,可选VLAN支持PFC。

VCRC提供链路层完整性。

硬件流水线几乎不需要软件干预,所有头部填充和CRC计算都在网卡内部完成。理解了这个构造顺序,你就掌握了RoCEv2协议的"骨架"。

相关推荐
折哥的程序人生 · 物流技术专研8 小时前
Java面试85题图解版 · 特别篇:2026后端高频面试题复盘(算法底层逻辑+高并发架构设计全解析,附Java实战代码)
java·网络·数据库·算法·面试
c238568 小时前
Linux C++ 进度条进阶美化与工程化封装
linux·运维·服务器
李小白668 小时前
第四天-WEB服务器基本原理,IIS服务
运维·服务器·前端
专注VB编程开发20年8 小时前
c#Modbus上位机开发-一次读10个地址和100个地址速度一样
网络·网络协议·tcp/ip
爱喝水的鱼丶9 小时前
SAP-ABAP:SAP视图开发入门:四类标准视图的适用场景与创建步骤详解
服务器·数据库·性能优化·sap·abap
2601_9619633811 小时前
技术解剖:哈希值、区块链与CA认证如何守护电子合同安全?
网络·人工智能·安全·区块链·智能合约·政务
2601_9619633811 小时前
从“电子化”到“自动化”:2026年智能合约与电子合同融合的技术逻辑与法律适配
网络·人工智能·区块链·智能合约·政务
回忆2012初秋12 小时前
【Nginx】优雅地走进高性能 Web 服务器世界(1)
服务器·前端·nginx
信创工程师-小杨12 小时前
Linux内网环境如何解决依赖的问题
linux·运维·服务器
不吃土豆的马铃薯12 小时前
C++ 高性能网络缓冲区 Buffer 源码解析
linux·服务器·开发语言·网络·c++