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

InfiniBand(IB)并非简单的“高速网卡+交换机”,而是一套完整的通道式互联架构。理解它的起点,是建立三个关键认知:子网是管理域、LID是子网内寻址、GID是跨子网寻址。本节将梳理这些核心概念,并勾勒协议栈的分层逻辑。

2.1 核心概念与术语

2.1.1 子网与子网管理器(SM)

一个IB子网由若干节点(主机、交换机、路由器)通过链路互连而成,并由一个子网管理器(Subnet Manager, SM)统一管控。SM负责发现拓扑、分配LID、计算路由表并下发到各交换机。SM通常运行在某个计算节点上(如Mellanox的opensm),也可配置为双机热备。

关键点:IB子网内的所有转发决策都由SM预先计算并下发,数据报文本身不携带路由信息,这与以太网的逐跳自学习机制有本质区别。

2.1.2 LID与GID

  • LID(Local Identifier):16位地址,由SM在子网内动态分配,仅在本地子网有效。LID用于子网内交换机的转发决策,每个端口至少有一个LID,可配置多个(用于多路径)。
  • GID(Global Identifier):128位地址,由“子网前缀(64位)+ 端口GUID(64位)”构成。GID用于跨子网通信,类似于IPv6地址。子网前缀由SM配置,端口GUID出厂时烧录。
地址类型长度分配方式作用域典型用途
LID16 bitSM动态分配子网内交换机转发、数据包寻址
GID128 bit子网前缀+GUID跨子网路由器寻址、RoCE v2
GUID64 bit出厂烧录全局唯一标识端口/设备

2.1.3 其他关键术语

  • Queue Pair(QP):通信端点,由QP号(QPN)标识。每个QP包含发送队列和接收队列,软件通过QP发起数据传输。
  • Work Request(WR):软件下发的传输请求,描述数据缓冲、长度、操作类型等。
  • Completion Queue(CQ):异步通知机制,硬件完成WR后向CQ写入完成事件。
  • Partition Key(P_Key):16位分区标识,用于子网内隔离,类似VLAN。
  • MTU:IB链路层最大传输单元,常见为2048/4096字节,远大于以太网的1500字节。

2.2 协议栈概述

IB协议栈分为物理层、链路层、网络层、传输层,上层软件接口为Verbs API。与TCP/IP不同,IB的传输层直接面向内存语义,支持RDMA操作。

InfiniBand 协议栈分层与核心机制 应用层 用户应用(数据库、存储、HPC中间件) Verbs API(软件接口:ibverbs / librdmacm) 传输层 QP(队列对)· WR(工作请求)· CQ(完成队列) 传输类型:RC / UC / UD / RD(可靠/不可靠连接、数据报) 网络层 全局路由头(GRH)· 跨子网寻址(GID)· 路由器转发 链路层 LID寻址 · 子网管理器(SM)· 交换机转发 · 流控 P_Key分区 · QOS · 链路层重传(可靠模式) 物理层 1x / 4x / 12x 链路 · 速率:SDR / DDR / QDR / FDR / EDR / HDR / NDR 核心机制 RDMA 内存语义 内核旁路(Kernel Bypass) 零拷贝传输 SM 集中式路由管理 LID 子网内寻址 GID 跨子网寻址 P_Key 分区隔离 QOS 服务等级 硬件卸载 多路径(LID Mask) 链路级流控 CRC 错误检测 数据下行 / 控制上行

上图展示了IB协议栈的纵向分层关系。其中传输层是RDMA的核心,它直接面向内存操作;链路层则承载了子网管理的全部逻辑。需要特别注意的是,IB的“网络层”仅在跨子网通信时启用,子网内部通信不经过网络层。

2.3 核心原理:从Verbs到硬件

一次典型的RDMA写操作流程如下:

  1. 软件调用ibv_post_send(),将一个WR(工作请求)提交到QP的发送队列。
  2. 硬件(HCA)从内存中读取WR描述的数据缓冲,直接通过DMA将数据发送到对端。
  3. 对端硬件收到数据后,根据WR中的目的内存地址,通过DMA将数据直接写入目标内存。
  4. 两端硬件分别向各自的CQ写入完成事件(CQE),通知软件操作已完成。
理解要点:整个过程中,CPU不参与数据搬运,仅负责提交请求和接收完成通知。这就是“内核旁路”和“零拷贝”的实质。

2.4 案例:集群中LID与GID的分配

假设一个双节点集群,每个节点配置一块双端口HCA,通过一台IB交换机互连。SM启动后执行以下操作:

# 查看SM分配的LID(以opensm为例)
# 节点A的HCA端口1
ibstat | grep -E "Port|Lid"
    Port 1:
        State: Active
        Physical State: LinkUp
        LID: 0x01
        GID: fe80::0000:0000:0000:0001

# 节点B的HCA端口1
    Port 1:
        State: Active
        Physical State: LinkUp
        LID: 0x02
        GID: fe80::0000:0000:0000:0002

# 交换机端口LID
# 交换机本身也有LID,用于SM管理通信
ibswitches
    Switch 0x0002c9030000abcd:
        LID: 0x03

在这个例子中,LID 0x01和0x02分别标识两个节点的端口,交换机端口LID为0x03。当节点A向节点B发送数据时,交换机根据目的LID(0x02)查找转发表,将报文从对应端口转发出去。整个过程不涉及IP地址或MAC地址。

2.5 常见误区与复盘

误区1:将LID等同于IP地址。
LID仅在子网内有效,且由SM动态分配。如果重启SM或拓扑变化,LID可能改变。而IP地址在IB网络中是可选配置(通过IPoIB),用于上层应用,不参与IB转发决策。
误区2:认为GID就是GUID。
GID是128位地址,由“子网前缀+GUID”组成。GUID是64位硬件标识,出厂固定。同一端口在不同子网中会获得不同的GID,但GUID不变。
误区3:忽略P_Key的作用。
P_Key用于子网内分区隔离。如果两个节点P_Key不匹配,即使LID可达,也无法通信。在配置多租户集群时,P_Key是重要的安全边界。
复盘建议:在排查IB通信故障时,首先使用ibstatus确认端口状态和LID,再使用ibping测试LID连通性,最后检查P_Key配置。不要一开始就怀疑物理链路。

2.6 小结