4. 路由基础
4.1 路由的本质:从“直连可达”到“跨网转发”
在讨论 InfiniBand(IB)路由之前,必须先厘清一个基础概念:路由(Routing) 与 交换(Switching) 的根本差异。交换发生在同一子网(Subnet)内部,依据的是二层地址(如以太网的 MAC 或 IB 的 LID);而路由发生在不同子网之间,依据的是三层地址(如 IP 或 IB 的 GID)。
IB 网络中的“子网”由一台或多台交换机、以及连接其上的所有端节点(HCA、交换机管理端口)构成。子网内部通过 子网管理器(Subnet Manager, SM) 统一分配 16 位的本地标识符 LID,数据包在子网内依靠 LID 进行转发,这一过程称为“交换”。当数据包需要跨越子网边界,到达另一个 IB 子网或外部网络时,就必须引入 三层路由,此时数据包携带的是 128 位的 GID(Global ID),它由 64 位子网前缀(Subnet Prefix)和 64 位端口 GUID 拼接而成。
核心记忆点:LID 是“本地门牌号”,只在子网内有效;GID 是“全球地址”,包含子网前缀,用于跨子网寻址。IB 路由的本质就是根据 GID 中的子网前缀,决定数据包从哪个端口离开当前子网。
4.2 IB 路由与以太网路由的核心差异
虽然 IB 路由与以太网 IP 路由在“跨网转发”这一抽象层面相似,但具体机制差异巨大。理解这些差异,是配置 IB 多子网组网的前提。
| 对比维度 | 以太网路由(IP) | InfiniBand 路由 |
|---|---|---|
| 三层地址 | 32 位 IPv4 或 128 位 IPv6 | 128 位 GID(64 位子网前缀 + 64 位端口 GUID) |
| 二层地址 | 48 位 MAC,通过 ARP/NDP 解析 | 16 位 LID,由 SM 统一分配,无需 ARP |
| 路由决策依据 | 目的 IP 地址 + 最长前缀匹配 | 目的 GID 的子网前缀 + 转发路由表(由 SM 计算) |
| 路由表维护 | 动态路由协议(OSPF/BGP)或静态配置 | SM 集中计算,下发到每个交换机;无分布式路由协议 |
| 路径选择 | 逐跳(hop-by-hop),每台路由器独立决策 | 端到端路径由 SM 预先规划,数据包沿固定路径传输 |
| 广播/组播 | IP 组播(IGMP/PIM) | 组播由 SM 管理,使用专用组播 LID 和汇聚树 |
| 数据包格式 | 以太网帧头 + IP 头 + 传输层头 | LRH(本地路由头)+ GRH(全局路由头)+ 传输层头 |
常见误区:很多人以为 IB 路由就是“给 IB 配 IP 地址”。实际上,IB 的 GID 虽然可以由 SM 配置为与 IP 地址关联(如用于 RoCE 场景),但 IB 路由本身并不依赖 IP 协议栈。IB 路由器转发数据包时,查看的是 GRH 中的子网前缀,而不是 IP 头。即使完全不配置 IP,IB 子网间也能通过 GID 完成路由。
4.3 IB 路由的工作原理与转发流程
IB 路由的转发流程可以概括为以下步骤:
- GID 配置:每个 HCA 端口在子网初始化时,由 SM 分配一个 LID,并通告其端口 GUID。若需跨子网通信,SM 还会为端口配置一个全局唯一的 GID(子网前缀 + 端口 GUID)。
- 路径查询:发送端 HCA 在发起通信前,通过 路径记录查询(Path Record Query) 向 SM 请求到达目的 GID 的路径信息。SM 返回一条完整的端到端路径,包括每一跳的 LID 和输出端口。
- 数据包封装:发送端构造数据包,依次添加 LRH(携带下一跳 LID)、GRH(携带源/目的 GID)、以及传输层头(BTH/ETH 等)。
- 逐跳转发:数据包到达子网边界路由器时,路由器读取 GRH 中的目的子网前缀,查询本地转发表,确定输出端口,并重写 LRH 中的 LID 为下一跳的 LID,然后转发到相邻子网。
- 最终交付:数据包到达目的子网后,由目的交换机根据 LRH 中的 LID 将数据包交付给目标 HCA。
# 查看 IB 路由转发表(Linux 下使用 ibroute 工具)
# 该命令查询交换机 16 的转发表,显示每个 LID 对应的输出端口
$ ibroute -n 16
# 输出示例(简化):
# Lid 1: port 1
# Lid 2: port 2
# Lid 32: port 3 <-- 到达路由器端口
# Lid 33: port 3 <-- 到达路由器另一端口
4.4 案例:双 IB 子网通过路由器互联
假设某数据中心有两个 IB 子网:子网 A(前缀 0xFE80000000000000A)和 子网 B(前缀 0xFE80000000000000B),通过一台 IB 路由器连接。子网 A 中的节点 HCA A1(GID 为 ...A:1)需要与子网 B 中的 HCA B1(GID 为 ...B:1)通信。
通信过程如下:
- HCA A1 向 SM A 发起路径查询,请求到达 GID ...B:1 的路径。SM A 发现目的子网前缀与本地不同,于是返回路径:HCA A1 → 交换机 A → 路由器端口1 → 路由器端口2 → 交换机 B → HCA B1。
- HCA A1 构造数据包,LRH 的目的 LID 设为路由器端口1 的 LID(32),GRH 中源 GID 为 ...A:1,目的 GID 为 ...B:1。
- 路由器收到数据包后,检查 GRH 中的目的子网前缀 0x...B,查询转发表,确定应从端口2 发出。路由器重写 LRH,将目的 LID 改为交换机 B 的 LID(16),然后从端口2 转发。
- 交换机 B 收到数据包后,根据 LRH 中的 LID 16 将数据包转发到 HCA B1 所在端口。
实操提示:在配置 IB 路由器时,需要确保两端子网的 SM 都正确识别路由器端口。通常路由器会作为子网中的“边界节点”参与子网管理,SM 会为路由器端口分配 LID 并通告其可达的子网前缀。使用 ibqueryroute 工具可以查看 SM 计算出的完整路由路径,便于排查跨子网连通性问题。
4.5 误区与复盘:IB 路由中的常见陷阱
在实际部署中,工程师容易在以下环节犯错:
| 误区 | 后果 | 正确做法 |
|---|---|---|
| 认为 IB 路由与 IP 路由完全等价,试图在 IB 路由器上配置 IP 路由协议 | 路由器无法运行 OSPF/BGP,配置无效 | IB 路由完全由 SM 控制,只需确保 SM 正确配置子网前缀和路由器端口 |
| 忽略 GID 中子网前缀的一致性 | 跨子网通信失败,路径查询返回错误 | 检查所有 HCA 和路由器端口的 GID 前缀是否与所属子网一致 |
| 在子网内使用 LID 进行跨子网通信 | 数据包无法到达目的子网,因为 LID 只在本地有效 | 跨子网通信必须使用 GID,并确保发送端支持 GRH 封装 |
| 忘记配置 SM 的“路由策略” | SM 可能拒绝为跨子网路径分配资源 | 在 SM 配置中启用跨子网路由,并指定允许的路由规则 |
复盘要点:IB 路由的“集中式”特性既是优势也是风险。SM 是整个子网路由的大脑,一旦 SM 故障或配置错误,所有跨子网通信都会中断。生产环境中务必部署 SM 主备冗余,并定期备份 SM 配置。同时,由于 IB 路由不依赖分布式协议,网络拓扑变化后需要 SM 重新计算路径,这一过程可能造成秒级中断,设计时需考虑业务容忍度。