InfiniBand 专题【左扬精讲】—— InfiniBand 网络层:GID 与子网路由
InfiniBand 专题【左扬精讲】—— InfiniBand 网络层:GID 与子网路由
InfiniBand(简称 IB)网络层是 IB 架构中承上启下的关键层次,它使得跨子网通信成为可能。与传统以太网依赖 IP 地址进行三层路由类似,IB 网络层使用 GID(Global Identifier) 作为全局唯一标识,配合 GRH(Global Routing Header) 实现跨子网的数据包转发。
本篇深入探讨 IB 路由解决方案的核心优势、网络层的基本职责与功能,以及如何使用 OFED 工具定位 GID 地址。
理解网络层是掌握 IB 超大规模集群通信的关键。
InfiniBand 架构分层(自下而上)
+------------------+
| 物理层 | 线缆、光模块、电信号(SerDes)
+------------------+
| 链路层 | 数据包布局、LID 寻址、QoS、流量控制
+------------------+
| 网络层 | 本章核心:GRH 头部、GID 全局路由、子网间通信
+------------------+
| 传输层 | 端到端可靠性、分段与重组(PSN)
+------------------+
| 上层协议层 | RDMA 操作语义(Send/Recv/RDMA Read/Write)
InfiniBand 网络层 GID GRH 子网路由 IB 路由器 OFED
学习重点提示
本篇深入探讨 InfiniBand 网络层的核心知识。以下是每个主题你需要掌握的深度说明:
IB 路由解决方案(What & How & Why):
- What:IB 路由器用于连接不同的 IB 子网,每个子网最多可包含 48,000 个托管节点;子网之间完全隔离,单独管理
- How:能说出 IB 路由器的四大核心优势(扩展性、子网隔离、子网管理、异构拓扑连接);理解路由器如何在不同拓扑(Fat Tree、Torus、Dragonfly)之间建立连接
- Why:理解 "为什么需要 IB 路由器" ——当网络规模扩大时,单个子网无法满足需求;通过路由器连接多个子网,可以实现 故障隔离 和 弹性扩展
GID 全局标识符(What & How & Why):
- What:GID 是一个 128 位的全局唯一标识符,由 64 位子网前缀(Subnet Prefix)+ 64 位端口 GUID 组成,标识端端口或多播组
- How:能画出 GID 的结构图(FE80::[64-bit GUID] 表示默认 GID);掌握子网管理器分配 GID 的机制;理解默认 GID 的 fe80 前缀与 IPv6 链路本地地址的相似性
- Why:理解 "为什么需要 GID 而不是只用 LID" ——LID 只能在子网内唯一,子网间通信需要全局唯一标识;GID 是 IB 实现全局路由的基础
GRH 全局路由头(What & How & Why):
- What:GRH 是 IB 网络层的三层头部,包含目的 GID 和源 GID,用于跨子网路由;本地子网通信可以省略 GRH
- How:能说出 GRH 的位置(LRH 之后、可选的 BTH 之前);理解何时需要 GRH(同子网不需要,跨子网必须)
- Why:理解 "为什么同子网不需要 GRH" ——同子网通信使用 LID(链路层),只需 LRH 头部;跨子网通信需要 GID 路由,必须携带 GRH
单播与多播操作(What & How & Why):
- What:单播(Unicast)是从网络上一个节点到另一个节点的通信;多播(Multicast)是从一个节点到多个(但不是全部)节点的通信,通过一次传输到达所有订阅者
- How:能区分单播和多播的 GID 范围;掌握多播组注册机制
- Why:理解 "为什么需要多播" ——在 HPC 集群中,需要将数据同时发送给多个计算节点(如广播参数更新),多播避免了重复的点对点传输,提高了效率
OFED 命令行工具(What & How & Why):
- What:ibdevices 查看所有 IB 设备,ibaddr 显示指定设备的 GID 和 LID 信息
- How:能熟练使用这两个命令;理解输出中 LID 以十六进制显示
- Why:工具是理论的落地——理解 GID 结构后,用 ibaddr 验证设备 GID 是最直接的验证方式
阅读前提 & 建议:
- 前置知识:建议了解链路层基础(LID 寻址、子网管理),本篇会在链路层基础上扩展网络层概念
- 不涉及的内容:路由算法具体实现(最短路径迪杰斯特拉算法)、IB 路由器硬件架构、拥塞控制机制
- 深度预期:学完本篇后,你能理解 GID 的 128 位结构,能使用 ibaddr 查看设备 GID,能回答"IB 为什么要引入网络层"
- 后续延伸:传输层语义(RDMA 操作)→ 拥塞控制(PFC/ECN)→ IB 在 HPC/AI 集群中的应用
IB 路由解决方案概述
What — IB 路由解决方案是什么?
IB 路由解决方案是指使用 IB 路由器连接不同的 IB 子网,使得大规模 IB 网络能够跨越多个子网进行通信。随着 IB 网络规模的扩大,单个子网的节点数量和拓扑灵活性逐渐受到限制,这时就需要引入路由器来实现子网间的互联。
Why — 为什么需要 IB 路由器?
问题一:网络规模与拓扑复杂度
单个 IB 子网最多支持 48,000 个托管节点。这个数字看似很大,但实际部署时会受到多重约束:
-
- 交换机端口数量:一个 36 端口的 Quantum-2 交换机最多连接 36 个节点。要达到 48,000 节点,需要约 1,400 台交换机互联。交换机的选路算法、路径深度、端口密度都会影响网络的实际性能
- 子网管理器负担:子网管理器(SM)需要维护所有节点的路径信息(LID → 端口映射)。节点越多,路径数据库越大,SM 的计算和内存开销呈线性增长,SM 故障影响范围也越大
- 故障域大小:单个子网的故障会波及相关所有节点。一台核心交换机故障可能导致数千节点同时中断,RTO(恢复时间目标)和 RPO(恢复点目标)难以保障
- 管理粒度:48,000 节点若由单一 SM 管理,任何配置变更都需要全局生效。实际运维中,按业务、按机房、按租户划分子网是刚性需求
实际阈值参考:在生产环境中,当节点数超过 2,000~5,000 时(取决于业务 SLA 要求),通常就会规划多个子网。例如 NVIDIA 的 DGX SuperPOD 超过 1,000 节点就采用了多子网架构。
问题二:故障隔离需求
大型集群需要故障隔离能力。当一个子网发生故障时,不应影响其他子网的正常运行。路由器实现了子网间的隔离。
问题三:拓扑灵活性
不同子网可以采用不同的网络拓扑(Fat Tree、Torus、Dragonfly 等),路由器使得这些异构拓扑可以互联互通,无需重新设计原有拓扑。
没有 IB 路由器会发生什么?
-
- 网络规模被限制在 48,000 节点以内,无法构建超大规模集群
- 单点故障可能导致整个网络瘫痪
- 无法灵活组合不同拓扑的网络
IB 路由解决方案提供以下四大核心优势:
-
- 扩展性(Scaling):通过添加更多子网和路由器,可以将网络扩展到任意规模,突破单个子网的节点限制
- 子网隔离(Subnet Isolation):每个子网完全隔离,一个子网的问题不会传播到其他子网,大大提高了可靠性
- 子网管理(Subnet Management):每个子网可以独立管理和配置,变更一个子网不会影响其他子网
- 异构拓扑连接(Topology Connectivity):不同子网可以采用不同的物理拓扑(Fat Tree、Torus、Dragonfly),路由器负责它们之间的路由
本节小结
-
- IB 路由器连接不同的 IB 子网,每个子网最多包含 48,000 个托管节点,但受交换机端口数、SM 负担、故障域、管理粒度等实际约束,通常 2,000~5,000 节点以上就会规划多子网
- 子网之间完全隔离,单独管理,故障互不影响
- IB 路由器支持连接不同拓扑的网络,包括 Fat Tree、Torus、Dragonfly 等
网络层核心职责
What — 网络层是什么?
IB 网络层是 IB 架构中位于链路层之上、传输层之下的层次。它负责实现跨子网的路由功能,使 IB 路由器能够将数据包从一个子网转发到另一个子网。
Why — 为什么需要网络层?
链路层的局限
链路层使用 LID(Local Identifier)进行子网内的路由。LID 是子网管理器分配的本地标识,只能在单个子网内唯一,不具备跨子网寻址能力。
网络层的作用
网络层引入了 GID(Global Identifier)和 GRH(Global Routing Header),使得 IB 网络能够实现全局唯一的寻址和跨子网路由。
没有网络层会发生什么?
-
- 只能构建单一子网的网络,规模受限于 48,000 节点
- 无法实现跨子网的通信,超大规模集群无法构建
- 不同拓扑的网络无法互联
IB 数据包的头部结构如下:
IB 数据包封装顺序(从外到内)
+------+
| VCRC | 可变 CRC,覆盖整个数据包(链路层校验)
+------+
| ICRC | 不变 CRC,覆盖数据包内容(链路层端到端校验)
+------+
| Payload | 传输层数据载荷(可变大小)
+------+
| BTH | 基传输头(Transport Header)
+------+ ↑
| GRH | 全局路由头(仅跨子网通信时需要)可选
+------+ ↑
| LRH | 本地路由头(链路层始终需要)
+------+
关键说明:
-
- LRH(Local Routing Header):链路层头部,包含源/目的 LID,用于子网内路由,始终存在
- GRH(Global Routing Header):网络层头部,包含源/目的 GID,仅跨子网通信时需要
- BTH(Base Transport Header):传输层头部,定义操作类型和事务处理
本节小结
-
- 网络层使用 GRH(Global Routing Header) 实现跨子网路由
- GRH 包含 GID(Global Identifier) 作为全局唯一标识
- 同子网通信只需 LRH,跨子网通信需要 LRH + GRH + BTH
GID 全局标识符详解
What — GID 是什么?
GID(Global Identifier)是 IB 网络层的 128 位全局唯一标识符,用于标识端端口(End Port)或多播组。GID 在整个 IB 网络中是全局唯一的,跨多个子网仍然保持唯一性。
Why — 为什么需要 GID?
GID 的结构设计灵感
GID 的 128 位结构设计与 IPv6 地址类似,由前缀和接口标识符组成。这不是巧合,而是 IB 架构设计时借鉴了 IPv6 的成熟理念。
没有 GID 会发生什么?
-
- 无法实现跨子网的全局路由,只能使用 LID 进行子网内通信
- 多播组无法跨子网存在
- 网络规模受限于单个子网的 48,000 节点
GID 由两部分组成,总共 128 位:
GID 128 位结构
+---------------------------+---------------------------+
| Subnet Prefix(子网前缀) | Port GUID(端口全局唯一标识符) |
| 64 位 | 64 位 |
+---------------------------+---------------------------+
示例:默认 GID
fe80:0000:0000:0000:0011:0d00:0030:1234
|----子网前缀----| |-------端口 GUID--------|
关键说明:
- 子网前缀(64 位):由子网管理器分配,同一子网内的所有端口共享相同的子网前缀
- 端口 GUID(64 位):每个 HCA 端口的唯一标识符,由厂商在生产时烧录
- 默认 GID:使用 fe80::[64-bit GUID] 格式,fe80 是 IPv6 链路本地地址的等价前缀
注意:GID 与 IPv6 的相似性
GID 的结构与 IPv6 地址非常相似:
-
- 都是 128 位
- 都由前缀 + 接口标识符组成
- 默认 GID 的 fe80 前缀与 IPv6 链路本地地址(fe80::/10)完全一致
这种设计使得 IB 网络可以更容易地与基于 IPv6 的网络进行互操作。
本节小结
-
- GID 是 128 位全局唯一标识符
- 由 64 位子网前缀 + 64 位端口 GUID 组成
- GID 由子网管理器分配,每个 HCA 端口有默认 GID(fe80 前缀)
单播与多播操作
What — 单播和多播是什么?
IB 网络层支持两种基本的通信模式:
-
- 单播(Unicast):从网络上的一个节点到另一个节点的点对点通信
- 多播(Multicast):从一个节点到多个(但不是全部)节点的通信,通过一次传输到达所有订阅者
Why — 为什么需要多播?
HPC 集群是什么?
HPC(High Performance Computing,高性能计算)集群是由数百乃至数万台服务器通过高速网络互联组成的计算集群。它的核心目标是解决单台计算机无法完成的超大规模计算任务。典型应用场景包括:气候模拟(天气预报、气候变化预测)、基因测序(蛋白质折叠、药物研发)、流体力学仿真(飞机设计、汽车风洞测试)、核爆模拟、国防科研等。
在 HPC 集群中,计算节点不是独立工作,而是需要协同完成一个任务。这就好比一个大型项目需要多个工人分工合作,每个工人都要随时知道其他工人的进度和数据。以气候模拟为例,计算节点 A 负责处理海洋数据,计算节点 B 负责处理大气数据,两者需要频繁交换中间结果,才能最终拼出完整的气候模型。这个过程叫做集体通信(Collective Communication)。
HPC 集群中的多播需求
在高性能计算集群中,经常需要将数据同时发送给多个计算节点。例如:
-
- 广播集体通信操作的参数更新
- 分布式训练中的梯度同步
- 集群管理命令的分发
如果没有多播支持,每次都需要进行多次点对点传输,效率极低。
没有多播会发生什么?
-
- 广播操作需要 N 次点对点传输,延迟和带宽消耗呈线性增长
- 大规模集群的集体通信性能严重下降
- 无法高效支持分布式训练等需要多节点协同的应用
单播和多播使用不同范围的 GID:
GID 范围划分
+------------------------------------------+
| 多播 GID 范围 | FF12:0x:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx
+------------------------------------------+
| 保留/特殊用途 | FF00:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx
+------------------------------------------+
| 单播 GID 范围(默认 GID 使用 fe80 前缀) | fe80::xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx
+------------------------------------------+
| 其他单播 GID(由子网管理器分配) | 其他前缀...
关键说明:
-
- 多播 GID:以 FF12 开头的 GID,用于标识多播组
- 单播 GID:用于标识单个端端口,全球唯一
- 多播路由使用一次传输将数据发送给所有订阅者,避免了重复的点对点通信
本节小结
-
- 单播:点对点通信,用于两个节点间的数据传输
- 多播:一对多通信,通过一次传输到达所有订阅者
- 多播 GID 以 FF12 开头,标识多播组
OFED 命令行工具
What — OFED 命令行工具有哪些?
OFED(Mellanox/NVIDIA 提供的 IB 驱动和工具栈)提供了多个用于查看 IB 设备信息的命令行工具。本节介绍与网络层相关的两个核心命令:ibdevices 和 ibaddr。
Why — 为什么需要这些命令?
理解 GID 结构后,需要通过工具验证设备是否正确配置了 GID。这些命令是理解 IB 网络层配置的实际入口。
没有这些命令会发生什么?
-
- 无法验证设备是否正确注册到子网
- 无法确认设备的 GID 配置是否正确
- 故障排查时缺乏直接的工具支持
ibdevices 命令用于显示本地服务器上安装的所有 IB 设备:
# 查看所有 IB 设备
$ ibdevices
ibdev0: mlx5_0
ibdev1: mlx5_1
ibdev2: mlx5_2
ibdev3: mlx5_3
输出显示本地服务器包含 4 个 IB 设备,均为双端口 HCA(每个 mlx5_X 代表一个物理端口)。
ibaddr 命令用于显示指定 IB 设备的 GID 和 LID 信息:
# 查看 mlx5_1 设备的 GID 和 LID
$ ibaddr mlx5_1
GID: fe80:0000:0000:0000:0011:0d00:0030:1234
LID: 0x0001
Port 1:
GID: fe80:0000:0000:0000:0011:0d00:0030:1234
LID: 0x0001
Port 2:
GID: fe80:0000:0000:0000:0011:0d00:0030:5678
LID: 0x0002
关键说明:
-
- GID 显示为 128 位的十六进制表示(冒号分隔的 8 个 16 位字段)
- LID 以十六进制显示(如 0x0001 = 十进制 1)
- 默认 GID 使用 fe80 前缀,表示这是链路本地地址
- 每个物理端口有独立的 GID 和 LID
注意:LID 与 GID 的关系
LID(Local Identifier)用于链路层(子网内)路由,GID(Global Identifier)用于网络层(跨子网)路由。两者可以共存:
-
- 同子网通信使用 LID,效率更高
- 跨子网通信必须使用 GID
- 每个端口同时拥有 LID 和 GID
本节小结
-
- ibdevices:列出所有 IB 设备
- ibaddr:显示指定设备的 GID 和 LID
- 默认 GID 使用 fe80 前缀,后跟 64 位端口 GUID
FAQ
20 个核心问题解答
Q1. InfiniBand 路由解决方案的主要优势是什么?
扩展性、隔离性、管理独立性和异构拓扑连接。IB 路由器允许连接多个子网,每个子网最多 48,000 节点;子网间完全隔离,故障不传播;每个子网可独立管理;不同拓扑(Fat Tree、Torus、Dragonfly)可以互联,无需重新设计。
Q2. GID 是多少位的标识符?
128 位。GID(Global Identifier)是 InfiniBand 网络层的全局唯一标识符,与 IPv6 地址长度相同,由 64 位子网前缀和 64 位端口 GUID 组成。
Q3. GID 由哪两部分组成?
64 位子网前缀 + 64 位端口 GUID。子网前缀由子网管理器分配,同一子网内所有端口共享;端口 GUID 由 HCA 厂商在生产时烧录,全球唯一。
Q4. 默认 GID 使用什么前缀?
fe80::/64 前缀。默认 GID 使用 fe80:0000:0000:0000:[64-bit GUID] 格式,这与 IPv6 的链路本地地址前缀完全一致。
Q5. GRH 是什么?
Global Routing Header,全局路由头。GRH 是 IB 网络层的头部,包含源 GID 和目的 GID,用于跨子网路由。同子网通信可以省略 GRH,跨子网通信必须包含 GRH。
Q6. LRH 和 GRH 的区别是什么?
LRH 用于子网内路由,GRH 用于跨子网路由。LRH(Local Routing Header)包含 LID,用于链路层;GRH(Global Routing Header)包含 GID,用于网络层。
Q7. 单播和多播的区别是什么?
单播是点对点通信,多播是一对多通信。单播从网络上一个节点到另一个节点;多播从网络上一个节点到多个节点(不是全部),一次传输到达所有订阅者。
Q8. 多播 GID 使用什么前缀?
FF12::/64 前缀。多播 GID 以 FF12 开头,用于标识多播组。单播 GID 不使用 FF 开头的前缀。
Q9. 每个 IB 子网最多支持多少个托管节点?
48,000 个托管节点。这是单个 IB 子网的节点容量上限。超过这个数量需要引入多个子网,通过 IB 路由器互联。
Q10. ibdevices 命令的作用是什么?
列出本地服务器上安装的所有 IB 设备。输出显示每个 ibdevN 对应的设备名称(如 mlx5_0、mlx5_1)。
Q11. ibaddr 命令的作用是什么?
显示指定 IB 设备的 GID 和 LID 信息。ibaddr 可以查看设备每个物理端口的 GID(用于跨子网路由)和 LID(用于子网内路由)。
Q12. 为什么 GID 与 IPv6 地址长度相同?
IB 架构设计时借鉴了 IPv6 的成熟理念。GID 的 128 位结构与 IPv6 地址类似,由前缀和接口标识符组成,这使得 IB 网络可以更容易地与基于 IPv6 的网络进行互操作。
Q13. IB 路由器支持哪些网络拓扑?
Fat Tree、Torus、Dragonfly 等多种拓扑。IB 路由解决方案支持不同子网采用不同的物理拓扑,路由器负责它们之间的路由计算和数据转发。
Q14. 同子网通信需要 GRH 吗?
不需要。同子网通信使用 LID(链路层),只需 LRH 头部。跨子网通信需要 GID 路由,必须携带 GRH 头部。
Q15. 子网隔离有什么好处?
提高可靠性和可用性。一个子网发生故障不会传播到其他子网;变更一个子网不会影响其他子网的运行;便于独立管理和维护。
Q16. HCA 端口的 GUID 由谁分配?
由 HCA 厂商在生产时烧录。每个 HCA 端口的 GUID 是硬件级别的唯一标识符,与网络配置无关,确保全球唯一性。
Q17. 为什么需要多播路由?
提高集体通信效率。HPC 集群需要广播梯度更新、参数同步等,多播通过一次传输到达所有订阅者,避免了 N 次点对点传输的性能开销。
Q18. LID 以什么进制显示?
十六进制。ibaddr 等工具输出的 LID 以十六进制显示(如 0x0001 = 十进制 1)。
Q19. 网络层在 IB 架构中的位置是什么?
链路层之上、传输层之下。IB 架构自下而上为:物理层、链路层、网络层、传输层、上层协议层。网络层承上启下,连接链路层和传输层。
Q20. 理解网络层对掌握 IB 集群有何意义?
理解跨子网通信机制,为构建超大规模集群奠定基础。网络层使得 IB 能够构建包含数十万节点的超级计算机和 AI 训练集群,是现代 HPC/AI 基础设施的关键技术。
FAQ 总纲
IB 网络层的核心是 GID(128 位全局标识符)和 GRH(全局路由头),它们使得跨子网通信成为可能。IB 路由器连接多个子网,突破单子网 48,000 节点的限制,支持 Fat Tree、Torus、Dragonfly 等异构拓扑互联。
Roadmap
后续学习路线
完成本篇网络层的学习后,建议继续深入以下主题:
-
- 传输层(Transport Layer):深入理解 RDMA 操作语义(Send/Recv/RDMA Read/Write)、端到端可靠性、分段与重组(PSN)
- 拥塞控制:学习 PFC(Priority Flow Control)和 ECN(Explicit Congestion Notification)机制
- IB 在 HPC/AI 集群中的应用:理解 InfiniBand 如何支撑大规模并行计算和分布式训练
- 子网管理器(Subnet Manager):深入理解 SM 的初始化流程、LID 分配策略、路径记录
推荐学习顺序:物理层 → 链路层 → 网络层 → 传输层 → 上层协议层。

浙公网安备 33010602011771号