"本文通过抓包分析了DCQCN数据包与控制包的形式以及运行机制"
InfiniBand
Base Transport Header
Opcode: Congestion Notification Packet (129)
0... .... = Solicited Event: False
.0.. .... = MigReq: False
..00 .... = Pad Count: 0
.... 0000 = Header Version: 0
Partition Key: 65535
Reserved: 00
Destination Queue Pair: 0x000005
0... .... = Acknowledge Request: False
.000 0000 = Reserved (7 bits): 0
Packet Sequence Number: 0
Base Transport Header (BTH,基础传输头)
| 字段 | 值 | 说明 |
|---|---|---|
| Opcode | 129 (十六进制 0x81) | 操作码,标识数据包的类型。0x81 是 RoCEv2 中 CNP (Congestion Notification Packet,拥塞通知包) 的专用操作码。 |
| Solicited Event | False | 是否为“请求通知事件”的包。若为 True,接收端在处理完该包后,会向发送端生成一个完成事件通知。CNP 包不需要触发事件,因此为 False。 |
| MigReq | False | 迁移请求标志,用于 RDMA 连接迁移(如 QP 迁移),表示是否请求切换到新路径。普通数据/CNP 包不涉及迁移,因此为 False。 |
| Pad Count | 0 | 填充字节数,表示需要在数据后补充多少字节,使整个数据包长度按 4 字节对齐。CNP 包长度本身已经对齐,所以值为 0。 |
| Header Version | 0 | 传输头版本号,标识当前 BTH 的协议版本,当前标准版本为 0。 |
| Partition Key | 65535 (十六进制 0xFFFF) | 分区键 (P_Key),用于在同一个物理网络上划分逻辑隔离的“分区”。0xFFFF 表示该包属于默认的、允许所有节点加入的“全开放分区”。 |
| Reserved | 00 | 协议预留字段,无实际功能,必须设置为 0。 |
| Destination Queue Pair | 0x000005 | 目标队列对号 (Dest QPN),指定该数据包要送达的远程 RDMA 队列对(QP)的编号。发送端收到 CNP 后,会根据该 QPN 找到对应的流并降低发送速率。 |
| Acknowledge Request | False | 是否需要接收端回复 ACK。若为 True,接收端需发送确认包。CNP 是单向通知,不需要回复,因此为 False。 |
| Reserved (7 bits) | 0 | 协议预留字段,无实际功能,必须设置为 0。 |
| Packet Sequence Number | 0 | 包序列号 (PSN),用于可靠传输模式下的丢包检测和重传。CNP 包属于无连接的通知消息,不参与可靠传输的序号管理,因此值为 0。 |
InfiniBand
Base Transport Header
Opcode: Reliable Connection (RC) - Acknowledge (17)
0... .... = Solicited Event: False
.0.. .... = MigReq: False
..00 .... = Pad Count: 0
.... 0000 = Header Version: 0
Partition Key: 65535
Reserved: 00
Destination Queue Pair: 0x000005
0... .... = Acknowledge Request: False
.000 0000 = Reserved (7 bits): 0
Packet Sequence Number: 16159508
AETH - ACK Extended Transport Header
Syndrome: 96, Nak
0... .... = Reserved: 0
.11. .... = OpCode: Nak (3)
...0 0000 = Error Code: PSN Sequence Error (0)
Message Sequence Number: 0
Invariant CRC: 0x1f11d0bb
Base Transport Header (BTH,基础传输头)
| 字段 | 值 | 说明 |
|---|---|---|
| Opcode | Reliable Connection (RC) – Acknowledge (17) | 操作码:表示这是一个可靠连接(RC)类型的确认(ACK)包,用于 RC 队列对的流量控制与确认 |
| Solicited Event | False | Solicited Event 位:为 0 表示这不是一个 Solicited 事件,不会触发接收方的完成队列事件通知 |
| MigReq | False | 迁移请求位:为 0 表示没有请求队列对迁移 |
| Pad Count | 0 | 填充计数:表示数据包末尾没有额外填充字节(IB 要求数据包长度为 4 字节对齐) |
| Header Version | 0 | 头版本号:固定为 0,代表当前 IB 协议版本 |
| Partition Key | 65535 (0xFFFF) | 分区键:0xFFFF 是默认分区,用于 IB 子网的分区隔离,多数场景使用默认值 |
| Reserved | 00 | 保留位:预留字段,当前未使用,值为 0 |
| Destination Queue Pair | 0x000005 | 目标队列对(QP)号:标识该 ACK 包对应的接收端 QP,用于路由到正确的队列对上下文 |
| Acknowledge Request | False | ACK 请求位:为 0 表示不要求接收方立即回复 ACK |
| Reserved (7 bits) | 0 | 保留位:7 个预留比特,值为 0 |
| Packet Sequence Number (PSN) | 16159508 | 数据包序列号:RC 传输中用于排序、丢包检测和重传的核心标识,接收方通过 PSN 校验数据包顺序 |
AETH – ACK Extended Transport Header (ACK 扩展传输头)
| 字段 | 值 | 说明 |
|---|---|---|
| Syndrome | 96, Nak | Syndrome 字段:高 3 位为 Opcode,低 4 位为 Error Code,组合值 96 表示这是一个NAK(否定确认)包 |
| OpCode (AETH) | Nak (3) | AETH 操作码:3 代表 NAK,说明这是一个错误通知包,而非正常 ACK |
| Error Code | PSN Sequence Error (0) | 错误码:0 表示PSN 序列号错误,即接收方收到的数据包 PSN 不符合预期(出现乱序、丢包或重复) |
| Message Sequence Number | 0 | 消息序列号:用于多消息传输的场景,此处为 0 表示无额外消息序号 |
| Invariant CRC | 0x1f11d0bb | 不变量 CRC:对 BTH 及固定部分头的校验和,用于校验数据包头的完整性,防止传输错误 |