IB网络基础:InfiniBand协议栈架构详解

聊到InfiniBand,很多人第一反应就是「高速网络」。但说实话,IB能成为AI集群的标配,靠的不仅仅是速度快。它的协议栈设计,才是真正的精髓所在。我最早接触IB是在2018年搭建一个32卡V100集群的时候,当时被各种概念绕得头晕——物理层、链路层、网络层、传输层,每一层都有自己的一套规矩。今天我就把这些层一层层剥开,给你讲明白。

一句话总结:InfiniBand协议栈分为物理层、链路层、网络层、传输层四层,每一层各司其职,共同构建了一个低延迟、高带宽、高可靠的通信通道。

协议栈整体架构

先看一张我手绘的架构图,把各层的关系理清楚。

InfiniBand协议栈架构 应用层 (RDMA Verbs / MPI / NCCL) 传输层 (Transport Layer) RC / UC / RD / UD 四种传输服务 网络层 (Network Layer) 全局路由 (GRH) / 子网路由 (LRH) 链路层 (Link Layer) 数据包封装 / 流控 / 错误检测 物理层 (Physical Layer) 铜缆 / 光模块 / 信号编码 (8B/10B, 64B/66B) 数据流向:从上到下封装,从下到上解封装

这张图我画了好几次才满意。你看,从上到下是封装过程,从下到上是解封装过程。实际工作中,我们最常打交道的是传输层和链路层,物理层一般交给硬件工程师去操心。

物理层:信号的起点

物理层是IB网络的最底层,说白了就是线缆和接口那一套东西。我记得第一次给HDR100的网卡插线,差点把接口怼歪了——IB的接口比以太网紧得多,需要一点巧劲。

物理层主要管三件事:

  • 信号编码:早期用8B/10B编码(每10位传8位数据),现在HDR和NDR都用64B/66B编码,效率更高。我算过一笔账,64B/66B比8B/10B多了约20%的有效带宽。
  • 速率定义:从最早的SDR(2.5Gbps)到现在的NDR(400Gbps),每一代速率翻倍。目前主流是HDR(200Gbps)和NDR(400Gbps)。
  • 介质类型:铜缆(短距离,成本低)、有源光缆AOC(10-30米)、光模块+光纤(长距离)。

我的经验:GPU集群内部,GPU到Leaf交换机这一段,我建议用AOC光缆。铜缆虽然便宜,但线硬、弯折半径大,机柜里走线非常痛苦。我曾经在一个项目里为了省成本全用铜缆,结果运维同事差点跟我翻脸——线太硬了,根本理不顺。

链路层:数据包的搬运工

链路层是IB协议栈里最「忙」的一层。它负责把数据封装成数据包,然后在链路上传输。你可以把它想象成一个快递分拣中心——包裹怎么打包、怎么贴标签、怎么防止丢件,都是链路层的事。

链路层的关键机制:

  • 数据包格式:IB数据包由LRH(本地路由头)+ 数据载荷 + ICRC(不变CRC)+ VCRC(可变CRC)组成。LRH里包含了源LID和目的LID,这是IB网络里最基础的寻址方式。
  • 流控机制:IB使用基于信用的流控(Credit-Based Flow Control)。发送方必须先拿到接收方的「信用额度」才能发数据。这个机制保证了不会丢包——嗯,这是IB和以太网最大的区别之一。
  • 错误检测:ICRC保护路由头不变的部分,VCRC保护可变部分。双重校验,可靠性极高。

避坑指南:我曾经遇到过一个诡异的问题——集群跑NCCL AllReduce时偶尔报错,但ping测试一切正常。查了两天才发现,是一条光纤的VCRC校验偶尔出错。链路层的错误检测虽然能发现丢包,但不会自动重传(那是传输层的事)。所以如果你的应用层没有做容错,这种偶发错误会导致训练中断。

网络层:跨子网的路由

网络层负责跨子网的数据转发。在IB网络里,每个子网(Subnet)内部用LID寻址,跨子网则需要GID(全局ID)和GRH(全局路由头)。

这里有个容易混淆的点:

  • LID:16位本地标识符,只在子网内有效。类似于以太网的MAC地址,但更短。
  • GID:128位全局标识符,基于IPv6格式。跨子网通信时必须用GID。

实际部署中,大多数GPU集群都在同一个子网内,所以网络层用得不多。但如果你要跨机房、跨数据中心组网,那就必须理解GRH的转发逻辑了。

关键点:IB网络层不提供分片和重组功能。数据包大小必须小于路径MTU(通常4KB)。如果你的应用层发送的数据超过MTU,需要自己分片——这一点和TCP/IP很不一样。

传输层:可靠性的保障

传输层是IB协议栈里最「聪明」的一层。它提供了四种传输服务,每种服务对应不同的应用场景。

传输服务 全称 可靠性 典型应用
RC 可靠连接 高(有确认重传) MPI通信、NCCL
UC 不可靠连接 低(无确认) 流媒体、实时数据
RD 可靠数据报 高(有确认) 多播、广播场景
UD 不可靠数据报 低(无确认) 管理报文、简单查询

在GPU集群里,我们99%的场景都用RC服务。为什么?因为NCCL和MPI都需要可靠传输,一旦丢包就要重传整个消息,代价极高。我见过有人为了省资源用UD服务跑MPI,结果训练速度直接腰斩——丢包重传的开销远大于RC本身的维护开销。

我的建议:搭建GPU集群时,传输层一定要选RC。虽然每个连接需要消耗QP(队列对)资源,但现代网卡(比如ConnectX-7)支持上百万个QP,完全不用担心资源不够。我一般给每个GPU分配4-8个QP,足够用了。

各层之间的协作

说了这么多层,它们到底怎么配合工作的?我举个实际例子:

  1. 应用层(比如NCCL)调用RDMA Verbs接口,发起一次写操作。
  2. 传输层把这次写操作封装成一个传输层数据包,加上BTH(基本传输头),指定使用RC服务。
  3. 网络层加上GRH(如果需要跨子网),否则只保留LRH。
  4. 链路层加上ICRC和VCRC,形成完整的IB数据包。
  5. 物理层把数据包编码成电信号或光信号,发送到线缆上。

接收端反过来:物理层解码 → 链路层校验 → 网络层路由 → 传输层确认 → 应用层拿到数据。整个过程在硬件里完成,延迟只有几百纳秒。

核心要点:IB协议栈的每一层都在硬件中实现(网卡芯片里),不需要CPU参与。这就是RDMA「零拷贝」和「低延迟」的根本原因。相比之下,传统以太网协议栈需要CPU逐层处理,延迟高出一个数量级。

总结

InfiniBand协议栈的四层架构,每一层都有自己的职责,但又紧密配合。物理层管信号,链路层管封装和流控,网络层管跨子网路由,传输层管可靠性。理解这些层,你就能看懂IB网络里各种问题的根因。

我记得刚入行时,有个老工程师跟我说:「搞懂IB协议栈,你就搞懂了高性能网络的一半。」现在回头看,这话一点不假。下一节我们会深入链路层,聊聊数据包格式和流控机制的细节——那才是真正考验功底的地方。


公众号:蓝海资料掘金营,微信deep3321