ECMP 路由是什么

ECMP 路由全称是 Equal-Cost Multi-Path Routing,中文一般叫等价多路径路由

它的意思是:到同一个目的网段,如果有多条”代价相同”的路径,路由器/交换机可以同时使用这些路径转发流量,而不是只选一条。

举个简单例子:

1
2
3
        ┌── Router B ──┐
Host ── Router A Router D ── 10.0.0.0/24
└── Router C ──┘

Router A 去 10.0.0.0/24 有两条路径:

  • A -> B -> D
  • A -> C -> D

如果这两条路径的 metric 一样(比如 OSPF cost 一样、BGP local-pref/AS path/MED 等比较后也等价),那么 Router A 可以安装两条下一跳:

1
2
10.0.0.0/24 via Router B
10.0.0.0/24 via Router C

这就是 ECMP。

ECMP 的作用

1. 负载分担

多条链路一起承载流量,提高整体带宽。

100G + 100G ≈ 可承载接近 200G 的总流量

但注意,通常不是单条 TCP 流同时走两条链路,而是不同 flow 被 hash 到不同路径

2. 冗余容灾

如果其中一条路径故障,流量可以切到剩余路径上。

ECMP 怎么决定走哪条路径?

大多数设备会做 hash,常见 hash 字段包括:

  • 源 IP
  • 目的 IP
  • 源端口
  • 目的端口
  • 协议号

也就是常说的五元组 hash。例如:

1
2
3
Flow 1: 192.168.1.10:12345 -> 8.8.8.8:443  → Path A
Flow 2: 192.168.1.11:23456 -> 8.8.8.8:443 → Path B
Flow 3: 192.168.1.12:34567 -> 8.8.8.8:443 → Path A

这样可以避免同一个 TCP 连接的包乱序。

为什么不是按包轮询?

理论上可以按包(per-packet)分担,但实际很少这么做。因为如果两条链路延迟不同,会造成:

1
2
发送顺序: packet 1 → 链路 A, packet 2 → 链路 B, packet 3 → 链路 A
到达顺序: packet 2, packet 1, packet 3

这会导致 TCP 乱序 → 重传 → 吞吐下降

所以实际网络里多是 per-flow ECMP,不是 per-packet ECMP。

和普通路由有什么区别?

普通路由:

1
10.0.0.0/24 via 192.168.1.1

ECMP:

1
2
3
10.0.0.0/24 via 192.168.1.1
10.0.0.0/24 via 192.168.1.2
10.0.0.0/24 via 192.168.1.3

同一个目的前缀,有多个等价 next-hop

Linux 里的 ECMP 示例

配置:

1
2
3
ip route add 10.10.0.0/16 \
nexthop via 192.168.1.1 dev eth0 weight 1 \
nexthop via 192.168.2.1 dev eth1 weight 1

查看:

1
ip route show 10.10.0.0/16

输出类似:

1
2
3
10.10.0.0/16
nexthop via 192.168.1.1 dev eth0 weight 1
nexthop via 192.168.2.1 dev eth1 weight 1

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 把不同流量分散到不同路径上,实现带宽利用和冗余。