RDMA之infiniband专用网络 LID 和GID 的作用

1、概述

RDMA网络架构设计看上去是参考了TCP/IP,如图1所示,只不过不使用MAC和IP地址来进行寻址,而是用LID(Local Identifiers)进行链路层的转发,使用GID (Global Identifier)进行网络层的转发。传输层和上层协议不是本次的讨论点,所以忽略。

1.1 IB子网管理器(subnet manager)

在这篇博客中会多次提到子网管理器,有必要在这里提前介绍下IB网络的子网管理器OpenSM,后面简称SM。

每个Infiniband子网至少有一个SM。SM 位于 Channel Adapter、路由器或交换机的一个port上,每个port只有一个 SM,可以用硬件或软件实现。当子网内有多个 SM 时,其中一个将被选举为主 SM,其余为备用 SM。主 SM 是初始化和配置 IB子网的关键元素,是子网初始化过程的一部分,负责:

  • 发现子网的物理拓扑
  • 为端节点、交换机和路由器分配本地标识符 (LID)
  • 在端节点之间建立可能的路径
  • 扫描子网,发现拓扑变化并在添加和删除节点时管理变化

1.2 QP0 & QP1

用户调用ibv_create_qp创建QP时,获取到的qpn都是>=2的,因为每个port上的qp0和qp1是有专门用途的,QP0用于子网管理,QP1用于GSI(General Service Interface)。后面在介绍LID时会提到QP0,所以这里提前简单介绍下QP0的作用。

每个 IBA port都有一个专用于子网管理的 QP0。QP0 与其他 QP 相比不同点在于:

  • QP0 永久配置为UD。
  • IBA 设备的每个port都有一个发送和接收数据包的 QP0。
  • QP0 是所有partition的成员(即可以接受指定任何分区的任何数据包)。
  • QP0只处理子网管理数据包 (SMP)
  • QP0的流量(即 SMP)不受链路级流量控制

2、LID(Local Identifiers)

LID是SM(子网管理器)分配的16 bit标识符,在子网中,LID是唯一的,LID不能用于子网之间的路由。

0x0000 为保留标识符;0x0001到0xBFFF是单播标识符 ,总共有49151个单播LID,这意味着一个IB网络子网最大可以有48000左右的IB网卡;0xC000到0xFFFE是多播标识符0xFFFF用于和QP0通信,可以先不管。

每个port都有一个由SM(子网管理器)分配的LID。交换机使用 LID 在子网内路由数据包,LID填充在包的LRH(Local Route Header)。SM根据 LID 以及该port相对于特定交换机的位置在交换机中配置路由表。每个数据包都包含一个源 LID (SLID),用于标识数据包的源port,以及一个目地 LID (DLID),用于标识数据包目的port。

为了便于多路径操作,同时尽量减少Channel Adapter的复杂性,SM需要为每个endport分配一个基本 LID 和一个 LID Mask Control(LMC),LMC(LID Mask Control) 是一个 3 bit字段。SM 可以将endport上的 LMC 定义为 0 到 7 之间的任何值。等价于每个port可以有一个或者多个连续LID,上限为 ,从而实现通过多个 LID(1-128)来寻址endport。如图所示,从Channel Adapter A到Channel Adapter C之间有4条路径,那么对应的就有4个目的LID。

2.1 LID 的特点

由子网管理员分配,子网内唯一,不可用于子网间路由。

• LID 作为一种网络地址,分为预留、单播和多播地址段。

• 数据包中的本地路由报头( local route header, LRH)中包含了 LID。

• 源 LID 指的是第一个将数据包插入子网的终端端口的 LID。

• 一个单播型的目的 LID 适用于某一个目的终端端口。一个多播型的目的 LID 适用于一个子网中某个多播组里的一系列目的终端端口。

• 如果最终的目的端口不在这个子网内,数据包中的目的 LID 指向的是,负责转发这个数据包到下一跳的路由器的某个端口。

• 一个终端端口在连接到子网后,收到的数据包可能经过了子网内的多条物理路径。例如,图 2中交换机之间相同类型的连线表示一条可能的路径,这样的路径共有 4条。每条路径可以被一个或多个物理 LID 标识。为了降低 HCA 的多路径操作的复杂度,每个物理端口应分配一个基本 LID 和一个 LMC。 LMC 是一个 3 位的域,代表2LMC 条路径。图 2中, HCA A 和 HCA C 之间存在多条路径。如果 HCA A 被分配了基本 LID 4, LMC =2,则其 LID 的范围是 4、 5、 6、 7。如果 HCA C 被分配了基本LID 8, LMC=2,则其 LID 的范围就是 8、 9、 10、 11。

• LID 的分配规则: LID 0x0000 无效; LID 0xFFFF 分配给接收数据包的终端端口的 QP0;0x0001 和 0xBFFF 之间为单播 LID; 0xC000 和 0xFFFE 之间为多播 LID。对于 RoCE 类型的网络, LID 无效,所有端口的 LID 都为 0x0000。

3、GID (Global Identifier)

GID的构造稍微复杂些,涉及到EUI-64,GUID还有subnet prefix等,为了尽可能把GID描述清楚,每个小知识点都需要单独说明。

3.1 背景信息

EUI-64:

IEEE 定义的分配给设备的 64 位标识符。EUI-64 是由 24 位 company_id 值和 40 位扩展标识符连接而成的 64 位标识符。company_id 由 IEEE 注册机构分配;扩展标识符由分配 company_id 的组织分配

GUID(Golbal Unique Identifier):

符合 EUI-64 标准的全球唯一的标识符。制造商需要给每个 HCA、TCA、交换机和路由器都分配一个 EUI-64 GUID。还需为每个port分配一个 EUI-64 GUID,一个HCA或者TCA可能有多个port,交换机和路由器也有多个port。

EUI-64与GUID不等价,除了制造商,SM也可以分配用于子网内,且子网内唯一的EUI-64,但只有制造商分配的全球唯一的EUI-64才能叫做GUID。

Subnet Prefix:

0 到 64 位的标识符,用于唯一标识由公共SM管理的一组endport。

3.2 GID的定义

GID是一个128 bit ,用于标识endport或multicast group的单播或多播标识符。GID利用了 IPv6 地址的众多概念和语义(根据 RFC 2373),但是,IBA 未定义 GID 和 IPv6 地址之间的关系,即,对于任何endport或multicast group,GID 和 IPv6 地址之间没有定义映射。注意:这些规则仅适用于 IBA 操作,不适用于原始 IPv6 操作,除非特别说明。

GID 是在不同子网之间发送数据包时的全局地址。值由两部分组成:高 64 位为GID前缀。低 64 位为EUI-64,可能是IEEE分配的全球唯一的GUID,也可能是SM分配的只在子网内唯一的EUI-64。

GID前缀分为默认和非默认两种:

1)如果SM没有配置GID前缀,那么使用默认GID前缀+GUID组成GID。默认 GID 前缀定义为 (0xFE80::/64),如果数据包的 GRH (Global Route Header )里目的 GID 使用了默认GID前缀,意味着这个数据包不能由路由器转发,只能在二层网络转发。

2)如果SM给endport配置了非默认 GID 前缀,则使用非默认GID前缀+GUID组合成GID。

每个endport支持的单播 GID 的最大数量 (N) 取决于具体实现。1个为GID前缀+GUID组合而成,剩余的N-1个GID则为SM分配的 N-1个 EUI-64 标识符与 GID 前缀拼接而成。

单播 GID 地址 0:0:0:0:0:0:0:0 是保留的 - 称为保留 GID。不能分配给任何endport,也不能用作目的GID。

单播 GID 地址 0:0:0:0:0:0:0:1 称为环回 GID,仅供原始 IPv6 服务使用 - 不供 IBA 传输服务使用。禁止分配给endport或出现在任何 IBA 数据包中。

3.3 单播GID的格式

单播GID有三种类型:

1)link-local GID;

link local - 用于子网内的单播GID,使用默认 GID 前缀,即 0xFE80::/64。路由器不得转发有默认GID前缀的数据包,link local GID 格式:

2)site-loal GID;

site local - 用于子网集合中的单播 GID,该 GID 在集合内是唯一的(例如数据中心或校园),但不一定是全局唯一的。路由器不得转发有site local GID(不管是SGID还是DGID)的数据包到site local之外。格式为:

3)全局GID。

全局 - 具有全局前缀的单播 GID,路由器可以使用此 GID 在整个 Internet 中路由数据包。全局 GID 格式为:

3.4 多播GID的格式

多播组由多播GID(MGID)唯一标识,并且多播组的所有成员除了有相同的MGID外,还必须共享相同的P_Key和Q_Key。MGID的格式如下:

GID 开头的 8 位 11111111 标识这是一个多播 GID。Flags 是一个4bit的标志位,前3bit为保留位,定义为0。第4个bit:

  • 0 表示这是永久分配的多播 GID。有关这些永久分配的 GID。
  • 1 表示这是非永久分配的(即临时的)多播 GID。

Scope 是 4 位多播范围值,用于限制多播组的范围,0和0xF代表reserved,2代表link-local,5代表site-local,8代表origanization-local,0xE代表global,其他取值都是unassigned。

endport可以属于0个、1个或多个多播组,即endport可以分配0个、1个或多个多播 GID。 多播 GID 不得作为 GRH 中的源 GID (SGID) 出现。

最后使用IBA的一张官方图作为结束吧,本来想举一个具体的例子描述在子网内交换机是如何根据LID进行数据包转发的,但是发现需要补充的背景知识有点多,会导致博客的篇幅过长,所以留到后面单独更一篇吧。

3.5 GID 特点

• 每个终端端口必须被分配至少一个单播 GID。第一个单播 GID 在创建时必须使用厂商分配的 EUI-64 标识符。此 GID 称为 0 号 GID。

• 默认的 GID 前缀为 0xFE80::0,共 64 位。使用默认 GID 前缀和厂商/子网管理器分配的 EUI-64 可以组成 128 位的 GID,使用这种 GID 封装的数据包必须被终端接纳。一个数据包的全局路由报头( GRH)中如果有这种前缀的目的 GID,则路由器不能将其转发,也就是必须限制在本地子网内处理。

  • 通道适配器、交换机或路由器上的任何 QP,都可以用默认 GID 前缀加上为这个 QP分配的 GID 来寻址。这使得一个子网可以在不中断已有通信会话的情况下,从默认GID 前缀状态转换为托管状态。

• 每个终端端口可以支持的单播 GID 的最大数量( N)取决于具体实现。子网管理器可以分配 N-1 个额外的单播 GID,这 N-1 个 GID 中的每一个都是通过将一个子网管理器分配的 EUI-64 标识符与 GID 前缀连接起来创建的。

• 单播 GID 地址 0:0:0:0:0:0:0:0 是保留的,称为保留 GID。不得将其分配给任何终端端口,也不得将其用作目的地址或用在 GRH 中。

• 单播 GID 地址 0:0:0:0:0:0:0:1 称为环回 GID,仅由原始( raw) IPv6 服务使用,不由InfiniBand 传输服务使用。不得将其分配到终端端口或出现在任何 InfiniBand 数据包中。

• 单播 GID 子网前缀应限于 GID 地址空间的高 64 位。子网前缀的位的数量可能会进一步受到填充( filler)和作用域( scope)位的限制,见下文分析。

• 单播 GID 的低 64 位不能进一步划分子网。

• 单播 GID 的低 64 位在子网中是唯一的。

• GRH 中应包含有效的源 GID 和目的 GID。

3.6 GUID&GID&LID区别

标识符 作用范围 唯一性 生成方式 示例
GUID 全局 硬件唯一 硬件固化 结点GUID: 0x0002c9030020abcd
GID 全局 子网相关,动态 子网前缀 + 端口GUID fe80::0002:c903:0020:abce
LID 子网内 子网内唯一,动态 子网管理器分配 单播 LID: 0x001

4、RoCEV2的MAC,IP,GID

在 RoCEv2 类型的网络上,传递的是Ethernet+IP+UDP 的数据包。每个 RoCEv2 类型的 RDMA 网卡在封装数据包时,必须知道:

• 自己的 MAC 地址;

• 自己的 IP 地址;

• 对端的 MAC 地址;

• 对端的 IP 地址。

RDMA 应用程序在修改 QP 和向对端发起数据传输前,需要先通过套接字获取对端的几个关键信息。这些关键信息包括 LID、 QPN、数据缓存的地址、 R_Key 和 GID等。 对端的 MAC 地址和 IP 地址就是根据对端的 GID,通过换算或查询获取的。要理解如何通过对端的 GID 获取对端的 MAC 地址和 IP 地址, 前提是知道 RoCEv2 网卡的 GID 有什么特点。

RoCE 类型的终端和 InfiniBand 类型的终端一样,都有默认的 GID。在网卡没有做任何人工配置的情况下,执行 show_gids 命令,从其输出中可以看到一个"0号 GID",由于使用了默认 GID 前缀,因此这也是一个默认 GID。

复制代码
$ show_gids //看看网卡支持的roce版本, 
DEV     PORT    INDEX   GID                                     IPv4            VER     DEV
---     ----    -----   ---                                     ------------    ---     ---
mlx5_4  1       0       fe80:0000:0000:0000:ee0d:9aff:fe2f:c21a                 v1      p1p1
mlx5_4  1       1       fe80:0000:0000:0000:ee0d:9aff:fe2f:c21a                 v2      p1p1

可以为ROCEV2网卡添加一个新的GID,方法是为该网卡在操作系统中对应的网络接口上配置一个IPV4地址192.168.1.1,然后再执行show_gids命令就可以看到设备多了一个GID,如下所示:

复制代码
$ show_gids //看看网卡支持的roce版本, 
DEV     PORT    INDEX   GID                                     IPv4            VER     DEV
---     ----    -----   ---                                     ------------    ---     ---
mlx5_4  1       0       fe80:0000:0000:0000:ee0d:9aff:fe2f:c21a                 v1      p1p1
mlx5_4  1       1       fe80:0000:0000:0000:ee0d:9aff:fe2f:c21a                 v2      p1p1
mlx5_4  1       2       0000:0000:0000:0000:0000:ffff:c0a8:0101 192.168.1.1     v1      p1p1
mlx5_4  1       3       0000:0000:0000:0000:0000:ffff:c0a8:0101 192.168.1.1     v2      p1p1

可以看到这个新的GID 0000:0000:0000:0000:0000:ffff:c0a8:0101是由刚刚设置的 IP 地址192.168.7.2 转换而来的( 0xC0 等于 192, 0xA8 等于 168)。

如果为网络接口配置的是一个 IPv6 类型的 IP 地址,也会产生新的 GID,新 GID 和配置的 IPv6 类型的 IP 地址完全相同.

关键列:

  • DEV/PORT: 指明是哪个RDMA设备(如mlx5_0)的哪个端口。
  • INDEX: GID表的索引号。一个端口可以有多个GID。
  • GID: 128位的全局标识符本身。
  • IPv4: 当GID类型为RoCE v2且由IPv4地址映射而来时,这里会显示对应的IPv4地址,极大方便了调试。
  • VER: 标识GID用于哪个版本的RoCE协议。v1对应RoCE v1(基于以太网二层),v2对应RoCE v2(基于UDP/IP三层)。
  • DEV: 关联的Linux网络接口名。

注意:fe80::开头的GID是链路本地地址(Link-local GID),它是网卡在未配置IP时自动生成的,仅用于同一物理链路(如直连或同一交换机VLAN内)的通信。而由IPv4映射而来的GID(如::ffff:192.168.1.1)才是用于跨三层网络进行RoCE v2通信的关键。

相关推荐
陈陈CHENCHEN6 小时前
【Linux】Rsync + Inotify 实时文件同步案例
linux·运维·服务器
坐吃山猪6 小时前
【Nanobot】README09_LEVEL4 添加新聊天渠道
开发语言·网络·python·源码·nanobot
xhbh6666 小时前
光纤端口映射完全教程:光猫虚拟服务器配置+免费穿透工具实战
运维·服务器·网络·智能路由器·端口映射·流量端口转发·ssh端口转发
charlie1145141917 小时前
嵌入式Linux嵌入式Linux驱动开发:设备树驱动改造——从硬编码到设备树的实战之旅
linux·运维·驱动开发
深念Y7 小时前
网络多播与广播:到底能不能节省带宽和流量?
网络·直播·p2p·点对点·多播·流量·单播
随身数智备忘录7 小时前
MES安灯管理程序这套方法,专治MES安灯管理程序中的流程空转
大数据·服务器·网络
随身数智备忘录7 小时前
lpa分层审核指标怎么设?拆解关键指标,看lpa分层审核指标如何应对标准不一与责任虚化
服务器
有味道的男人7 小时前
1688 跨境 API:多语言、跨境代采、独立站商品同步方案
java·服务器·前端
Hoxy.R7 小时前
银河麒麟 V10 离线安装 s3cmd 踩坑记录+存储负载均衡测试
linux·运维·华为·存储