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配套的还有子网管理代理(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(链路本地),跨子网时需要配置全局前缀。
2.3 队列对(Queue Pair, QP)与通信模型
IB的通信模型基于队列对。每个QP由两部分组成:
- 发送队列(Send Queue, SQ):存放待发送的工作请求(Work Request, WR)。
- 接收队列(Receive Queue, RQ):存放接收缓冲区描述符,用于接收对端数据。
应用程序通过动词(Verbs)接口向QP提交工作请求,硬件(HCA)负责将请求转换为数据包发送到网络中。QP的通信模式分为两类:
- 可靠连接(RC, Reliable Connected):一对一连接,硬件保证按序、不丢失、不重复,类似TCP。
- 不可靠数据报(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写操作,完整流程如下:
- 节点A的应用创建QP,并通过CM(Connection Manager)与节点B交换LID、QPN、P_Key、RKey等参数。
- 节点A的HCA构造数据包:填入目的LID=B的LID(LRH)、目的QP=B的QPN(BTH)、目的RKey(RETH头)。
- 数据包进入子网后,交换机仅依据LRH中的目的LID逐跳转发,不解析上层头部。
- 数据包到达节点B的HCA,硬件检查QP号、P_Key、RKey,确认合法后将数据直接DMA写入应用指定的内存地址。
- 节点B的HCA生成完成事件(CQE),通知应用数据已落盘。
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子网内一次通信涉及的核心要素:SM负责分配LID并维护转发表;数据包在交换机间依据LID转发;QP和P_Key仅在端节点HCA处校验。理解这张图,就掌握了IB寻址与转发的骨架。