本页课程原文(点开阅读)

IS-IS 链路状态路由

课程(6 节,按顺序学)

第 1 课 · IS-IS 和 OSPF 到底差在哪

入门 · 约 10 分钟

本课目标:先建立正确的参照系:它们有多像,以及那五处不同分别付出了什么代价。

先说像的部分(这部分可以直接搬 OSPF 的理解)

IS-IS 和 OSPF 都是链路状态协议,工作方式在骨架上完全一致:

① 和邻居建立邻接关系,靠 Hello 报文维持
② 把「我连着谁、cost 多少、我能到哪些前缀」装进报文泛洪给全网
③ 每台设备各自攒出一份完整的拓扑图(数据库)
④ 在这张图上跑 Dijkstra 算最短路

所以你在 OSPF 那个 tab 学到的核心直觉 ——「每台设备都有全网拓扑图,所以环路数学上不可能」 —— 在这里完全适用。
这也是它们俩都比 RIP / EIGRP 强的根本原因。

★ 然后是那五处不同(这一课唯一需要记的东西)
OSPF                     IS-IS
跑在哪         IP 之上(协议号 89)      直接跑在链路层
分层边界       在路由器内部(ABR)      在链路上
骨干           area 0,一个区域号       所有 L2 路由器的连续集合
广播网选举     DR / BDR,不可抢占       DIS,可抢占,没有 BDR
扩展方式       新增 LSA 类型            加一个 TLV

★ 其中第 1 条和第 5 条是同一件事的两面:
IS-IS 不依赖 IP,内容全靠 TLV 装 —— 所以支持 IPv6 只要多加一个 TLV;
OSPF 自己就跑在 IPv4 上,只能另开一个 OSPFv3。

这就是为什么运营商骨干网偏爱 IS-IS:它扩展起来代价小得多,MPLS-TE、Segment Routing 这些后来的东西都是加 TLV 加上去的。

动手:看清「分层边界在链路上」

去拓扑与邻接页看默认的「两级基础」场景,只看 R2:

· R2 对 R1 的邻接是 L1(同区域 49.0001)
· R2 对 R3 的邻接是 L2(跨区域)

★ 同一台设备,两个邻居,两种级别 —— 级别是「链路上的属性」。

对比 OSPF:ABR 是「一只脚在 area 0、另一只脚在非骨干区域」的一台设备,区域是接口的属性,但「谁是 ABR」是设备的身份。
IS-IS 里没有「ABR」这个身份,只有「这条链路上我讲哪一级」。

实验重点

  • IS-IS 和 OSPF 的骨架完全一样:邻接 → 泛洪 → 拓扑图 → Dijkstra
  • 五处不同:跑在哪 / 分层边界 / 骨干定义 / 广播网选举 / 扩展方式
  • IS-IS 不跑在 IP 上 + 内容靠 TLV → 扩展代价小,这是它在运营商网络流行的原因
  • 分层边界在链路上,不在路由器上

第 2 课 · System ID 和区域号(别拿 IP 的直觉套)

入门 · 约 8 分钟

本课目标:搞清 IS-IS 怎么标识一台设备,以及区域号在哪些场合必须一致。

System ID:6 字节,和 IP 完全无关

OSPF 的 Router-ID 长得像 IP(而且通常就取 loopback 地址),这会让人以为「路由器身份 = 某个 IP」。

IS-IS 的 System ID 是个纯标识符:6 字节,写成 xxxx.xxxx.xxxx 三段十六进制,和 IP 一点关系都没有。
唯一的硬要求是:在整个 IS-IS 域内唯一。

现网为了保证唯一 + 便于排障,通常从 loopback 机械映射:
10.1.1.1 → 补零成 010.001.001.001 → 0100.0100.1001。
这只是个人为约定,协议并不要求。

完整的 NET 地址

配置里写的其实是 NET(Network Entity Title):

49.0001  .  0000.0000.0001  .  00
  ↑              ↑              ↑
区域号        System ID       NSEL(永远 00)

· 49 是私有 AFI,相当于 IP 里的私网地址段,企业网和实验用它就行
· NSEL 固定 00,表示「这是台路由器」—— 记住写 00 就完了

★ 区域号什么时候必须一致

只有一条规则,但它是很多故障的根源:

L1 邻接要求两端区域号完全相同;L2 邻接不要求。

推论(现网高频故障):两台设备都是默认的 level-1-2、区域号却不同 →
L1 邻接建不起来,自动降级成只有 L2 邻接。

★ 这个现象很迷惑:display isis peer 能看到邻居,但只有 Level-2 那一行,区域内的路由死活不通。
如果这本来就是跨区域互联,那这是正确行为;如果你以为它们在同一个区域,那就是配错了。

实验重点

  • System ID 6 字节,域内唯一,和 IP 无关
  • NET = 区域号 + System ID + 00
  • ★ L1 邻接要求区域号相同,L2 不要求
  • 都配 level-1-2 但区域号不同 → 自动降级成只有 L2 邻接

第 3 课 · 邻接为什么起不来(四种查法)

排障 · 约 14 分钟

本课目标:IS-IS 邻接故障有个共同特征:接口 up、能 ping 通,就是没有邻居。

三个状态就够了(对比 OSPF 的八个)

IS-IS 的邻接状态机只有 Down / Initializing / Up 三个。

OSPF 那八个状态里,IS-IS 省掉的两个关键环节是:
· 不选 2-Way —— 广播网上所有人和所有人都建邻接,没有 OSPF 那种「只和 DR 全同步」的设计
· 不用 ExStart 协商主从 —— 靠 CSNP / PSNP 直接比序列号,谁缺谁要

★ Initializing 卡住 = 单向可见:我收到了它的 IIH,但那个 IIH 里没列出我 → 说明它收不到我的报文。
这是单向链路的典型症状(光纤单向断、一端 shutdown)。

★ 四种起不来的原因,按排查顺序

① 层级不匹配 —— 一端只讲 L1、另一端只讲 L2
 L1 IIH 和 L2 IIH 是两种不同的报文,只讲另一级的那端根本不应答。
 查:display isis interface 看两端的 circuit-level。

② 区域号不同却想建 L1 —— 见上一课。
 查:display isis peer 如果只有 Level-2 那一行,八成是这个。

③ System ID 重复 —— 两台设备自称同一个人。
 现象很特别:路由不停闪、LSP 序列号疯涨(两台互相覆盖对方的 LSP)。

④ 认证不匹配 —— IIH 直接被丢。
 IS-IS 的认证可以分别加在接口级(保护邻接)和区域/域级(保护 LSP)。

★★ 第五种:邻居 Up 了,但 LSDB 同步不完

这是 IS-IS 最难查的故障,值得单独记:两端 MTU 不一致。

IS-IS 不做 MTU 协商,也不像 OSPF 那样在 DD 报文里检查 MTU。于是:
· IIH 报文很小 → 过得去 → 邻居显示 Up,一切正常
· LSP 报文大 → 被丢弃 → LSDB 死活同步不完 → 路由时有时无

★ 难查的地方在于症状和病因离得非常远:你看到的是「路由不稳」,而病因在物理接口的 MTU 配置上,而且邻居状态、接口状态、ping 全都正常。

记住这个因果链,能省你几个小时。

实验重点

  • 三个状态:Down / Initializing / Up
  • Initializing 卡住 = 单向可见 = 单向链路
  • 四种起不来:层级 / 区域号 / System ID 重复 / 认证
  • ★ 第五种最阴:MTU 不一致 → 邻居 Up 但 LSDB 同步不完

第 4 课 · ★ L1 的次优路由(本模块核心)

进阶 · 约 18 分钟

本课目标:这是 IS-IS 独有、现网真会踩的坑。理解它,你就理解了分层的代价。

先看 L1 路由器手里有什么信息

L1 路由器只维护本区域的 LSDB。 区域外的拓扑它压根看不见。

那它怎么去区域外?靠一条默认路由:
L1/L2 路由器在自己的 L1 LSP 里置上 ATT(Attached)位,含义是「我连着骨干」。
区域内的 L1 路由器看到这一位,就生成一条指向它的默认路由。

★ 关键在于:ATT 位只说「我连着骨干」,没说「从我这儿出去有多远」。
所以当区域里有多个出口时,L1 只能按一个标准挑:谁离我最近。

★★ 「离我最近」不等于「去目的地最优」

默认场景就是为这件事造的:

区域 49.0001(L1)                    区域 49.0002

  R1(L1) ──10── R2(L1/L2) ──50── R4(L2) ──10── R5 → 10.2.2.0/24
    │                             │
    └────30──── R3(L1/L2) ───5────┘

R1 要去 10.2.2.0/24。它看得到的信息只有「到两个出口分别多远」:
· 到 R2 = 10 → 最近,选它
· 到 R3 = 30 → 淘汰

但把出区域之后的路算进来,结论正好相反:
· 经 R2 全程 = 10 + 50 + 10 = 70
· 经 R3 全程 = 30 + 5 + 10 = 45 ← 真正最优

★★★ R1 选了一条贵 25 的路,而它自己完全不知道。
这不是配置错误,是分层设计的固有代价。

动手:把它跑出来

去路由计算页,选 R1、目标前缀 10.2.2.0/24,点计算。

重点看那张「出口候选」表:
· R2 那行:区域内 cost 10(L1 看得到)、全程 70(L1 看不到)
· R3 那行:区域内 cost 30、全程 45
· 界面会标出「L1 选了它」和「这才是最优」落在不同的行上

然后切到 R2 看一眼:R2 是 L1/L2,它能看到区域外的明细路由 ——对比一下就知道 R1 缺的到底是什么信息。

★ 解法:路由泄露(RFC 2966)

标准解法是让 L1/L2 路由器把 L2 的明细路由注入 L1 ——叫路由泄露(route leaking)。

泄露之后 R1 就能看到「去 10.2.2.0/24 经每个出口分别多少 cost」,于是自己选出最优的那个,次优路由消失。

在路由计算页把 R3 的「路由泄露」开关打开,再算一次 ——cost 会从 70 掉到 45。

代价:L1 的 LSDB 变大了。泄露多少明细要自己权衡 ——
全泄露就等于放弃了分层带来的规模收益,那还不如不分层。

另一种做法是调 cost 让「最近的出口」正好也最优 —— 能用,但很脆弱:拓扑一变、或者加了新出口,又会错。

★ 对比:OSPF 里没有这个问题

OSPF 的 ABR 会把区域间明细路由(Type-3 LSA)注入区域,所以区域内的路由器能看到「去这个前缀经哪个 ABR 总共多少 cost」,自己就能选最优。

★ 所以这是一次明确的设计取舍:
· OSPF:默认注入明细 → 不会次优,代价是区域内 LSDB 大
· IS-IS:默认只给一位 ATT → LSDB 小得多,代价是可能次优

IS-IS 选了「更省」,然后用路由泄露作为按需补救的手段。
在骨干网那种规模下,这个取舍是合理的 —— 但你得知道它的代价在哪。

实验重点

  • ★ L1 只有一条默认路由出区域,指向最近的 ATT 路由器
  • ★ 「离我最近的出口」≠「去目的地最优的出口」→ 次优路由
  • ATT 位只说「我连着骨干」,不说「从我这儿多远」
  • 解法:路由泄露(RFC 2966)。代价是 L1 的 LSDB 变大
  • OSPF 没这个问题(ABR 注入 Type-3),这是一次明确的设计取舍

第 5 课 · DIS 和伪节点(对比 DR/BDR)

进阶 · 约 12 分钟

本课目标:广播网上的选举。三处和 OSPF 不同,每一处都有理由。

为什么需要选一个代表

N 台设备接在一个以太网上,如果互相直接通告邻接关系,LSDB 里会有 N×(N−1) 条关系。

解法是选一个代表,把整个网段抽象成一个虚拟节点,每台设备只通告「我连到这个虚拟节点」→ 降到 N 条。

· OSPF 叫 DR,虚拟节点体现为 Network LSA
· IS-IS 叫 DIS,虚拟节点叫 伪节点(pseudonode),由 DIS 生成一条伪节点 LSP

思路完全一样。注意伪节点到各成员的 cost 都是 0 ——网段本身不该增加开销。

★ 三处和 DR/BDR 不同

① DIS 可以被抢占
 优先级更高的设备上线会顶掉现任 DIS。
 OSPF 的 DR 一旦选出就不让位(除非它挂了)—— 为了避免不必要的震荡。
 IS-IS 选了「结果可预测」:谁优先级高就该是谁,不管谁先来。

② 没有 BDR
 IS-IS 认为 DIS 切换足够快,不需要预备。
 快在哪:DIS 发 IIH 的间隔是普通路由器的 1/3(3.3 秒 vs 10 秒),所以它挂了能更快被发现。

③ 优先级 0 也参选
 OSPF 里优先级 0 表示「我放弃选举」;IS-IS 里 0 只是个很小的优先级。
 想让某台设备别当 DIS,只能把别人调高。

选举规则:优先级大的赢,相同则 System ID 大的赢。

动手:看抢占

去拓扑与邻接页加载「DIS 选举与抢占」场景。四台设备在一个广播网上,R3 的优先级是 90,其余是 64 → R3 是 DIS。

然后把 R4 的优先级改成 100,再看一次 —— DIS 变成了 R4。这在 OSPF 里不会发生。

★ 顺便看看 LSDB 页里那条伪节点 LSP:LSP-ID 的伪节点号是 01 而不是 00,这就是区分它和普通 LSP 的方法。

现网实践:干脆别用广播网

两台设备之间的以太网互联,通常手工配成点对点:

interface GigabitEthernet0/0/1
 isis circuit-type p2p

好处:不选 DIS、不生成伪节点 → 邻接建立更快、LSDB 更小、少一类故障。

只有真的多台设备接在同一个交换网段上时才让它保持广播类型。

实验重点

  • DIS 和 DR 思路一样:把网段抽象成一个虚拟节点,关系数从 N² 降到 N
  • ★ 三处不同:DIS 可抢占 / 没有 BDR / 优先级 0 也参选
  • DIS 的 Hello 间隔是普通路由器的 1/3,所以切换快
  • 伪节点 LSP 的伪节点号非 00;到各成员 cost 都是 0
  • 现网实践:两台设备互联的以太网配成 p2p

第 6 课 · 窄度量 63 的坑 + 骨干不连续

排障 · 约 12 分钟

本课目标:两个必须知道的默认值陷阱。

★ 窄度量:接口 cost 上限 63

IS-IS 默认是窄度量,接口 cost 字段只有 6 bit → 最大 63,整条路径累加上限 1023。

后果很实在:
· cost 只能在 1~63 取值,没法按带宽合理拉开差距
· 不支持流量工程 —— TE 需要的子 TLV 装不进窄度量

★ 这和 EIGRP 的经典度量卡在 10 Gbps 是同一类问题:协议诞生时字段留窄了,后来只能靠扩展补救。

解法是 cost-style wide,cost 扩展到 24 bit。
MPLS-TE、Segment Routing、IPv6 都要求宽度量。

⚠️ 切换宽度量有个坑

窄度量和宽度量的路由器算路时互相看不见对方的度量。

所以直接全网改成 wide,在切换窗口里会丢路由。正确姿势:

① 全网先改成 cost-style compatible   # 同时发两种、都能收
② 确认全网都收敛了
③ 再全网改成 cost-style wide

这是个典型的「协议升级要留兼容窗口」案例。

★ 骨干不连续:比 OSPF 隐蔽得多

IS-IS 的骨干是「所有 L2 路由器构成的连续集合」,没有编号。

好处是灵活:骨干形状随拓扑长,不需要谁去规划一个 area 0。
代价是断了不会有任何报错:

· OSPF:至少有「area 0」这个明确概念,谁没连到 area 0 一眼能看出来,还有虚链路这种明确的补救手段
· IS-IS:骨干裂成两半时,两边各自都觉得自己好好的,只是区域间路由不通 —— 你只能自己检查 L2 邻接的连续性

所以关键位置的 L2 链路一定要做冗余。

实验重点

  • ★ 窄度量接口 cost 上限 63,路径上限 1023,且不支持 TE
  • 切宽度量要先过渡到 compatible,直接切会丢路由
  • ★ 骨干 = 所有 L2 路由器的连续集合,没有编号,断了不报错
  • 关键位置的 L2 链路要做冗余
冀ICP备2026021556号-2|冀公网安备13068302000206号