第66篇:OSPF 等价负载分担 ECMP

关键词

OSPF、ECMP、等价路由、负载分担、负载均衡、最大等价路径数


一、什么是 ECMP?

ECMP(Equal-Cost Multi-Path,等价多路径) 是指当到达同一目的地存在多条 Cost 相同的路径时,OSPF 将这些路径同时加入路由表,实现流量负载分担。

                     RouterB
                    /        \
                   / Cost=10  \
                  /            \
   RouterA ───── RouterC ─────── RouterD
              \     Cost=10      /
               \                /
                \              /
                 RouterE──────/

RouterA → RouterD:
  路径 1:A→B→D  Cost=10+10=20
  路径 2:A→C→D  Cost=10+10=20  ← 等价
  路径 3:A→E→D  Cost=10+10=20  ← 等价

→ 三条路径全部加入路由表,实现 ECMP 负载分担

二、ECMP 的配置

2.1 设置最大等价路径数

ospf 1
 maximum load-balancing 8       # 最大支持 8 条等价路径(默认值)

华为设备默认支持 8 条等价路径,范围一般 1~64。

2.2 禁用 ECMP

ospf 1
 maximum load-balancing 1       # 禁用 ECMP,只保留一条路径

2.3 查看 ECMP 路由

display ip routing-table 10.0.1.0

Route Destination: 10.0.1.0/24
  NextHop      Interface     Pre  Cost
  10.0.12.2    GE0/0/0       10   20    ← 等价路径 1
  10.0.13.2    GE0/0/1       10   20    ← 等价路径 2
  10.0.14.2    GE0/0/2       10   20    ← 等价路径 3

三、ECMP 的负载分担方式

ECMP 的负载分担方式由转发面决定,而非 OSPF 协议本身。

3.1 基于流的负载分担(默认)

路由器根据 五元组(源IP、目的IP、源端口、目的端口、协议)对报文进行 Hash:

Hash(五元组) = 结果 → 选择其中一条路径

同一条流的所有报文走同一条路径
不同流可能分配到不同路径

优点:同一条 TCP 连接的报文不会乱序

3.2 基于包的负载分担

# 华为设备(部分平台支持)
ip load-balance packet

每个报文独立选择路径,同一条流的不同报文可能走不同路径。

风险:可能导致 TCP 报文乱序,影响性能。


四、华为负载分担算法

华为设备默认使用基于报文的 Hash 算法

Hash 因子 说明
源 MAC 二层转发时使用
目的 MAC 二层转发时使用
源 IP 三层转发时使用
目的 IP 三层转发时使用
源端口 四层转发时使用
目的端口 四层转发时使用
# 修改 Hash 因子(华为设备)
load-balance src-ip           # 基于源 IP Hash
load-balance dst-ip           # 基于目的 IP Hash
load-balance src-dst-ip       # 基于源+目的 IP Hash(默认)

五、ECMP 的最佳实践

5.1 ECMP 数量建议

场景 建议 ECMP 数量
小型网络 2~4
中型企业 4~8
大型数据中心 Spine-Leaf 8~64

注意:ECMP 数量越多,Hash 结果越均匀,但路由表越大(增加 CPU/内存开销)。

5.2 Hash 不均匀问题

现象:多条等价链路中,某条链路利用率很高,其他链路很空闲。

原因

  • Hash 因子单一(如只基于源 IP)
  • 流量特征单一(如大量流量来自同一对 IP)

优化方案

# 增加 Hash 因子(包含四层端口)
load-balance src-ip dst-ip src-port dst-port

5.3 ECMP 与 BFD 联动

当某条等价路径故障时,OSPF 需要等待 Dead Interval(40s)才能感知并剔除该路径。建议配合 BFD 实现快速感知:

interface GigabitEthernet0/0/0
 ospf bfd enable                # 启用 BFD

BFD 可以在毫秒级检测到链路故障,自动从 ECMP 集合中剔除该路径。


六、ECMP 故障排查

6.1 等价路径数量不足

# 检查是否配置了最大等价路径数限制
display ospf 1 | include maximum
  maximum load-balancing: 8

# 检查是否实际存在等价路径
display ip routing-table 10.0.1.0 verbose

6.2 非等价场景——如何实现负载分担

如果两条路径 Cost 不同,OSPF 不会自动做负载分担。要强制分担,可以:

  1. 调整 Cost:人工使 Cost 相等
  2. 使用 PBR(策略路由):不依赖 Cost,手动控制流量走向

七、其他协议的 ECMP

协议 ECMP 支持 备注
OSPF ✅ 默认支持 最多 8 条(可配置更多)
IS-IS ✅ 默认支持 与 OSPF 类似
BGP ✅ 默认支持 BGP 天然支持 ECMP
静态路由 配置多条下一跳即可

八、总结

知识点 核心要点
ECMP 定义 多条 Cost 相同的路径同时使用
默认最大路径数 8 条
负载分担方式 基于五元组 Hash(默认基于流)
Hash 因子可调 src-ip、dst-ip、src-port、dst-port 等
BFD 推荐 快速检测等价路径故障
故障排查 检查 maximum 配置 + 实际路由表

九、思考

  1. ECMP 中路由器如何确保同一条流的报文不会乱序?
  2. 如果三条等价链路的利用率分别为 50%、30%、20%,可能是什么原因导致的?如何优化?
  3. 如何配置 OSPF 支持 16 条等价路径?
  4. 如果两条路径的 Cost 相差 1,如何让它们实现负载分担?
  5. BFD 与 ECMP 结合使用有什么好处?

下篇预告:第67篇《OSPF 邻居故障排查——状态卡在 Init/ExStart》——掌握 OSPF 邻居建立失败的常见原因和排查方法。