ECMP路由
ECMP 路由是什么
ECMP 路由全称是 Equal-Cost Multi-Path Routing,中文一般叫等价多路径路由。
它的意思是:到同一个目的网段,如果有多条”代价相同”的路径,路由器/交换机可以同时使用这些路径转发流量,而不是只选一条。
举个简单例子:
1 | ┌── Router B ──┐ |
Router A 去 10.0.0.0/24 有两条路径:
A -> B -> DA -> C -> D
如果这两条路径的 metric 一样(比如 OSPF cost 一样、BGP local-pref/AS path/MED 等比较后也等价),那么 Router A 可以安装两条下一跳:
1 | 10.0.0.0/24 via Router B |
这就是 ECMP。
ECMP 的作用
1. 负载分担
多条链路一起承载流量,提高整体带宽。
100G + 100G ≈ 可承载接近 200G 的总流量
但注意,通常不是单条 TCP 流同时走两条链路,而是不同 flow 被 hash 到不同路径。
2. 冗余容灾
如果其中一条路径故障,流量可以切到剩余路径上。
ECMP 怎么决定走哪条路径?
大多数设备会做 hash,常见 hash 字段包括:
- 源 IP
- 目的 IP
- 源端口
- 目的端口
- 协议号
也就是常说的五元组 hash。例如:
1 | Flow 1: 192.168.1.10:12345 -> 8.8.8.8:443 → Path A |
这样可以避免同一个 TCP 连接的包乱序。
为什么不是按包轮询?
理论上可以按包(per-packet)分担,但实际很少这么做。因为如果两条链路延迟不同,会造成:
1 | 发送顺序: packet 1 → 链路 A, packet 2 → 链路 B, packet 3 → 链路 A |
这会导致 TCP 乱序 → 重传 → 吞吐下降。
所以实际网络里多是 per-flow ECMP,不是 per-packet ECMP。
和普通路由有什么区别?
普通路由:
1 | 10.0.0.0/24 via 192.168.1.1 |
ECMP:
1 | 10.0.0.0/24 via 192.168.1.1 |
同一个目的前缀,有多个等价 next-hop。
Linux 里的 ECMP 示例
配置:
1 | ip route add 10.10.0.0/16 \ |
查看:
1 | ip route show 10.10.0.0/16 |
输出类似:
1 | 10.10.0.0/16 |
ECMP 和负载均衡的区别
| ECMP | 应用层 LB (Nginx/LVS) | |
|---|---|---|
| 工作层级 | L3 路由转发 | L4/L7 应用层 |
| 路径 | Router → 多个 next-hop → 目标网络 | Client → LB → 后端服务 |
| 粒度 | per-flow hash | 可 per-request |
常见使用场景
- 数据中心 Leaf-Spine 架构 — 一个 Leaf 到多个 Spine 的路径成本相同
- 运营商核心网
- BGP fabric / EVPN / VXLAN
- Kubernetes CNI 网络
一句话总结
ECMP 就是同一个目的路由有多条等价路径,设备通过 hash 把不同流量分散到不同路径上,实现带宽利用和冗余。
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
