EIGRP 距离矢量路由
课程(6 节,按顺序学)
EIGRP 是什么:一个「作弊的」距离矢量协议
入门 · 约 10 分钟
本课目标:搞清楚它在距离矢量和链路状态之间的位置,以及它凭什么两头的好处都要。
先回忆两类协议各自的毛病
距离矢量(RIP):只听邻居说「到某地要多远」,不知道全网长什么样。
· 好处:简单、省内存、省 CPU
· 毛病:容易成环,只能靠「最多 15 跳」「30 秒周期更新」「抑制计时器」这些笨办法防环,收敛极慢(分钟级)
链路状态(OSPF):每台设备都有全网拓扑图,自己跑 Dijkstra。
· 好处:天然无环、收敛快
· 毛病:LSDB 占内存、拓扑一变全区域重跑 SPF 费 CPU、要划区域来控制规模、配置相对复杂
EIGRP 的取巧之处
EIGRP 仍然是距离矢量 —— 每台路由器只知道「邻居报的距离」,没有全网拓扑图、不跑 Dijkstra。
但它加了一个数学上的判据(可行性条件),能在只看邻居报的距离的前提下,就地判断「拿这条路当备份会不会成环」。
于是:
· 保留了距离矢量的轻量(不用存全网拓扑)
· 拿到了链路状态的无环 + 快速收敛
所以它被叫做高级距离矢量,或者「混合型」协议。
代价是什么
· 思科私有。2013 年公开了基本规范,但实际上只有思科设备跑得好 —— 多厂商环境只能选 OSPF,这是选型时的决定性因素
· 大网里的 Query 扩散是它独有的风险(OSPF 没有这个问题),规划不当会出 SIA
所以现实里的选择通常是:纯思科环境可以用 EIGRP(配置简单、收敛快),多厂商或对外互联一律 OSPF。
动手:看一眼拓扑表长什么样
拓扑表是 EIGRP 的核心数据结构,对应 show ip eigrp topology。
它和路由表的区别:拓扑表存所有候选路径(含备份),路由表只存实际用的那条。
OSPF 里对应的是 LSDB,但 LSDB 存的是「拓扑」,拓扑表存的是「距离」——这个差别就是两类协议的分水岭。
实验重点
- EIGRP 仍然是距离矢量:只知道邻居报的距离,没有全网拓扑图,不跑 Dijkstra
- 它靠可行性条件在本地判断无环,从而兼得轻量和快速收敛
- 思科私有 —— 多厂商环境只能用 OSPF,这是选型的决定性因素
- 拓扑表存所有候选路径(含备份),路由表只存实际使用的
复合度量:其实只有两个变量
入门 · 约 12 分钟
本课目标:把「五个参数」这个常见误解纠正掉,学会用 delay 调路由。
最常见的误解
很多资料说「EIGRP 用带宽、延迟、负载、可靠性、MTU 五个参数算度量」。
这句话是错的,至少是极具误导性的:
· MTU 从来不参与计算 —— 它只是随路由一起传播的信息
· 负载和可靠性默认不参与(K2=K4=K5=0)
所以默认情况下只有两个变量:带宽和延迟。
公式和两种聚合方式
默认 K 值下:
度量 = 256 × ( 10^7 / 最小带宽(Kbps) + 累加延迟(μs) / 10 )
只需要记住两个字段的聚合方式不一样:
· 带宽取路径上的最小值(瓶颈决定,木桶效应)
· 延迟是路径上各段之和(累加)
这个区别很重要:一条路径加了一段很快的链路,带宽项不变(瓶颈没变),但延迟项会增加 —— 所以多绕一跳一定会让度量变大,哪怕那一跳很快。
为什么整数除法会带来麻烦
10^7 / 带宽 是整数除法:
· 1 Gbps → 10^7/1000000 = 10
· 10 Gbps → 10^7/10000000 = 1
· 40 Gbps → 1
· 100 Gbps → 1
万兆以上全部区分不开,EIGRP 会认为它们一样快。
解法是命名模式的宽度量(64 位,分子换成 10^13),能一直区分到 655 Tbps。新配置应该用命名模式。
调优:改 delay,不要改 bandwidth
想让流量走另一条路时,两个参数都能达到目的,但首选改 delay:
· 改 bandwidth 会连带影响 QoS 预留、部分特性的默认参数、以及 show interface 的统计基准 —— 副作用多
· 改 delay 只影响路由度量,副作用最小
⚠️ 注意 delay 命令的单位是十微秒:想设 2000 μs 要写 delay 200。
而且两端都要改 —— 只改一端会造成去和回走不同的路。
动手:把一条链路的 delay 改大,看后继变不变
去拓扑页改 R1-R3 的延迟,然后回拓扑表看后继有没有换。这是最直观的「度量决定选路」的验证。
实验重点
- 默认只有带宽和延迟两个变量;MTU 从不参与,负载/可靠性默认不参与
- 带宽取 min(瓶颈)、延迟取 sum(累加) —— 记住这两个聚合方式就够了
10^7/带宽是整数除法 → 万兆以上区分不开 → 用命名模式的宽度量- 调优首选改 delay(副作用最小),单位是十微秒,两端都要改
- 不要开 K2(load) / K5(reliability):度量随流量变化会导致路由持续震荡
可行性条件:整个 EIGRP 就这一条
进阶 · 约 15 分钟
本课目标:把 FD / RD / FC 彻底搞懂。这一课听懂了,EIGRP 就学完了 80%。
三个数字
· FD(Feasible Distance,可行距离) = 我到目的地的最优度量
· RD(Reported Distance,通告距离) = 邻居告诉我它到目的地要多远
· 总度量 = RD + 我到那个邻居这一跳的度量
show ip eigrp topology 里每条路径显示成 (总度量/RD) —— 括号里两个数就是这么来的。
可行性条件:RD < FD
一个邻居能当备份,当且仅当它报的距离比我当前的最优距离严格小。
RD < FD
满足的叫可行后继(Feasible Successor),度量最小的那条叫后继(Successor)。
★ 为什么这一条就能保证无环
这是本课的核心,值得慢慢想:
假设邻居 N 报的距离比我小(RD < FD)。问:N 有可能是绕过我走的吗?
如果 N 真的绕我走,那么 N 的距离 = 我的距离 + 从我到 N 那段 > 我的距离。
也就是 RD > FD,和前提矛盾。
所以:RD < FD ⟹ N 不经过我 ⟹ 拿 N 当备份不会成环。
整个 DUAL 就建立在这个简单的不等式上。而且注意这个判断完全是本地的 ——不需要知道全网拓扑,只要邻居报一个数字过来。这就是 EIGRP 能在距离矢量框架下做到无环的原因。
反过来不成立:不可行 ≠ 有环
RD ≥ FD 不代表这条路一定有环,只代表无法证明它无环。
现实中那条路很可能完全是通的、也确实无环,只是从我这个位置看不出来。
EIGRP 选择保守:不能证明就不用,宁可花一轮 Query/Reply 去确认。
「宁可慢,也不成环」 —— 这是 DUAL 的取舍,也是理解「为什么会进 Active」的前提。
一个反直觉的细节:FD 不会上调
FD 记的是「到目前为止的最优距离」。它只在路由稳定时下调,不会因为路径变差而上调,直到路由重新进入 Active 才被重算。
为什么这么设计?因为如果 FD 能随便上调,原本不可行的路径会突然变得「可行」 —— 无环保证就失效了。
所以你有时会在真机上看到「后继的度量比 FD 大」,那不是 bug。
动手:对比两个场景
先看「三角形」场景:R1 有一个可行后继。
再加载「没有可行后继」场景:同样有两条路,但备份那条不满足 FC。
两个场景的拓扑表放在一起看,FC 的作用就很清楚了。
实验重点
- FC:RD < FD,也就是「邻居到目的地比我近」
- 「比我近」⟺「它不经过我」⟺「拿它当备份不会成环」 —— 这就是全部证明
- 这个判断完全是本地的,不需要全网拓扑 —— EIGRP 能兼得两者的原因
- 不可行 ≠ 有环,只是无法就地证明无环。EIGRP 宁可保守
- FD 不会因为路径变差而上调,否则 FC 就失效了
收敛:0 个报文 和 一场 Query 风暴
进阶 · 约 14 分钟
本课目标:看清「有可行后继」和「没有」在代价上的巨大差异。
有可行后继:本地切换
后继失效时,如果拓扑表里有可行后继:
直接把它提上来用,完事。
· 不发一个 Query
· 不问任何邻居
· 路由从头到尾是 Passive
· 收敛时间只受「接口多快感知到 down」限制 → 亚秒级
为什么敢这么干?因为可行后继当初就是按 FC 筛出来的,无环性在它被记录下来的那一刻就已经证明完了。
没有可行后继:扩散计算
① 路由置成 Active(show ip eigrp topology 里显示 A)
② 向所有邻居(除失效方向)发 Query
③ 邻居如果自己也没有可行后继,继续向它的邻居发 Query ← 「扩散」
④ 等所有 Reply 回来,才敢重算 FD、用新后继
关键点:收敛时间取决于最慢的那个邻居,不取决于自己。
而且 Active 期间这个目的地是不可达的。
SIA:最坏的情况
有一个邻居迟迟不回 Reply(链路拥塞、CPU 打满、单向故障…),路由就会一直卡在 Active。
3 分钟后触发 SIA(Stuck In Active),EIGRP 的处理很暴力:直接重置那个不回 Reply 的邻居,把它相关的所有路由全部清掉。
在大网里这可能引发连锁震荡 —— 这是 EIGRP 最需要提防的失效模式,OSPF 完全没有对应的问题。
三个抑制手段(按有效性排序)
① 把末梢站点设成 stub —— 最有效。stub 不回答 Query、不参与扩散,直接砍掉 Query 树的大部分分支
② 做好汇总 —— 汇总点会「吸收」Query:上游只知道汇总路由,下游明细的变化传不上去
③ 保证有可行后继(合理的拓扑和度量)—— 从根本上避免进 Active
⚠️ 调大 Active 计时器不是解决办法 —— 那只是推迟症状,真正的问题是 Query 范围太大。
动手:同一个操作,两个场景各做一次
在「没有可行后继」场景断掉 R1-R3,数一下发了几个 Query/Reply。
再切到「三角形」场景断同一条链路 —— 0 个。
这个对比做完,「EIGRP 收敛快」这句话就有了准确的前提条件。
实验重点
- 有可行后继 → 0 个 Query、全程 Passive、亚秒级
- 没有可行后继 → 进 Active、Query 扩散、收敛时间取决于最慢的邻居
- 「EIGRP 收敛快」只在有可行后继时成立
- SIA 是 EIGRP 独有的风险:3 分钟后直接重置不回 Reply 的邻居
- 抑制 SIA:stub 最有效 > 汇总 > 保证有可行后继;调计时器没用
邻居建不起来:和 OSPF 正好互为镜像
排障 · 约 12 分钟
本课目标:记住一组对照表,两个协议的邻居问题就都能定位了。
★ 一张对照表
| 参数 | EIGRP | OSPF |
| --- | --- | --- |
| 进程号 / AS 号 | 必须一致 | 本地含义,可以不同 |
| Hello / Hold 间隔 | 可以不同 | 必须一致 |
| K 值 | 必须一致 | 没这东西 |
| MTU | 不校验 | 必须一致(卡 ExStart) |
| 认证 | 必须一致 | 必须一致 |
| 同网段 | 必须 | 必须 |
前两行正好是互为镜像的 —— 这是从 OSPF 转过来的人最容易踩的地方。
AS 号不一致:最高频
router eigrp 100 里那个 100 是自治系统号,会放进每个 EIGRP 报文,两端必须完全一致。
对比 OSPF:router ospf 1 那个 1 只是本地进程编号,一端写 1、另一端写 65535 也能建邻接。
现象:show ip eigrp neighbors 完全是空的 ——连一条「建立中」的记录都没有,因为不匹配的 Hello 在收到的第一步就被丢了。
所以:邻居表空的、接口 up、网段也对 → 先查 AS 号。
K 值不一致:EIGRP 特有
K 值决定度量怎么算。两端不一致 → 算出的度量没有可比性 → 「A 认为走 B 便宜」和「B 认为走 A 便宜」可能同时成立 → 直接成环。
EIGRP 的选择是干脆不让这种邻居建起来 —— 宁可不通,也不要环路。
现象很好认:日志反复打 「K-value mismatch」,邻居 up 一下又 down。
接口根本没参与 EIGRP
network 命令是用来选中本地接口的,不是「通告这个网段」。
接口 IP 没落在任何 network 语句范围里 → 这个接口完全不参与 EIGRP:不发 Hello、也不通告它的网段。
查法:show ip eigrp interfaces —— 看不到这个接口就是没被选中。
注意 EIGRP 的 network 用反掩码,不写的话按 A/B/C 类自然掩码理解,很容易多选或少选。
passive-interface:不是故障
passive 的接口不收发 Hello(所以那里不会有邻居),但网段照样通告出去。
这正是它的用途:接终端的接口应该设成 passive —— 宣告那个网段,但不在上面浪费资源找邻居(也更安全)。
看到 passive 接口上没邻居,那是配置正确的表现。
排查顺序
① show ip interface brief —— 接口 up 吗、IP 对吗
② show ip eigrp interfaces —— 这个接口参与 EIGRP 了吗
③ 两端 show run | section router eigrp —— AS 号一样吗
④ 看日志有没有 K-value mismatch
⑤ debug eigrp packets hello —— 收到对端 Hello 了吗
第 ③ 步不要跳。
实验重点
- EIGRP 的 AS 号必须一致、Hello 可以不一致;OSPF 恰好相反 —— 记这一组对照
- 邻居表完全是空的 → 先怀疑 AS 号(不匹配的 Hello 第一步就被丢)
- 日志打 K-value mismatch → K 值不一致,两端 metric weights 要一样
network是选接口用的,不是通告网段;用反掩码- EIGRP 不校验 MTU(OSPF 会),passive 接口没邻居是正常的
现网里那几个真会咬人的配置
排障 · 约 12 分钟
本课目标:水平分割、自动汇总、variance、重分发种子度量。
水平分割:中心辐射拓扑的必踩坑
规则:从一个接口学到的路由,不再从同一个接口发出去。
本意是防环(距离矢量协议的传统手段)。
但在中心辐射(帧中继 / DMVPN 半网状)里就出事了:中心用一个物理接口接多条虚电路,从 Spoke1 学到的路由不会再从同一个接口发给 Spoke2 → 分支之间互相学不到路由。
注意前提是「同一个接口」—— 每个分支各占一个物理口就没这问题。
两种解法,第二种更好
① 在中心那个接口下 no ip split-horizon eigrp <AS>
能解决,但把防环机制关掉了
② 给每条虚电路做点到点子接口(Se0/0.1、Se0/0.2)
每个子接口是独立接口,水平分割天然不会挡 —— 不用关任何机制
生产上优先第二种。
自动汇总:不连续网络的杀手
开了 auto-summary,路由器会在主类边界(A/B/C 类)自动汇总。
经典事故:R1 后面是 10.1.1.0/24,R2 后面是 10.2.2.0/24,中间用 172.16 互联。两台都会把自己那侧汇总成 10.0.0.0/8 通告出去 → 两边都宣称「我能到整个 10.0.0.0/8」→ 互相覆盖,流量走错。
新版 IOS 默认 no auto-summary,老版默认开着 —— 接手老设备时这是必查项。
variance:只对可行后继生效
variance N 让度量 < N×FD 的路径也参与转发(非等价负载分担,这是 EIGRP 独有的能力,OSPF 只能等价分担)。
⚠️ 只有可行后继才参与 —— 不可行的路径不管度量多小都不会用,因为无法保证无环。这是最容易误解的地方。
生产上要谨慎:流量按度量反比分配,走慢路的那部分用户体验会明显变差。很多时候「有备份但不分担」比「分担到一条烂路上」更好。
重分发必须给种子度量
把静态路由或别的协议重分发进 EIGRP 时,必须指定度量:
redistribute static metric 100000 100 255 1 1500
(依次是 bandwidth delay reliability load MTU)
不给的话度量是无穷大,路由根本不会被通告出去。
现象是「我明明配了 redistribute,邻居却学不到」——而且不报任何错,非常难查。
(对比:重分发进 OSPF 有默认度量 20,不给也能用。)
外部路由的管理距离不一样
· EIGRP 内部路由:管理距离 90
· EIGRP 外部路由(重分发进来的):管理距离 170
170 比 OSPF 的 110 大,所以同一条前缀同时从 OSPF 和 EIGRP 外部学到时,会选 OSPF 那条。做协议迁移时这个细节经常导致意外的流量路径。
实验重点
- 水平分割在中心辐射 + 同一物理接口时会让分支互相学不到;优先用点到点子接口解决
- auto-summary 会把不连续网络搞坏;新版默认关、老版默认开
- variance 只对可行后继生效,不可行的路径再快也不用
- 重分发必须给种子度量,否则度量无穷大、路由不通告(且不报错)
- EIGRP 内部管理距离 90、外部 170(比 OSPF 的 110 大)