3、IB网络协议:数据包格式与核心服务

各位同学,今天我们来聊聊InfiniBand网络协议的核心内容。这部分内容,说白了就是IB网络通信的“交通规则”。你只有理解了数据包怎么封装、SM怎么管理网络、SA怎么提供服务,才能真正看懂故障现象。

我个人习惯把IB协议分成两大部分来看:数据面控制面。数据面就是数据包格式和通信服务类型,控制面就是SM和SA。咱们一个一个来拆解。

3.1 IB数据包格式

IB的数据包,其实比以太网要复杂一些。它分为两个层级:本地路由头(LRH)全局路由头(GRH)。嗯,这里要注意,不是所有包都有GRH,只有跨子网通信时才需要。

先看一个典型的IB数据包结构:

+----------------+----------------+----------------+----------------+
|   LRH (8字节)   |   GRH (40字节)  |   BTH (12字节)  |    Payload     |
| (必须存在)      | (可选,跨子网)  | (基本传输头)    | (0-4096字节)   |
+----------------+----------------+----------------+----------------+
|   ETH (4字节)   |   ICRC (4字节)  |   VCRC (4字节)  |                |
| (扩展传输头)    | (不变CRC)      | (可变CRC)      |                |
+----------------+----------------+----------------+----------------+

我在项目中遇到过一个问题:某次集群性能突然下降,排查了半天,最后发现是LRH中的VL(虚拟通道)字段被错误配置了。你想想看,一个字节的差异,就能让整个集群的吞吐量掉一半。

关键字段解读:

  • LRH:包含源LID、目的LID、VL、SL等。LID是本地标识符,类似于以太网的MAC地址,但只有16位。
  • GRH:包含128位的源GID和目的GID。GID其实就是IPv6地址格式,用于跨子网路由。
  • BTH:包含OpCode、目的QP号、分组序列号(PSN)。PSN是IB可靠传输的关键,乱序重传全靠它。

重要提示:IB数据包最大传输单元(MTU)是4096字节,比以太网的1500字节大得多。这意味着IB在大数据块传输时效率更高。但要注意,如果MTU配置不一致,会导致分片和重组,性能会大打折扣。

3.2 Subnet Manager (SM) 工作原理

SM是IB网络的“大脑”。没有它,所有端口都只能处于初始化状态,无法通信。SM负责发现网络拓扑、分配LID、计算路由表。

SM的工作流程,我总结为三步:

  1. 发现阶段:SM通过SMP(子网管理包)扫描所有交换机、HCA(主机通道适配器),构建完整的拓扑图。
  2. 分配阶段:为每个端口分配唯一的LID。注意,一个端口可以有多个LID,但主LID只有一个。
  3. 路由计算:基于拓扑和路径策略,计算所有端到端的最优路径。这里支持多路径(多路径路由,MPR)。

我曾经遇到过一个案例:某数据中心新增了4台GPU服务器,但死活连不上存储。排查后发现,SM的拓扑发现超时了——因为新加的交换机固件版本太老,响应SMP包的速度太慢。嗯,这种问题在混合厂商设备时特别常见。

避坑指南:我曾经在升级SM固件时,没有先备份当前配置。结果升级后所有LID重新分配,导致上层应用全部断连。记住:操作SM前,一定要用ibswinfoibnetdiscover保存当前拓扑。

3.3 Subnet Administration (SA) 服务

SA是SM的“信息中心”。它不直接管理网络,而是提供查询服务。比如,一个节点想知道“到某个LID的路径是什么”,就可以通过SA查询。

SA的核心功能:

  • 路径查询:返回源到目的的最优路径,包括SL(服务等级)和VL。
  • 多播管理:管理多播组的加入和离开。IB的多播比以太网复杂,需要SA维护多播树。
  • 服务记录:注册和查询服务名称(比如“存储服务A”对应的LID和QP号)。

说白了,SA就是IB网络的“黄页”。你打电话问“到某某地方怎么走”,SA告诉你“走哪条路、用什么等级”。

在实际故障排查中,我经常用ibqueryerrorssaquery这两个工具。比如:

# 查询所有端口的路径信息
saquery -p

# 查询多播组信息
saquery -m

如果SA响应超时,通常意味着SM负载过高或者网络中存在环路。我曾经在4000节点集群上遇到过SA查询风暴——某个应用疯狂查询路径,导致SA队列溢出,整个网络管理平面瘫痪。

3.4 通信服务类型

IB提供了四种通信服务,我按使用频率排序:

服务类型 全称 可靠性 连接方式 典型应用
RC 可靠连接 可靠 点对点连接 MPI、存储协议
UC 不可靠连接 不可靠 点对点连接 视频流、实时数据
UD 不可靠数据报 不可靠 无连接 管理消息、广播
RD 可靠数据报 可靠 无连接 较少使用,特殊场景

RC(可靠连接):这是IB最常用的服务。它建立一对一的连接,保证数据按序到达,丢失自动重传。MPI通信几乎都用RC。我建议:只要你的应用需要可靠传输,优先选RC。

UC(不可靠连接):它也有连接,但不保证可靠性。数据丢了就丢了,不会重传。适合对延迟敏感、能容忍少量丢包的应用,比如视频监控。

UD(不可靠数据报):无连接,类似于UDP。每个包独立发送,不需要建立连接。SM和SA之间的通信就用UD。你想想看,如果SM用RC,那SM挂了之后所有连接都断了,还怎么恢复?

RD(可靠数据报):这个用得很少。它结合了UD的无连接特性和RC的可靠性,但实现复杂,硬件支持也不够普遍。我在实际项目中几乎没见过RD的部署。

注意:不要混淆“连接”和“可靠”。RC既有连接又可靠,UC有连接但不可靠,UD无连接且不可靠。RD无连接但可靠。选型时,先问自己三个问题:需要连接吗?需要可靠吗?延迟要求多高?

知识体系总览

下面这张图,是我自己整理的IB协议核心逻辑。你可以把它当作本章的“地图”:

IB网络协议核心知识体系 数据包格式 • LRH (8B, 必须) • GRH (40B, 可选) • BTH (12B, 传输头) • Payload (0-4096B) • ICRC/VCRC (校验) MTU最大4096字节 控制面 (SM/SA) • SM: 拓扑发现 • SM: LID分配 • SM: 路由计算 • SA: 路径查询 • SA: 多播管理 使用SMP/SA协议通信 通信服务类型 • RC: 可靠连接 • UC: 不可靠连接 • UD: 不可靠数据报 • RD: 可靠数据报 选型三问: 需要连接? 需要可靠? 延迟? 数据面 控制面 故障排查核心思路 先看数据面(包格式、服务类型)→ 再看控制面(SM/SA状态) 常用工具: ibdiagnet, ibqueryerrors, saquery, ibnetdiscover —— 本章核心:理解IB协议的两面性 ——

这张图把本章内容分成了三大块:数据包格式、控制面(SM/SA)、通信服务。你排查故障时,就按这个顺序来:先看数据面有没有问题(比如MTU不匹配、PSN乱序),再看控制面(比如SM是否在运行、SA是否响应)。

好了,IB协议的核心内容就这些。记住:数据包格式是基础,SM/SA是大脑,通信服务是工具。下次遇到IB网络问题,先问自己:是数据面还是控制面?是RC还是UD?这样排查思路就清晰了。

一句话总结:IB网络故障,80%出在SM配置错误或通信服务类型不匹配上。剩下的20%,才是硬件问题。

专注资料整理