2. InfiniBand基础
InfiniBand(IB)并非简单的“高速网卡+交换机”组合,而是一套完整的、为高性能计算与数据中心设计的通道式互联架构。理解IB,首先需要建立分层模型的概念——它与TCP/IP协议栈有相似之处,但在设计哲学上截然不同:IB将可靠传输、流控、路由与拥塞管理下沉到硬件中,从而释放CPU资源。
2.1 IB整体架构:从物理端口到应用Socket
IB网络由四种基本组件构成:HCA(主机通道适配器)、交换机(Switch)、路由器(Router)和子网管理器(SM)。其中,HCA是服务器侧接入IB网络的接口卡,交换机负责子网内转发,路由器用于连接不同IB子网或与其他网络(如以太网)互通,而SM则承担整个子网的拓扑发现、路径计算与转发表下发任务。
IB协议栈分为物理层、链路层、网络层、传输层以及上层的软件协议(如IPoIB、SDP、SRP)。与TCP/IP不同,IB的链路层和网络层职责划分非常清晰:链路层负责同一子网内的帧传递与流控,网络层则负责跨子网的路由寻址。这种设计使得IB交换机在子网内部只需处理链路层转发,延迟极低。
2.2 链路层:LID寻址与流控机制
链路层是IB交换机的核心工作层。它负责在同一子网内将数据包从源端口转发到目的端口。链路层的关键要素包括:
- LID(Local Identifier):16位地址,由SM分配。每个IB端口至少有一个LID,交换机每个端口也有LID。子网内所有数据包转发均依据LID进行。
- SL(Service Level):3位字段,用于区分服务等级。SL值映射到VL(Virtual Lane),实现不同流量类型的隔离与优先级调度。
- VL(Virtual Lane):物理链路上的虚拟通道。IB链路支持最多16条VL(VL0~VL15),其中VL15专用于子网管理流量。VL机制实现了链路级流控——每条VL独立进行基于信用(Credit)的流控,避免某条VL的拥塞影响其他VL。
- 流控机制:IB采用基于信用的流控。接收端为每条VL维护一个信用计数器,发送端只有在收到信用授权后才能发送数据。这种机制从硬件层面保证了不丢包。
ibstat 或 ibswitches 命令可以查看端口的LID、链路速率和状态。例如,ibstat 输出中的 "Port LID" 字段即为此端口的LID值。
2.3 网络层:GID与跨子网路由
当数据包需要跨越IB子网边界时,链路层的LID寻址不再适用,此时需要启用网络层。IB网络层的核心是GRH(Global Route Header),它携带128位的GID信息。GID由64位子网前缀 + 64位端口GUID组成,格式类似于IPv6地址。
IB路由器(Router)负责处理跨子网的数据包。路由器查找转发表(由SM或管理员配置),根据目的GID决定下一跳。值得注意的是,IB路由器并不像以太网路由器那样执行复杂的路由协议(如OSPF),而是依赖SM集中计算路径并下发转发表项。这种集中式路由模式简化了设备实现,但要求SM具备全局视图。
| 特性 | 链路层(L2) | 网络层(L3) |
|---|---|---|
| 地址格式 | 16位LID | 128位GID(子网前缀+GUID) |
| 转发范围 | 子网内部 | 跨子网 |
| 路径计算 | SM计算,交换机线性转发 | SM或管理员配置路由器转发表 |
| 头部类型 | LRH | GRH(附加在LRH之上) |
| 典型设备 | IB交换机 | IB路由器 |
2.4 传输层:QP与可靠服务类型
传输层是IB协议栈中最体现“通道”思想的一层。它不关心数据如何路由,而是负责端到端的消息传递语义。传输层的核心对象是QP(Queue Pair,队列对)。每个QP由发送队列(SQ)和接收队列(RQ)组成,应用程序通过QP提交工作请求(WR),硬件异步完成数据传输。
IB定义了多种传输服务类型,最常用的是以下两种:
- 可靠连接(RC,Reliable Connection):两个QP之间建立一对一连接,支持RDMA读写操作,硬件保证数据包按序交付、不丢失、不重复。RC服务需要维护PSN(包序列号),并通过ACK/NACK机制实现可靠传输。
- 不可靠数据报(UD,Unreliable Datagram):类似UDP,一个QP可以向多个QP发送数据报,但不保证可靠交付。UD服务开销小,适合多播或简单请求-响应场景。
此外还有可靠数据报(RD)和不可靠连接(UC),但在实际部署中较少使用。传输层头部(BTH)包含关键字段:OpCode(标识操作类型,如RDMA_WRITE、SEND)、目的QP号、PSN(包序列号,用于排序与重传)。
2.5 案例:一个RDMA写操作的完整旅程
假设节点A上的应用程序希望将一块数据直接写入节点B的内存(RDMA写)。整个过程涉及IB各层的协同工作:
1. 节点A应用调用 ibv_post_send(),提交RDMA_WRITE工作请求到QP的发送队列
2. HCA硬件从内存中读取数据,封装传输层头部(BTH,OpCode=RDMA_WRITE)
3. 添加网络层头部(LRH,目的LID=节点B端口LID;若跨子网则添加GRH)
4. 物理层编码后,数据包通过链路发送至交换机
5. 交换机依据LRH中的DLID查找转发表,将数据包从对应端口转发出去
6. 数据包到达节点B的HCA,硬件剥离LRH/BTH
7. 节点B的HCA根据BTH中的目的QP号,将数据直接DMA写入应用指定的内存地址
8. 节点B的HCA生成ACK包,沿原路径返回节点A,确认写入完成
整个过程无需节点A和节点B的CPU参与数据搬运,也无需操作系统内核介入。这正是IB能够实现微秒级延迟和数十Gbps吞吐量的根本原因。
2.6 误区与复盘:IB分层中的常见理解偏差
- 误区一:认为IB交换机是三层设备。实际上,IB交换机通常只处理链路层(L2),不解析网络层头部。跨子网必须依赖独立的路由器设备。IB交换机的“路由”是指基于LID的转发,而非IP路由。
- 误区二:混淆SL与优先级。SL是服务等级标识,而VL是物理虚拟通道。SL到VL的映射由SM配置,同一SL可以映射到不同VL,反之亦然。拥塞控制基于VL而非SL。
- 误区三:忽视SM的作用。IB子网离开SM无法工作。SM负责发现拓扑、分配LID、计算路径并下发交换机的线性转发表。生产环境中SM通常运行在冗余服务器上(主备模式),使用
opensm或厂商管理软件。 - 误区四:将PSN与TCP序号混淆。PSN是传输层用于可靠传输的包序号,初始值在QP建立时协商,每个数据包递增。但PSN的校验和重传机制完全由硬件实现,且RC服务还支持选择性重传,与TCP的累积确认机制不同。