1.概述
包(Packets)是IBA(InfiniBand Architecture)网络传输的最小单元。消息(Message,即数据)被分割成可以传输的段,然后组装成包,接着发送到IBA网络上,经过路由,最终到达目的地。数据包有如下的特性:
- 不可分割的传输和路由单元
- 确认(acknowledgement)的基本单元
- 消息的分割和重新组装单元
- 链路级流量控制单元

在包的传输中,通常使用两种主要类型的传输方式:
- IBA包(IBA Packets )具备由IBA定义的传输报头,通过IBA架构网络进行路由,并运用原生的IBA传输机制。
- 原始包(Raw Packets)可在InfiniBand架构网络上进行路由,但不包含IBA定义的传输报头。从InfiniBand的角度看,这些数据包仅包含IBA路由报头、有效载荷和循环冗余校验码。IBA未对链路层和网络层之上这些数据包的处理方式进行定义。其设计初衷是支持在InfiniBand架构上运行非IBA传输协议。
2.包格式
2.1.简介
如下图所示,IBA总共定义了4种包格式。在传输头和数据负载之前定义了两种路由头。本地路由头(local route header)提供子网内的路由信息,所有包都必须包含。全局路由头(global route header)提供跨子网的路由信息,对于所有要路由到不同子网的包和所有多播包,无论目的地如何,都需要全局路由头,除了子网管理包之外,全局路由头可以放在任何包上。如果使用IPv6路由,则可以IPv6路由头代替全局路由头。本地和全局包以一个不变的CRC结束,后面跟着一个可变的CRC。每个原始包以一个变体CRC结束。

2.2.结构
IBA包详细的结构如下所示。主要分为本地路由头(Local Routing Header)、全局路由头(Global Routing Header)、基本传输头(Base Transport Header)、扩展传输头(Base Transport Header)、R_Key或者立即数(R_Key or Immediate Data)、数据负载(Message Payload)、不变CRC(Invariant CRC)和可变CRC(Variant CRC)。

- 本地路由头(Local Routing Header)
提供子网内的路由信息。 - 全局路由头(Global Routing Header)
提供跨子网的路由信息,对于所有要路由到不同子网的包和所有多播包,无论目的地如何,都需要全局路由头,除了子网管理包之外,全局路由头可以放在任何包上。 - 基本传输头(Base Transport Header)
定义IBA传输层的重要功能,如定义了可靠连接、不可靠连接、可靠数据包等报文类型。 - 扩展传输头(Extended Transport Header)
不同的基本传输头,对应的扩展传输头也不同。具体如下:- 可靠数据报扩展传输头部(RDETH)包含用于可靠数据报服务的附加传输字段。仅当BTH Opcode字段指示为Reliable Datagram(RD)报文时,才会出现RDETH。
- 数据报扩展传输头部(DETH)包含用于数据报服务的附加传输字段。仅当BTH Opcode字段指示为Unreliable Datagram(UD)报文时,才会出现DETH。
- RDMA扩展传输头部(RETH)包含用于RDMA操作的附加传输字段。仅当BTH Opcode字段指示为RDMA请求的第一个(或唯一)报文时,才会出现RETH。比如RDMA WRITE First、RDMA WRITE Only、RDMA READ Request报文。
- 原子操作扩展传输头部(AtomicETH)包含用于原子操作报文的附加传输字段。仅当BTH Opcode字段指示为原子操作报文时,才会出现AtomicETH。比如CmpSwap、FetchAdd报文。
- XRC扩展传输头部(XRCETH)包含目标XRC共享接收队列标识符。仅当BTH Opcode字段指示为Extended Reliable Connection(XRC)报文时,才会出现XRCETH。
- 确认扩展传输头部(AETH)包含用于确认报文的附加传输字段。仅当BTH Opcode字段指示为Acknowledge、 RDMA READ Response First、RDMA READ Response Last和RDMA READ Response报文时,才会出现AETH。
- 原子操作确认扩展传输头部(AtomicAckETH)包含用于原子操作确认报文的附加传输字段。仅当BTH Opcode字段指示为ATOMIC Acknowledge报文时,才会出现AtomicAckETH。
- 立即数据扩展传输头部(ImmDt)包含将被放到接收完成队列元素(CQE)中的附加数据。仅当BTH Opcode字段指示为携带立即数据的Send或RDMA Write报文时,才会出现该头部。比如SEND Last with Immediate、SEND Only with Immediate、RDMA WRITE Last with Immediate、RDMA WRITE Only with Immediate报文。ImmDt的核心作用是在传输数据的同时,附带传递一段简短的元数据信息,并直接递交给接收端的上层应用。元数据可以是控制或标识信息,具体由应用定义。
- 作废扩展传输头部(IETH)包含一个R_Key字段,响应方在接收该报文后,Invalidate R_Key表示的内存窗口或者内存区域。SEND Last with Invalidate和SEND Only with Invalidate报文会携带IETH。
- 数据负载(Payload)
Payload表示端到端传输的应用数据。RDMA READ Requests、Acknowledge、CmpSwp、FetchAdd和Atomic Acknowledge报文不包含Payload。Payload的最小长度为0,最大长度为MTU。所有包含Payload的IBA消息,除消息的最后一个或唯一数据包外,其他数据包Payload的长度应该为MTU。携带Payload的IBA数据包应包含一个0-3字节的填充字段,用于将Payload对齐至4字节的倍数(即有效载荷大小与填充字段之和始终为4字节的倍数)。该数据包中实际使用的填充字段大小应由BTH中的PadCnt字段指明。 - 不变CRC(Invariant CRC)
不变CRC(ICRC)覆盖从源端到目的端传输过程中保持不变的数据包字段。ICRC仅存在于IBA数据包中,原始数据包不包含此校验。ICRC具体覆盖哪些字段取决于全局路由头是否存在。 - 可变CRC(Variant CRC)
可变CRC(VCRC)覆盖在链路间传输过程中可能发生变化的字段。VCRC存在于所有类型的数据包中,包括IBA数据包和原始数据包。该校验码可在网络Fabric中重新生成。
2.2.1.Local Route Header(LRH) - 8 BYTES
| Field Name | Field Abbreviation | Field Size (in bits) | Description |
|---|---|---|---|
| Virtual Lane | VL | 4 | 该字段标识该数据包正在使用的虚拟通道(Virtual Lane)。 |
| Link Version | LVer | 4 | 该字段标识链路层协议以及该数据包所使用的本地路由头(LRH)的版本号。该版本适用于通用的数据包结构,包括 LRH 各字段以及所使用的 CRC 变体类型。 |
| Service Level | SL | 4 | 该字段指示该数据包在子网内请求的服务级别(Service Level)。 |
| Reserved | 2 | 发送时该字段置为 0,接收时忽略。 | |
| Link Next Header | LNH | 2 | 该字段用于标识在 LRH 之后紧跟的下一层头部类型。 |
| Destination Local ID | DLID | 16 | 该字段标识本地子网中数据包的目的端口和路径(即数据接收端)。 |
| Reserved | 5 | 发送时该字段置为 0,接收时忽略。 | |
| Packet Length | PktLen | 11 | 该字段以 4 字节字为单位标识数据包的长度。长度范围从 LRH 的第一个字节开始,到可变 CRC 之前的最后一个字节为止。 |
| Source Local ID | SLID | 16 | 该字段标识本地子网中数据包的源端口(即注入点)。 |
2.2.2.Global Route Header(GRH) - 40 BYTES
| Field Name | Field Abbreviation | Field Size (in bits) | Description |
|---|---|---|---|
| IP Version | IPVer | 4 | 该字段指示全局路由头(GRH)的版本号。 |
| Traffic Class | TClass | 8 | 该字段由 IBA 用于传递全局服务级别(Global Service Level)信息。 |
| Flow Label | Flow-Label | 20 | 该字段用于标识需要特殊处理的一组数据包序列。 |
| Payload length | PayLen | 16 | 对于 IBA 数据包,该字段指定从 GRH 之后的第一个字节开始,到 ICRC 的最后一个字节(包含)为止的字节数。对于原始 IPv6 数据报,该字段指定从 GRH 之后的第一个字节开始,到 VCRC 或任何填充字段之前(不包含)为止的字节数,以保证数据包长度为 4 字节的整数倍。对于原始 IPv6 数据报,所需的填充长度由 GRH:PayLen 字段的低 2 位决定。注意:GRH:PayLen 与 LRH:PktLen 含义不同。 |
| Next Header | NxtHdr | 8 | 该字段标识紧随 GRH 之后的头部类型。该字段用于与 IPv6 头部保持兼容,应指示 IBA 传输层协议。 |
| Hop Limit | HopLmt | 8 | 该字段对数据包在被丢弃前可跨越的子网跳数设定一个严格上限,该限制由路由器强制执行。 |
| Source GID | SGID | 128 | 该字段标识将数据包注入网络的端口对应的全局标识符(GID)。 |
| Destination GID | DGID | 128 | 该字段标识将从网络中接收并处理该数据包的端口对应的全局标识符(GID)。 |
2.2.3.Base Transport Header(BTH) - 12 BYTES
| Field Name | Field Abbreviation | Field Size (in bits) | Description |
|---|---|---|---|
| Opcode | OpCode | 8 | 该字段标识 IBA 数据包的类型。OpCode 同时指明在基础传输头(Base Transport Header)之后所跟随的扩展头类型。 |
| Solicited Event | SE | 1 | 该比特指示接收端是否需要生成一个事件(Event)。 |
| MigReq | M | 1 | 该比特用于传递迁移(Migration)状态信息。 |
| Pad Count | PadCnt | 2 | 该字段指示为了将有效载荷对齐到 4 字节边界而附加的填充字节数量。 |
| Transport Header Version | TVer | 4 | 该字段指示 IBA 传输层头部(Transport Headers)的版本号。 |
| Partition Key | P_KEY | 16 | 该字段指示该数据包所属的逻辑分区(Partition)。 |
| F/Res1* | F/R | 1 | F(FECN):为 0 表示未接收到 FECN 拥塞指示;为 1 表示该数据包经过了发生拥塞的节点。Res1*:发送时置 0,接收时忽略。该字段不包含在不变 CRC(Invariant CRC)计算中。 |
| B/Res1* | B/R | 1 | B(BECN):为 0 表示数据包未经过拥塞点,或虽经过但未被标记;为 1 表示该头部所指示的数据包经历了前向拥塞。B 位在 ACK 或 CN BTH 中被置位。Res1*:发送时置 0,接收时忽略。该字段不包含在不变 CRC 计算中。 |
| Reserved (variant) | 6 | 发送时置 0,接收时忽略。该字段不包含在不变 CRC(Invariant CRC)计算中。 | |
| Destination QP | DestQP | 24 | 该字段标识目的端的工作队列对编号(Work Queue Pair Number,简称 QP)。 |
| Acknowledge Request | A | 1 | 该比特用于指示接收端需要为该数据包调度并发送一个确认(ACK)。 |
| Reserved | 7 | 发送时置 0,接收时忽略。该字段包含在不变 CRC(Invariant CRC)计算中。 | |
| Packet Sequence Number | PSN | 24 | 该字段用于检测数据包是否丢失或重复,用于保证传输的可靠性和有序性。 |
2.2.4.Reliable Datagram Extended Transport Header(RDETH) - 4 BYTES
| Field Name | Field Abbreviation | Field Size (in bits) | Description |
|---|---|---|---|
| Reserved | 8 | 发送时置为 0,接收时忽略。 | |
| EE-Context | EECnxt | 24 | 该字段指示该可靠数据报文(Reliable Datagram)应使用的端到端上下文(End-to-End Context)。 |
2.2.5.Datagram Extended Transport Header(DETH) - 8 BYTES
| Field Name | Field Abbreviation | Field Size (in bits) | Description(中文) |
|---|---|---|---|
| Queue Key | Q_Key | 32 | 该字段用于对接收队列的访问进行授权。 |
| Reserved | 8 | 发送时置为 0,接收时忽略。 | |
| Source QP | SrcQP | 24 | 该字段标识源端的工作队列对编号(Work Queue Pair Number,简称 QP)。 |
2.2.6.RDMA Extended Transport Header(RETH) - 16 BYTES
| Field Name | Field Abbreviation | Field Size (in bits) | Description |
|---|---|---|---|
| Virtual Address | VA | 64 | RDMA 操作的虚拟地址。 |
| Remote Key | R_Key | 32 | 授权 RDMA 操作访问的远程密钥。 |
| DMA Length | DMALen | 32 | DMA 操作的长度(以字节为单位)。 |
2.2.7.Atomic Extended Transport Header(ATOMICETH) - 28 BYTES
| Field Name | Field Abbreviation | Field Size (in bits) | Description |
|---|---|---|---|
| Virtual Address | VA | 64 | 远程虚拟地址。 |
| Remote Key | R_Key | 32 | 授权访问远程虚拟地址的远程密钥。 |
| Swap (or Add) Data | SwapDt | 64 | 原子操作中的一个操作数。 |
| Compare Data | CmpDt | 64 | CmpSwap 原子操作中的一个操作数。 |
2.2.8.XRC Extended Transport Header (XRCETH) - 4 BYTES
| Field Name | Field Abbreviation | Field Size (in bits) | Description |
|---|---|---|---|
| Reserved | Reserved | 8 | 发送时为0,接收时忽略。 |
| XRC Shared Receive Queue | XRCSRQ | 24 | 该字段指示响应方为此数据包使用的 XRC 共享接收队列号。 |
2.2.9.ACK Extended Transport Header(AETH) - 4 BYTES
| Field Name | Field Abbreviation | Field Size (in bits) | Description |
|---|---|---|---|
| Syndrome | Syndrome | 8 | 该字段指示这是 ACK 还是 NAK 数据包,以及 ACK 或 NAK 的附加信息。 |
| Message Sequence Number | MSN | 24 | 该字段指示响应方最后完成的消息的序列号。 |
2.2.10.Atomic ACK Extended Transport Header(ATOMICACKETH) - 8 BYTES
| Field Name | Field Abbreviation | Field Size (in bits) | Description |
|---|---|---|---|
| Original Remote Data | Orig-RemDt | 64 | 原子操作中的返回操作数,包含原子操作前远程内存位置的数据。 |
2.2.11.Immediate Data Extended Transport Header(IMMDT) - 4 BYTES
| Field Name | Field Abbreviation | Field Size (in bits) | Description |
|---|---|---|---|
| Immediate Data | ImmDt | 32 | 立即数据 (ImmDt) 包含将被放入接收完成队列元素 (CQE) 中的数据。ImmDt 仅允许在带有立即数据的 SEND 或 RDMA WRITE 数据包中出现。 |
2.2.12.Invalidate Extended Transport Header(IETH) - 4 BYTES
| Field Name | Field Abbreviation | Field Size (in bits) | Description |
|---|---|---|---|
| R_Key | R_Key | 32 | SEND with Invalidate 操作携带一个 R_Key 字段。该 R_Key 用于让响应方在收到并执行 SEND with Invalidate 请求时,使一个内存区域或内存窗口失效。此 R_Key 在一个新的扩展传输头中承载,称为失效扩展传输头 (IETH)。 |
参考资料
- InfiniBand TM Architecture Specification Volume1
- InfiniBand TM Architecture Specification Volume2