InfiniBand网络基础:架构、拓扑、链路层与网络层协议
要深入理解RDMA拥塞控制算法,首先必须掌握InfiniBand网络的基本运行机制。IB网络并非简单的“高速以太网”,而是一套为低时延、高带宽、低CPU开销而设计的完整体系结构。本节将聚焦于IB的架构分层、典型拓扑、链路层与网络层协议,为后续分析拥塞控制建立必要的协议背景。
2.1 InfiniBand整体架构:分层与核心组件
InfiniBand采用与TCP/IP类似的分层协议栈,但各层职责和语义完全不同。从下至上依次为:物理层、链路层、网络层、传输层,以及上层的软件协议(如IPoIB、SRP、SDP)。其中与拥塞控制直接相关的是链路层和网络层,但物理层的链路速率决定了拥塞出现的频率和规模。
IB网络中的核心硬件组件包括:
- HCA(Host Channel Adapter):服务器侧的主机通道适配器,相当于以太网中的NIC,负责将主机内存中的数据封装为IB报文,并处理传输层与链路层协议。
- Switch(交换机):在子网内转发数据包,仅处理链路层(L2)转发,不解析传输层内容。
- Router(路由器):连接不同IB子网(或IB与其它网络),处理网络层(L3)转发,基于GID(Global ID)进行路由。
- Subnet Manager(SM):运行在指定节点(通常为交换机或专用管理节点)上的软件,负责整个子网的拓扑发现、路径计算和LID分配。
2.2 拓扑结构:Fat-Tree与不规则拓扑
IB网络的物理拓扑决定了数据流的路径选择空间,也直接影响拥塞的分布特征。最常见的拓扑是Fat-Tree(胖树),它是一种多级无阻塞(或近似无阻塞)交换结构。以典型的三层Fat-Tree为例:
- 叶子层(Leaf):直接连接HCA,通常为36端口或更多端口的交换机。
- 脊层(Spine):连接所有叶子交换机,不直接连接HCA。
- 核心层(Core):在超大规模网络中,脊层之上再增加一层核心交换机,形成更宽的汇聚带宽。
Fat-Tree的关键特性是等分带宽:任意叶子节点之间都存在多条等价路径,SM通过自适应路由或静态轮询将流量分散到不同路径上。然而,即使拓扑无阻塞,流量模式(如多对一通信)仍会导致某个叶子交换机下行端口出现瞬时拥塞——这正是拥塞控制要解决的核心场景。
| 拓扑类型 | 典型规模 | 拥塞风险 | 适用场景 |
|---|---|---|---|
| 单层(Flat) | ≤ 36节点 | 低(无汇聚) | 小规模GPU集群 |
| 两层Fat-Tree | 数百节点 | 中等(多对一流量) | 中型HPC/超算 |
| 三层Fat-Tree | 数千节点 | 较高(长尾拥塞) | 大规模AI训练集群 |
| Dragonfly+ | 数万节点 | 高(分组间链路瓶颈) | 超大规模HPC |
2.3 链路层协议:LID寻址与流控机制
IB链路层使用LID(Local Identifier)作为子网内的二层地址。LID由SM在节点初始化时动态分配,16位长度,范围1~49151。每个HCA端口和交换机端口都拥有一个唯一的LID。链路层帧格式如下:
IB 链路层报文(LRH - Local Route Header)关键字段:
+----------------+--------+--------+--------+------------------+
| VL (4bit) | LVer | SL (4bit)| RLID (16bit) | LID (16bit) |
+----------------+--------+--------+--------+------------------+
| 源LID | 目的LID| 分组长度 | SRC端口 | DEST端口 |
+----------------+--------+--------+--------+------------------+
链路层最重要的机制是基于信用(Credit)的流控。每个接收端口维护一个信用计数器,表示当前可接收的数据量。发送方只有在收到接收方授予的信用后才能发送数据。这种机制从硬件层面保证了不丢包——只要信用管理正确,数据帧永远不会因接收缓存溢出而丢失。
信用流控分为两种:
- 链路级流控:相邻两个端口之间的信用协商,基于VL(Virtual Lane)独立进行。
- 端到端流控:可选机制,用于跨交换机端口的可靠传输,但实际部署较少。
信用流控虽然保证了链路不丢包,但也带来了拥塞扩散问题:当某个下游端口缓存满时,信用停止发放,上游交换机发送队列堆积,进而导致更上游的交换机也停止发放信用——这就是拥塞树(Congestion Tree)的形成过程。拥塞控制算法需要识别并打破这种树状扩散。
2.4 网络层协议:GID与路由
当数据包需要跨子网传输时,必须使用网络层。IB网络层地址称为GID(Global ID),长度为128位,由子网前缀(64位)+ GUID(64位)组成。GID的格式与IPv6地址类似,但语义不同:GID中的GUID是端口全球唯一标识符,由厂商烧录。
网络层报文头(GRH - Global Route Header)包含以下关键字段:
GRH 字段结构:
+------------------+------------------+------------------+------------------+
| IPVer (4bit) | TClass (8bit) | FlowLabel (20bit)| PayloadLen (16bit)|
+------------------+------------------+------------------+------------------+
| NextHeader (8bit)| HopLimit (8bit) | SGID (128bit) | DGID (128bit) |
+------------------+------------------+------------------+------------------+
其中TClass字段与拥塞控制密切相关——它承载了FECN(Forward Explicit Congestion Notification)和BECN(Backward Explicit Congestion Notification)标记位。当交换机检测到拥塞时,会在转发数据包的GRH中设置FECN位;接收端收到带FECN标记的包后,会生成CNP(Congestion Notification Packet)反向发送给发送端,通知其降低发送速率。
路由过程由SM预先计算并下发到各交换机的路由表中。SM使用最短路径算法(如Dijkstra)计算所有节点对之间的路径,并支持多路径(ECMP等价多路径)配置。路由器(L3设备)则基于DGID中的子网前缀进行跨子网转发。
2.5 拥塞控制相关字段与报文交互
在IB协议栈中,与拥塞控制直接相关的字段和报文包括:
- FECN(前向显式拥塞通知):由交换机在数据包转发时设置,标记该包经历了拥塞。
- BECN(后向显式拥塞通知):由交换机直接向发送端发送拥塞通知报文(较少使用)。
- CNP(拥塞通知报文):接收端收到带FECN标记的数据包后,向发送端回复的拥塞反馈报文。CNP携带拥塞的QP(Queue Pair)号和原因。
- CC(Congestion Control)管理报文:SM与交换机之间交换拥塞配置参数,如阈值、标记概率等。
一个典型的拥塞通知流程如下:
发送端HCA --数据包--> 交换机1 --数据包(FECN标记)--> 交换机2 --数据包(FECN)--> 接收端HCA
|
v
发送端HCA <--CNP报文-- 接收端HCA (生成CNP并反向发送)
|
v
发送端HCA 降低发送速率 (根据CNP中的拥塞程度)
2.6 常见误区与复盘
在学习IB网络基础时,以下误区值得特别关注:
链路层信用流控是逐跳的、基于硬件信用的机制,它保证不丢包,但无法感知端到端的拥塞状态。拥塞控制是端到端的、基于速率调节的机制。两者互补但不可替代。
实际上,HCA的发送队列、接收端的内存带宽、PCIe总线带宽都可能成为瓶颈。拥塞控制算法通常只关注交换机端口,但实际部署中需要结合主机侧监控。
IB支持16个VL,不同VL之间相互隔离,可以承载不同优先级流量。拥塞控制通常只作用于特定VL,避免影响高优先级控制流量。如果所有流量混在同一个VL中,拥塞控制的效果会大打折扣。