InfiniBand基础:核心概念、术语与协议栈

InfiniBand(IB)并非简单的“高速网卡+交换机”组合,而是一套完整的通道式I/O架构。理解IB的第一步,是建立三个基本认知:子网是管理域、QP是通信端点、协议栈是分层封装。本节将围绕这三个认知,梳理IB中最核心的概念与术语。

2.1 子网与子网管理器(Subnet Manager, SM)

一个IB子网(Subnet)由一组交换机、链路和端节点(Host Channel Adapter, HCA)构成。子网内所有设备共享同一个子网管理器的控制域。SM是整个子网的“大脑”,负责:

  • 发现:通过SMP(Subnet Management Packet)探测拓扑中的节点和链路。
  • 寻址:为每个端口分配唯一的LID(Local Identifier)。
  • 路由计算:生成转发数据库(Forwarding Database),决定数据包在子网内的路径。
  • 监控与重配置:检测链路故障并重新计算路径。
关键认知:SM是软件实体,通常运行在某个端节点(如交换机管理端口或专用服务器)上。子网内可以有多个SM,但同一时刻只有一个主SM(Master SM)处于激活状态,其余为备用。

与SM配套的还有子网管理代理(Subnet Management Agent, SMA)——每个IB设备内部都驻留一个SMA,负责响应SM发来的管理报文,上报自身状态。SM与SMA之间通过SMP通信,SMP使用目的LID=0xFFFF(管理专用地址)进行定向发送。

2.2 寻址体系:LID、GID与全局路由

IB的寻址分为子网内和子网间两个层次,对应两种地址格式:

地址类型 长度 作用域 分配方式 典型用途
LID 16 bit 子网内 SM动态分配 子网内数据包转发(类似以太网MAC)
GID 128 bit 子网间/全局 由SM + 端口GUID生成 跨子网路由(类似IPv6地址)
GUID 64 bit 全局唯一 出厂烧录 标识设备/端口身份(类似MAC)

LID是IB子网内实际转发使用的地址。每个IB端口至少有一个LID,也可以有多个(用于多路径)。LID由SM在子网初始化时分配,并在拓扑变化后重新分配。GID则用于全局路由,其格式为:GID = 子网前缀(64bit) + 端口GUID(64bit)。默认子网前缀是0xFE80000000000000(链路本地),跨子网时需要配置全局前缀。

类比理解:如果把IB子网比作一个园区,LID就是园区内的门牌号(SM统一编号),GID就是“城市+街道+门牌”的完整地址(用于跨园区通信),而GUID则是每栋建筑的唯一不动产登记号(出厂固定)。

2.3 队列对(Queue Pair, QP)与通信模型

IB的通信模型基于队列对。每个QP由两部分组成:

  • 发送队列(Send Queue, SQ):存放待发送的工作请求(Work Request, WR)。
  • 接收队列(Receive Queue, RQ):存放接收缓冲区描述符,用于接收对端数据。

应用程序通过动词(Verbs)接口向QP提交工作请求,硬件(HCA)负责将请求转换为数据包发送到网络中。QP的通信模式分为两类:

  1. 可靠连接(RC, Reliable Connected):一对一连接,硬件保证按序、不丢失、不重复,类似TCP。
  2. 不可靠数据报(UD, Unreliable Datagram):一对多发送,无重传机制,类似UDP,但支持多播。

此外还有可靠数据报(RD)和不可靠连接(UC),但实际部署中RC和UD占绝对主导。QP通过QP号(QPN)在端节点内唯一标识,通信双方需要交换LID + QPN + P_Key(分区键)才能建立连接。

2.4 协议栈分层与报文封装

IB协议栈自下而上分为物理层、链路层、网络层、传输层,上层承载应用数据。与TCP/IP不同,IB的传输层和网络层通常由HCA硬件直接处理,CPU不参与数据搬移。

+----------------------------+
| 上层协议 (Sockets, SDP,   |
|  MPI, NVMe-oF, etc.)       |
+----------------------------+
| 传输层 (IB Transport)      |
|  - 报文封装 (BTH+扩展头)   |
|  - 可靠性/分段/重组         |
+----------------------------+
| 网络层 (IB Network)        |
|  - 全局路由头 (GRH)        |
|  - 仅跨子网时存在          |
+----------------------------+
| 链路层 (IB Link)           |
|  - LID路由 (LRH)           |
|  - 流控/错误检测 (CRC)     |
+----------------------------+
| 物理层 (IB Physical)       |
|  - 4x/12x 通道, 2.5/5/10/ |
|    14/25 Gbps per lane     |
+----------------------------+

一个典型的IB数据包(以跨子网为例)包含以下头部:

  • LRH(Local Route Header):携带源/目的LID,用于子网内交换机逐跳转发。
  • GRH(Global Route Header):携带源/目的GID,仅当跨子网时存在,类似IPv6头。
  • BTH(Base Transport Header):携带QP号、操作码、分组序号(PSN),是传输层的核心。
  • 数据负载:用户数据,最大MTU通常为4096字节(4K)。
  • ICRC/VCRC:不变CRC(端到端校验)和可变CRC(逐链路校验)。

2.5 其他关键术语速查

术语 全称/含义 作用简述
HCA Host Channel Adapter 端节点上的IB接口卡,提供QP管理和DMA能力
P_Key Partition Key 16位分区标识,用于隔离子网内的不同租户/业务
SL Service Level 4位服务等级,用于QoS和虚拟通道(VL)映射
MTU Maximum Transmission Unit 链路层最大数据包大小,常见256~4096字节
RKey Remote Key RDMA读写操作的远程内存访问密钥
CQ Completion Queue 异步通知应用“发送/接收完成”的队列

2.6 案例:一个RDMA写操作的地址解析流程

假设节点A要向节点B发起一次RDMA写操作,完整流程如下:

  1. 节点A的应用创建QP,并通过CM(Connection Manager)与节点B交换LID、QPN、P_Key、RKey等参数。
  2. 节点A的HCA构造数据包:填入目的LID=B的LID(LRH)、目的QP=B的QPN(BTH)、目的RKey(RETH头)。
  3. 数据包进入子网后,交换机仅依据LRH中的目的LID逐跳转发,不解析上层头部。
  4. 数据包到达节点B的HCA,硬件检查QP号、P_Key、RKey,确认合法后将数据直接DMA写入应用指定的内存地址。
  5. 节点B的HCA生成完成事件(CQE),通知应用数据已落盘。
常见误区:很多人误以为IB路由像IP一样逐跳解析目的IP。实际上,IB交换机只查LID转发表,不感知QP和GID。GID仅在源端和目的端的HCA中用于判断“是否跨子网”以及“如何封装GRH”。因此,LID分配的正确性直接决定子网内通信是否可达。

2.7 误区与复盘:LID与GID的混淆

初学者最容易混淆的是LID和GID的职责边界。请记住以下三条判别规则:

  • 交换机转发只看LID——LID是子网内的“转发地址”,类似以太网MAC。
  • 端到端识别用GID——GID用于跨子网时定位目标端口,类似IPv6地址。
  • QP是通信会话的标识——同一对LID之间可以建立多个QP,分别承载不同应用或连接。

另一个高频错误是忽略P_Key的作用。即使LID和QP都正确,如果两端P_Key不匹配,数据包会被HCA直接丢弃。P_Key相当于子网内的“VLAN隔离”,在共享IB集群中必须严格规划。

最后,务必理解SM的故障影响:SM只在拓扑变化时介入(如链路up/down、节点加入),稳态数据转发不经过SM。但若SM宕机且无备用,新节点将无法获得LID,已建立的连接不受影响。因此生产环境必须配置至少两个SM(主备模式)。

IB子网通信核心要素关系图 IB子网 (Subnet) 节点A (HCA) LID: 0x0001 GID: fe80::1 QP#: 0x1234 P_Key: 0x7FFF 节点B (HCA) LID: 0x0002 GID: fe80::2 QP#: 0x5678 P_Key: 0x7FFF IB交换机 转发依据: 目的LID 不解析QP/GID LRH(目的LID=2) LRH(目的LID=2) 子网管理器 (SM) 分配LID · 计算路由 · 监控拓扑 SMP管理报文 IB协议栈分层 应用层 (MPI, NVMe-oF...) 传输层 (BTH, QP, PSN) 网络层 (GRH, GID) 链路层 (LRH, LID, CRC) 物理层 (4x/12x, 速率) 关键数据流与决策点 ① 应用创建QP → 通过CM交换 LID/QPN/P_Key ② 发送端封装: LRH(目的LID) + BTH(目的QP) + 数据 ③ 交换机仅查LID转发表 → 逐跳转发到目的端口 ④ 接收端HCA校验: QP号 + P_Key + RKey → DMA写入 ⚠ 常见误区 · 交换机不解析GID/QP,只认LID · P_Key不匹配时数据包被静默丢弃

上图展示了IB子网内一次通信涉及的核心要素:SM负责分配LID并维护转发表;数据包在交换机间依据LID转发;QP和P_Key仅在端节点HCA处校验。理解这张图,就掌握了IB寻址与转发的骨架。