ECMP:网络设备如何把流量分到多条同样好的路径?
TL;DR
ECMP 利用多条等价路径分担流量,通常按流哈希保持顺序,在链路利用率、热点、故障收敛和映射稳定性之间做取舍。
ECMP 利用多条等价路径分担流量,通常按流哈希保持顺序,在链路利用率、热点、故障收敛和映射稳定性之间做取舍。

一台路由器到同一个目的地,可能存在多条代价完全相同的路径。ECMP(Equal-Cost Multipath,等价多路径)就是利用这些路径分担流量:不再把所有数据塞到一条链路上,而是让多个路径共同工作。
最简单的想象是把一条高速公路分成几条同样近的匝道。若把每个数据包轮流送入不同匝道,平均看似公平,却可能因为各包排队和传输时间不同而在终点乱序。TCP 或上层协议遇到严重乱序,可能误判为丢包,降低发送速率。
所以工程实现通常按流而不是按包做哈希。源地址、目的地址、端口和协议等字段组合成流标识,同一流尽量固定在同一路径,不同流再分散到多个路径上。这样既能利用链路总容量,又能减少单个连接的包乱序。代价是大流可能压满一条链路,而其他链路仍有空余;哈希选择还要避免热点和极端碰撞。
ECMP 的难点不仅在转发,还在故障和变化。某条路径失效后,原有哈希映射可能大量重排,造成缓存失效、连接抖动和瞬时流量迁移。设备还要处理链路容量不对称、隧道封装、链路聚合和跨设备的路径一致性。监控中看到“总带宽够用”并不代表每条流都分配得均匀。
理解 ECMP 后,网络负载均衡就不再是简单的轮询。它本质上是在“路径利用率、包顺序、映射稳定性和故障收敛”之间做取舍,适合用流级粒度把大量独立连接分摊到等价链路上。
在云网络和数据中心里,ECMP 往往还会和链路聚合、隧道以及服务网格叠加。每一层都可能重新计算哈希,导致上层以为流量均匀、下层却出现热点。排查时要沿着完整路径确认哈希字段、路径权重和故障切换行为,而不是只看某台设备的端口利用率。
因此,ECMP 的效果应以流级分布、链路利用率、乱序、重传和故障切换时间共同衡量。只看到“多条路径都亮着”并不代表实现正确;真正的目标是让并发流平稳分担,同时让单个连接在路径变化时保持可接受的顺序和延迟。
资料来源:RFC 2991:Multipath Issues in Unicast and Multicast Next-Hop Selection



