4. 路由基础:路由概念、IB路由与以太网路由的区别

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 中的子网前缀,决定数据包从哪个端口离开当前子网。

子网 A(Subnet Prefix = 0xFE8000...A) 子网 B(Subnet Prefix = 0xFE8000...B) HCA A1 LID=1, GID=...A:1 HCA A2 LID=2, GID=...A:2 IB 交换机 A LID=16 SM 管理 HCA B1 LID=1, GID=...B:1 HCA B2 LID=2, GID=...B:2 IB 交换机 B LID=16 SM 管理 IB 路由器 端口1: LID=32 端口2: LID=33 跨子网路由:依据 GID 子网前缀转发 子网内交换(依据 LID) 子网间路由(依据 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 路由的转发流程可以概括为以下步骤:

  1. GID 配置:每个 HCA 端口在子网初始化时,由 SM 分配一个 LID,并通告其端口 GUID。若需跨子网通信,SM 还会为端口配置一个全局唯一的 GID(子网前缀 + 端口 GUID)。
  2. 路径查询:发送端 HCA 在发起通信前,通过 路径记录查询(Path Record Query) 向 SM 请求到达目的 GID 的路径信息。SM 返回一条完整的端到端路径,包括每一跳的 LID 和输出端口。
  3. 数据包封装:发送端构造数据包,依次添加 LRH(携带下一跳 LID)、GRH(携带源/目的 GID)、以及传输层头(BTH/ETH 等)。
  4. 逐跳转发:数据包到达子网边界路由器时,路由器读取 GRH 中的目的子网前缀,查询本地转发表,确定输出端口,并重写 LRH 中的 LID 为下一跳的 LID,然后转发到相邻子网。
  5. 最终交付:数据包到达目的子网后,由目的交换机根据 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 重新计算路径,这一过程可能造成秒级中断,设计时需考虑业务容忍度。