第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 不会自动做负载分担。要强制分担,可以:
- 调整 Cost:人工使 Cost 相等
- 使用 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 配置 + 实际路由表 |
九、思考
- ECMP 中路由器如何确保同一条流的报文不会乱序?
- 如果三条等价链路的利用率分别为 50%、30%、20%,可能是什么原因导致的?如何优化?
- 如何配置 OSPF 支持 16 条等价路径?
- 如果两条路径的 Cost 相差 1,如何让它们实现负载分担?
- BFD 与 ECMP 结合使用有什么好处?
下篇预告:第67篇《OSPF 邻居故障排查——状态卡在 Init/ExStart》——掌握 OSPF 邻居建立失败的常见原因和排查方法。