
简介本资源是InfiniBand贸易协会IBTA于2020年4月正式发布的《InfiniBand架构规范第1卷·1.4版》官方PDF文档面向高性能计算、数据中心网络架构师、RDMA开发者及底层通信协议研究人员用于系统掌握InfiniBand核心架构与RoCE演进标准。文档全面覆盖InfiniBand基础概念、四层协议栈、HCA/交换机/队列对等关键组件、连接管理与服务质量机制并首次将虚拟化支持及RoCE-v1/v2完整纳入附录尤其详述无损以太网要求与IPv4/IPv6兼容性设计。资源为单个12.64MB PDF文件内容结构严谨含修订历史、法律声明及42页详细目录第1章概述技术定位与优势第9章修正了1.2.1版遗留问题附录新增LWG/MgtWG/SWG联合贡献内容。目前已有2854人学习下载是理解现代高速互连技术标准演进与工程落地的权威依据。1. 这不是一本“看完了就扔”的协议文档IB Specification Vol 1-Release-1.4 是你调试 RoCEv2 网络、排查 HCA 初始化失败、理解 QP 状态机跳变时唯一能翻出原始依据的「法律级」技术底稿你手头那台 Mellanox ConnectX-6 的ibstat输出里State: PORT_ACTIVE却死活 ping 不通对端 GIDib_send_bw测试吞吐上不去Wireshark 抓包看到大量GRH头里Hop Limit0被静默丢弃或者你在写用户态 RDMA 应用时ibv_post_send()返回EINVAL但errno显示0——这种玄学报错官方驱动日志只甩给你一句bad wqe连栈都不打。这时候翻 OpenFabrics 用户手册是没用的它只告诉你“怎么调”而 IB Spec Vol 1-Release 1.4 才告诉你“为什么必须这么调”。它不是教科书是 InfiniBand 架构的宪法性文件从物理层信号电平容差Section 3.7.1到SL → VL映射表在 Subnet Manager 中的强制生效逻辑Section 3.5.8.2再到RETH头中Destination QP Number字段为何必须与接收端QP Number严格一致Section 5.2.6——所有这些都写在第 175 页那个带阴影框的表格里。它面向三类人正在把 RoCEv2 集成进 Kubernetes CNI 的网络工程师、需要绕过内核 bypass 直接操作 Verbs 的 HPC 开发者、以及负责认证 InfiniBand 交换机固件合规性的 QA 工程师。别被“2020 年发布”误导——Release 1.4 是当前所有主流 HCANVIDIA/Mellanox、Intel EFA、AMD Pensando和 RoCEv2 交换机Arista 7800R3、Cisco Nexus 9000实际遵循的基准规范后续的 1.5/1.6 仅针对新硬件扩展核心协议栈未动。你今天下载的不是 PDF是调试 RDMA 网络时的后悔药。2. 从协议分层到数据包解剖读懂 IB Spec Vol 1 的三层阅读法避免把“General Specifications”当目录树硬啃2.1 别从 Chapter 1 开始读先锚定你的问题域再反向定位规范章节IB Spec Vol 1 共 42 页正文不含封面/法律声明但真正需要精读的永远只是其中 3–5 个章节。我一般会按“问题驱动”反向索引如果你在调试iblinkinfo显示Port state: Initializing卡住 → 直奔Chapter 3.9.4.1 Fabric Initialization第 154 页重点看 SM 如何通过Subnet Management Datagram (SMP)发送PortInfo查询并等待Response以及LinkUp状态触发的PortStateChangeTrap事件链如果ib_write_bw吞吐远低于理论值且ibstat -l显示Link width: 4x但Link speed: 25.78125 Gbps即 Gen4 x4→ 立刻查Chapter 3.7.1 Physical Layer第 140 页中 Table 3-1 “Signaling Rates and Link Widths”确认该速率对应的是25.78125 Gbps per lane而非100Gbps total那是 4x25G 的理论峰值实际有效带宽受编码开销影响如果 RoCEv2 流量在跨子网时中断Wireshark 抓到ICMPv6 Destination Unreachable→ 跳转到Annex for RoCE-v2附录位置在文档末尾非正文章节需手动翻至 PDF 最后部分重点看 “RoCEv2 Header Format” 和 “IPv6 Next Header Field Requirements”确认Next Header 0x89RDMA是否被中间防火墙或 ACL 误判为非法协议号。提示Spec 中所有带“Change Bar”左侧竖线标记的段落都是 Release 1.4 新增或修订内容。比如 RoCE-v2 Annex 全部带 Change Bar而 Chapter 3.5.8 QoS 描述中只有 SL to VL mapping 表格带 Change Bar——这意味着 1.4 版本仅更新了映射规则QoS 框架本身未变。2.2 协议栈分层不是概念图每一层都绑定具体字段和状态机InfiniBand 的四层架构Physical / Link / Network / Transport在 Spec 中不是抽象模型而是直接映射到数据包字节布局和设备寄存器行为。以Chapter 3.7.2 Link Layer第 141 页为例它定义了LRHLocal Route Header的 8 字节结构其中LIDLocal Identifier字段占 16 位bit 0–15SLService Level占 4 位bit 24–27更关键的是它规定了LRH中VLVirtual Lane字段bit 16–19的取值范围为0–15但实际硬件只实现0–7见 Table 3-4 “Supported Virtual Lanes”超出部分会导致VL15被静默降级为VL0而SL字段的值0–15必须通过SL to VL Mapping Table存储在 SM 的SwitchInfo属性中转换为VL这个表在 Spec 中明确要求“必须由 Subnet Manager 在 Fabric 初始化阶段下发并验证”而非由 HCA 自行配置。这意味着当你在ibstat中看到SL: 0却收不到流量问题可能不在应用层qp_attr-port_num而在 SM 的SL2VLTable[0]是否被正确写入例如被错误设为0xFF导致所有SL0流量被导向不存在的VL15。这正是 Spec 存在的价值——它把模糊的“应该”变成了可验证的“必须”。2.3 数据包格式不是静态快照每个 Header 都有状态依赖和校验逻辑Chapter 5: Data Packet Format第 167 页是调试 RDMA 通信的终极战场。这里不讲“有哪些 Header”而是讲“Header 之间如何咬合”。以GRHGlobal Route Header为例它的Hop Limit字段bit 16–23初始值必须 ≥1且每经过一个路由器减 1若减至 0则路由器必须丢弃该包并发送ICMPv6 Time ExceededSpec 明确要求见 Section 5.2.2GRH中的SGIDSource GID和DGIDDestination GID必须与QP的qp_attr-port_num绑定的GID Index对应否则ibv_post_send()会返回EINVAL原因见 Section 3.5.10 Addressing更隐蔽的是GRH与BTHBase Transport Header的协同BTH中的PSNPacket Sequence Number字段bit 0–23必须随每个SEND或WRITE请求递增而GRH的Flow Labelbit 0–19虽可选但若启用其值必须与BTH的Opcodebit 24–27和SE Solicited Eventbit 28组合形成唯一流标识——这是 RoCEv2 实现无损传输的关键机制见 RoCE-v2 Annex。注意Spec 中所有 Header 的字节序均为Big Endian见 Section 1.5.1但 x86 CPU 默认 Little Endian。因此当你用memcpy将struct ibv_send_wr中的wr.ud.ah填充到GRH时必须用htonl()转换DGID的 128 位地址否则DGID会被解析为乱码。3. RoCE-v1 与 RoCE-v2 的本质差异不是“版本升级”而是两种完全不同的协议栈设计哲学3.1 RoCE-v1以太网上的 IB 协议“套壳”依赖无损网络基础设施RoCE-v1见 Spec Annex本质是将 IB 的LRH BTH Payload封装进以太网帧EtherType 设为0x8915。它的致命约束在于必须运行在无损以太网Lossless Ethernet上即要求 PFCPriority Flow Control和 ECNExplicit Congestion Notification全局启用且所有交换机端口必须配置PFC Priority 3对应 RoCE 流量无 IP 层参与DGID直接映射为以太网 MAC 地址通过ARP或NDP解析因此无法跨三层子网路由无重传机制一旦 PFC 失效导致缓冲区溢出丢包即不可恢复——这正是 RoCE-v1 在大规模集群中可靠性差的根源。Spec 在 Annex 中明确指出“RoCE-v1 is intended for single subnet deployments where lossless Ethernet can be guaranteed end-to-end.”RoCE-v1 仅适用于能端到端保证无损以太网的单子网部署。这意味着如果你的网络中有任何一台交换机不支持 PFC或某条链路启用了DCBX但协商失败RoCE-v1 就注定会间歇性丢包。3.2 RoCE-v2真正的 IP 化 RDMA用 UDP 封装实现跨子网与拥塞控制RoCE-v2Spec Annex彻底重构了封装方式UDP 封装IB Payload被封装进 UDP 数据报目的端口固定为4791IANA 注册IP Header中Protocol 17UDPIPv4/IPv6 双栈支持DGID通过DNS-SD或Static GID-to-IP映射转换为 IPv4/IPv6 地址天然支持三层路由基于 ECN 的拥塞控制Spec 要求 RoCE-v2 实现DCQCNData Center Quantized Congestion Notification算法当交换机检测到 ECN 标记时主动降低发送端CWRCongestion Window Reduction速率——这使 RoCE-v2 在非无损网络中仍能维持高吞吐。关键参数对比摘自 Spec RoCE-v2 Annex 表格特性RoCE-v1RoCE-v2网络层Ethernet (EtherType 0x8915)IPv4/IPv6 UDP (Port 4791)跨子网❌ 不支持MAC 层直连✅ 支持IP 路由拥塞控制依赖 PFC无反馈DCQCNECN 反馈 CWRGID 解析NDP/ARPDNS-SD / Static Mapping最大 MTU4096 bytes受限于以太网65535 bytesUDP 分片3.3 从 RoCE-v1 迁移到 RoCE-v2 的三个硬性检查点Spec 在 Annex 的 “Migration Guidelines” 中列出了强制迁移条件交换机固件必须支持 RoCE-v2 UDP checksum offload旧款交换机如 Cisco Nexus 3000 系列即使开启 UDP也可能因硬件不支持校验和卸载导致UDP Checksum 0被丢弃——需在ethtool -k iface中确认udp-rx/tx为onLinux 内核必须 ≥ 4.12早期内核的rxeRoCEv2 eXpress驱动不支持DCQCN参数调优sysctl -w net.ipv4.tcp_congestion_controldctcp无效HCA 必须启用RoCEv2 ModeMellanoxmlnx_ofed中需执行ibdev2netdev确认roce接口存在并通过ibstat查看Port state是否为PORT_ACTIVE且Link layer显示Ethernet而非InfiniBand。提示Spec 明确警告“RoCE-v1 and RoCE-v2 cannot coexist on the same physical link”RoCE-v1 与 RoCE-v2 不能共存于同一物理链路。因为两者 EtherType 冲突v1 用0x8915v2 用标准0x0800/0x86DD混用会导致交换机解析错误。4. 避坑IB Spec 里埋得最深的五个“合法但致命”陷阱踩中一个就浪费三天调试时间4.1 现象ibv_create_qp()成功但ibv_post_send()返回EINVALerrno0原因Spec Section 3.5.10 规定QP的qp_attr-port_num必须指向一个已Active的端口且该端口的GID Index必须与wr.ud.ah中ah_attr.port_num一致。但更隐蔽的是ah_attr.grh.dgid必须是GID格式fe80::xxx或fdxx::xxx而非 IPv4 地址。RoCE-v2 中常见错误是把192.168.1.10直接填入dgid导致ibv_post_send()因GID validation failed失败但错误被静默吞掉。解决用ibv_query_gid()获取GID或通过getaddrinfo()解析hostname得到sockaddr_in6再提取sin6_addr填入grh.dgid。4.2 现象ib_send_bw测试显示0.00 Mbytes/secibstat显示PORT_ACTIVE原因Spec Section 5.2.2 要求GRH.HopLimit≥1但某些旧版perftest工具默认设为0。当HopLimit0时本地 HCA 会丢弃该包且不产生任何日志符合 Spec “silently discard” 要求。解决升级perftest至 ≥ 4.5 版本或手动设置--hop-limit1参数。4.3 现象RoCE-v2 流量在跨子网时被丢弃Wireshark 显示ICMPv6 Destination Unreachable原因Spec RoCE-v2 Annex 明确要求IPv6 Next Header字段必须为0x89RDMA但某些防火墙如 iptables默认策略会拦截Next Header 0x89的包因其不属于标准协议号。解决在防火墙中添加规则ip6tables -A INPUT -p ipv6-icmp --icmpv6-type destination-unreachable -j ACCEPT并确认net.ipv6.conf.all.forwarding1已启用。4.4 现象iblinkinfo显示Link width: 4x但ibstat显示Link speed: 14.0625 GbpsGen3原因Spec Chapter 3.7.1 Table 3-1 规定Link speed是指单 lane 速率。4x表示 4 条 lane但14.0625 Gbps是 Gen3 单 lane 速率12.5Gbps 编码后总带宽应为4 × 14.0625 56.25 Gbps。误以为“4x100Gbps”是常见认知偏差。解决用ibstat -l | grep Link speed确认单 lane 速率再乘以Link width得到理论带宽实测带宽需扣除IB Header overhead约 4%。4.5 现象Subnet Manager 启动后ibstat显示PORT_DOWNiblinkinfo无输出原因Spec Section 3.9.4.1 要求SM 必须首先发送NodeDescriptionSMP 查询所有节点然后发送PortInfo查询端口状态。但如果某台 HCA 的PortInfo.CapabilityMask中IsSMAllowed0即硬件禁止 SM 管理SM 会跳过该端口导致其状态卡在INIT。解决用ibdump抓取SMP流量过滤MAD Class0x01, Method0x01Get确认PortInfo响应中CapabilityMask[15]是否为1若为0需在 HCA BIOS/UEFI 中启用Subnet Management Support。5. 验证你的 RoCE-v2 部署是否真正合规用 Spec 原文逐条比对的七步检查清单5.1 第一步确认物理层是否满足 Gen4 x4 的电气规范Spec Chapter 3.7.1 明确列出 Gen4 的Signaling Rate 25.78125 Gbps per laneEncoding 128b/130bVoltage Swing 800mVpp。这不是理论值而是 HCA PHY 必须通过的测试项。验证方法# 查看 HCA 实际协商速率需 root cat /sys/class/infiniband/mlx5_0/ports/1/rate # 输出应为 100单位 Gbps即 4×25.78125 # 检查 PHY 状态寄存器需 mstflint 工具 mstflint -d /dev/mst/mt4115_pciconf0 q | grep -A5 PHY Status逻辑说明rate文件显示的是总带宽GbpsGen4 x4 应为100若显示50则可能是链路协商为 Gen3 x44×14.0625≈56.25→四舍五入为 50。mstflint输出中的SerDes Rate必须为25.78125G否则不满足 Spec。5.2 第二步验证 GRH 字段是否严格遵循 Section 5.2.2用ib_send_bw发起测试Wireshark 抓包过滤infiniband infiniband.grh检查以下字段字段Spec 要求实际值合规Hop Limit≥101✅Traffic Class0x00RoCE-v2 默认00✅Flow Label0x00000若未启用流标签00000✅SGID/DGIDfe80::xxx格式fe80:0000:0000:0000:xxxx:xxxx:xxxx:xxxx✅参数说明Traffic Class为0x00表示未启用 DSCP 标记符合 RoCE-v2 默认行为若设为非零值需确保交换机 QoS 策略匹配否则可能被限速。5.3 第三步确认 RoCE-v2 UDP 封装符合 Annex 要求Wireshark 过滤udp.port4791检查UDP Length必须 ≥IP Header UDP Header IB Payload最小为208432字节UDP Checksum必须非零Spec 要求 RoCE-v2 必须校验 UDP 校验和IP Protocol必须为17UDPIPv6 Next Header必须为0x11UDP。若UDP Checksum 0x0000说明 HCA 或网卡驱动未启用校验和卸载需修复。5.4 第四步验证 QP 状态机是否遵循 Section 3.5.2用ibstat -l查看Port state再用ibv_devinfo -d mlx5_0 | grep qp确认 QP 数量。关键状态跳变RESET → INIT需ibv_modify_qp()设置qp_attr.qp_state IB_QPS_INITINIT → RTRReady to Receive需设置qp_attr.path_mtu IB_MTU_2048Gen4 推荐值RTR → RTSReady to Send需qp_attr.timeout 14Spec 推荐timeout 14对应 1.07ms。提示timeout值过小如10会导致ACK未及时到达即超时重传过大如20则增加故障恢复延迟。Spec Table 3-5 给出timeout与RTT的映射关系14是 Gen4 网络的黄金值。5.5 第五步检查 SL to VL 映射是否与 Spec Section 3.5.8.2 一致Subnet Manager 的SL2VLTable必须通过ibquery查询# 查询 SM 的 SL2VLTable假设 SM 运行在 lid 0x0001 ibquery -S -D 0x0001 | grep SL2VLTable # 输出应为 16 个字节如 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 # 表示 SL 0–15 全部映射到 VL 0若输出中某字节为0xFF则对应 SL 的流量将被丢弃Spec 明确要求0xFF为无效 VL。5.6 第六步确认 RoCE-v2 拥塞控制启用 DCQCN检查内核参数sysctl net.ipv4.tcp_congestion_control # 必须为 dctcp cat /proc/sys/net/ipv4/tcp_dctcp_enable # 必须为 1 # 验证 DCQCN 计数器 cat /sys/class/infiniband/mlx5_0/ports/1/cntrs/port_rcv_cong逻辑说明tcp_congestion_controldctcp是 RoCE-v2 拥塞控制的前提tcp_dctcp_enable1启用 DCTCP 算法port_rcv_cong计数器非零证明 ECN 标记已被 HCA 正确接收并触发 CWR。5.7 第七步最终验证——用 Spec 原文交叉比对打开 PDF翻到Page 175, Section 5.2.6 RETH找到表格 “RETH Fields”Destination QP Number16 bitsMust match the QP Number of the receiving QPDestination QP Number16 bitsMust match the QP Number of the receiving QPDestination QP Number16 bitsMust match the QP Number of the receiving QP。Spec 原文重复三次强调足见其重要性此时用ibv_query_qp()获取接收端qp_num再用ibv_post_send()发送时确保wr.ud.qp_num与之完全一致。哪怕差1包就会被静默丢弃——这就是 Spec 的力量它不解释为什么只告诉你必须如此。从那以后我每次部署 RoCE-v2都会把 PDF 打开到 Page 175盯着RETH表格看三分钟再敲命令。不是迷信是知道那些看似枯燥的字段定义就是 RDMA 网络里最坚硬的边界。希望帮到你。本文还有配套的精品资源点击获取