第一部分 · 5 / 6

RoCE 与 GID

RDMA 最早跑在 InfiniBand 专网上,用 LID 寻址。 而 RoCE(RDMA over Converged Ethernet)让 RDMA 跑在普通以太网上,用 GID 寻址。 理解 GID 和「GID 索引」是 RoCE 组网不踩坑的关键——选错索引是最常见的连不上原因。

InfiniBand vs RoCE

InfiniBandRoCE v1RoCE v2 最常用
底层网络IB 专用网络以太网(二层)以太网 + UDP/IP(可路由)
寻址LIDGID(MAC 派生)GID(含 IP 信息)
跨子网路由需 IB 路由器不可路由可路由(走 IP)

现在数据中心绝大多数是 RoCE v2,因为它复用现有以太网/IP 基础设施、还能跨网段路由。

GID 是什么

GID(Global Identifier)是一个 16 字节的全局地址。在 RoCE v2 下,GID 里编码了 IP 信息, 所以可以从 IP 映射出来。在 gordma 里它就是一个定长数组,并带一个规范的字符串格式:

type GID [16]byte

// 渲染成习惯的 8 组 16 位冒号分隔形式
func (g GID) String() string {
    // 形如 fe80:0000:0000:0000:....
}

GID 索引:最容易踩的坑

核心 一块网卡的 GID 表有很多行,每行对应一种组合:RoCE v1 / v2 × IPv4 / IPv6 × 不同 IP。 你必须用正确的行号(GID 索引),否则两端协商不上。

典型情况下,RoCE v2 + IPv4 往往落在某个固定索引上。本库的示例统一默认 GID 索引 3-x 3),这是很多多网卡 RoCE 主机的常见布局,但不是绝对—— 务必用工具确认你机器上的实际索引。

# 查看每块设备的 GID 表,找到 RoCE v2 / 你要用的 IP 对应的行号
show_gids

# 典型输出(节选),最后一列 VER=v2、IP 是你要用的网段 → 记下 index
# DEV     PORT  INDEX  GID                      IPv4         VER
# mlx5_1  1     3      ::ffff:33.0.226.25       33.0.226.25  v2

LinkLayer:决定用 GID 还是 LID

查询端口属性(PortAttr)时有个 LinkLayer 字段:

LinkLayer含义寻址方式
"Ethernet"RoCE用 GID(设 IsRoCE=true,填 DestGID/SGIDIndex
"InfiniBand"IB用 LID(填 DestLID

回头看 QP 状态机里的 RCConnParams.IsRoCE,就是据此选择寻址路径。

设备命名约定(示例环境)

本库 examples 假设一个典型的多网卡 RoCE 主机(show_gids 布局):

  • mlx5_0 → CPU 网络(xgbe0
  • mlx5_1..mlx5_8 → GPU 网络(xgbe1..xgbe8
  • 每块设备的 RoCE v2 都在 GID 索引 3

所以示例默认 -d mlx5_1 -x 3(第一块 GPU 网卡 + RoCE v2);用 -d mlx5_0 切到 CPU 网络。

下一步 概念齐了。下一节把它们串成 一次 RC 传输的完整流程, 然后你就能在第二部分看到 gordma 如何把每一步封装成方法。
gordma 教程