OSPF 和 BGP 都讲完了,还剩一个重量级的路由协议:IS-IS。它和 OSPF 同属链路状态协议,思路几乎一样,但骨子里有几个设计差异,导致运营商的大网几乎清一色用 IS-IS。
先说结论:IS-IS 和 OSPF 的核心差别只有一个——IS-IS 的区域边界画在链路上,OSPF 的区域边界画在路由器上。这一条差异推导出了后面所有的不同。
IS-IS 的出身:先有 CLNP,后有 IP
IS-IS 最早是 ISO 为 CLNP(无连接网络协议)设计的动态路由协议——那是 OSI 阵营打算取代 IP 的一套协议栈。后来 IP 赢了,ISO 在 RFC 1195 里对 IS-IS 做了扩展,让它能同时支持 CLNP 和 IP,这就是 Integrated IS-IS(集成 IS-IS,也叫 Dual IS-IS)。
这个出身留下了两个可见的痕迹:
- 地址体系是 OSI 的——IS-IS 用的是 NSAP 地址,不是 IP 地址;
- 报文直接封装在数据链路层(以太网类型
0xFE FE),不跑在 IP 之上。而 OSPF 是 IP 协议号 89。
| IS-IS | OSPF | |
|---|---|---|
| 支持的网络层协议 | CLNP + IPv4 + IPv6 | 只支持 IP(v2/v3 分家) |
| 封装 | 数据链路层直接封装 | IP 报文(协议号 89) |
| 地址 | NSAP / NET | IP 地址 + Area ID |
| 扩展性 | 靠 TLV,加特性不动报文结构 | 靠 LSA 类型,改协议版本 |
最后一条是 IS-IS 在运营商受欢迎的真正原因:TLV(Type-Length-Value)机制让它极其好扩展。IPv6 支持、SR(Segment Routing)、SRv6、Flex-Algo……都是加几个新 TLV 就完事,不用改协议。而 OSPF 为了支持 IPv6 得另起炉灶搞 OSPFv3。
NSAP 与 NET:IS-IS 的"地址"
IS-IS 路由器的身份标识不是 IP,而是一个 NET(Network Entity Title)。NET 本质上是 SEL 字段为 00 的 NSAP 地址。
49.0001.0000.0000.0001.00
└┬┘ └─┬┘ └──────┬──────┘└┬┘
│ │ │ └── SEL(1 字节,固定 00)
│ │ └─────────── System ID(6 字节 = 48 bit)
│ └───────────────────── Area ID(区域号,变长 1~13 字节)
└────────────────────────── AFI(地址族标识,49 = 私有地址)
规则拆解:
· AFI 常用 49(本地管理,相当于私网);39 是 ISO 分配的
· 区域号 + System ID + SEL = NET
· System ID 必须【全网唯一】,长度固定 6 字节
· 一个路由器最多配 3 个 NET,但 System ID 必须相同
常用做法:把 Loopback0 的 IP 补全成 12 位十进制当 System ID
Loopback0 = 1.1.1.1 → System ID = 0000.0000.0001
完整 NET = 49.0001.0000.0000.0001.00
这样一看到 System ID 就知道它的 Loopback 地址,排障方便
注意:同一个区域内的所有路由器,Area ID 必须一致;而 L2 骨干区域不需要 Area ID 一致(L2 不看区域)。这是 IS-IS 一个容易搞混的点。
分层:L1、L2、L1-2
IS-IS 把网络分成两个层次,路由器的角色由它的 is-level 决定:
| 角色 | 在哪 | 维护什么 LSDB | 路由计算范围 |
|---|---|---|---|
| Level-1(L1) | 非骨干区域 | 只有 L1 LSDB(本区域) | 只能算区域内路由,出区域靠默认路由 |
| Level-2(L2) | 骨干区域 | 只有 L2 LSDB | 算区域间路由 |
| Level-1-2(L1/2) | 区域边界 | 两套 LSDB 都有 | 同时算区域内外,相当于 OSPF 的 ABR |
和 OSPF 区域的根本差别
这是理解 IS-IS 的钥匙,画出来最清楚:
OSPF:区域边界在【路由器】上
┌──────── Area 1 ────────┐┌──────── Area 0 ────────┐
│ R1 ── R2 ── ABR ─────┼┼───── R3 ── R4 │
└────────────────────────┘└────────────────────────┘
↑
ABR 这台路由器【一半属于 Area 1,一半属于 Area 0】
不同区域跑在不同接口上
IS-IS:区域边界在【链路上】
┌──────── L1 区域 49.0001 ────────┐ ┌──── L2 骨干(无区域概念)────┐
│ R1 ── R2 ── L1/2 │ │ L1/2 ── R3 ── R4 │
└─────────────────────────────────┘ └───────────────────────────────┘
↑
L1/2 路由器的【所有接口都在同一区域】,
但它的 L2 接口同时参与骨干
★ 结果:IS-IS 一台路由器只属于【一个区域】,加区域比 OSPF 灵活得多
骨干区域的定义也不一样:OSPF 的骨干是 Area 0;IS-IS 的骨干是所有 L2 和 L1/2 路由器构成的拓扑,没有"区域号"的概念。
ATT 位与默认路由
L1 路由器怎么出去?靠 L1/2 路由器在 L1 LSP 里置位的 ATT(Attachment)位。
- L1/2 路由器如果有 L2 邻居,就在自己产生的 L1 LSP 里把 ATT 位置 1;
- L1 路由器看到 ATT=1,就自动产生一条指向该 L1/2 路由器的默认路由(
0.0.0.0/0); - 注意:L1 路由器产生的是 ATT 位的默认路由(Up/Down 状态看 ATT),而 L1/2 自己会下发一条
0.0.0.0/0的 L2 默认路由。
这就是 display isis route 里看到 0.0.0.0/0 的来源。
网络类型与 DIS 选举
IS-IS 只认两种网络类型:广播(Broadcast)和点对点(P2P)。以太网默认是广播。
DIS:为什么不叫 DR
广播网络上同样需要选一个"代表"来减少邻接数。IS-IS 叫它 DIS(Designated Intermediate System,指定中间系统),和 OSPF 的 DR 有三个关键差别:
| OSPF 的 DR | IS-IS 的 DIS | |
|---|---|---|
| 有备份吗 | 有 BDR | 没有备份,DIS 挂了重新选 |
| 能抢占吗 | 非抢占(除非 DR 失效或重启进程) | 可抢占——来了个优先级更高的,立刻换 |
| 选举依据 | 优先级(默认 1)→ Router ID 大者胜 | 优先级(默认 64,范围 0~127)→ MAC 大者胜 |
| 邻接关系 | DROther 之间停在 2-Way | 所有路由器之间都建邻接,都到 Up |
为什么 IS-IS 不需要 BDR?因为所有路由器之间都是全互联的邻接——DIS 只负责周期性发 CSNP 做数据库同步,泛洪还是大家互相做。DIS 挂了,其他路由器照样能同步,只是少了那个"定期对账"的角色,重选一下就行。
interface GigabitEthernet0/0/1
isis dis-priority 100 # 默认 64,范围 0~127,0 表示不参与
isis dis-name CORE_SW1 # 给 DIS 起个名字(可选,方便看)
display isis interface verbose # 看谁是 DIS
P2P 的三次握手
IS-IS 在 P2P 链路上有两种握手模式:
- 两次握手(Two-way):只要收到对端 Hello,就单方面宣布邻居 Up。隐患:单向链路也能"建立"邻居;
- 三次握手(Three-way):Hello 里带自己的 System ID 和邻居列表,双方都确认后才 Up。华为默认就是三次握手,能防单向链路问题。
四种报文与 TLV
IS-IS 的报文比 OSPF 少得多,只有四类:
| 报文 | 全称 | 作用 | 类比 OSPF |
|---|---|---|---|
| IIH | IS-IS Hello | 发现和维护邻居。 分 LAN IIH(L1/L2 各一种)和 P2P IIH | Hello |
| LSP | Link State PDU | 携带链路状态信息,分 L1 LSP / L2 LSP | LSU(装 LSA) |
| CSNP | Complete SNP | 完整的 LSDB 摘要。DIS 每 10 秒在广播网上发一次 | DBD |
| PSNP | Partial SNP | 部分摘要。用于确认收到 LSP、请求缺失的 LSP | LSR / LSAck |
SNP(Sequence Number PDU)是 IS-IS 特有的一类,本质是"LSP 头部的清单",用来做数据库同步。
LSP 头部关键字段
LSP ID = System ID(6) + 伪节点ID(1) + 分片号(1)
0000.0000.0001.00-00
└─── System ID ──┘ └┬┘└┬┘
│ └── 分片号:LSP 太大就分片,最多 256 片
└───── 伪节点 ID:00 = 真实节点;非 0 = DIS 产生的伪节点
其他关键字段:
· Sequence Number —— 从 0x00000001 开始递增,越大越新
· Remaining Lifetime —— 剩余存活时间,初始 1200 秒(20 分钟)
· ATT 位 —— L1/2 有 L2 邻居时置 1(L1 LSP 里)
· OL 位 —— Overload,过载位。置 1 表示"别拿我当转发路径"(内存不足时自动置位)
· IS Type —— 01 = L1,11 = L2
★ LSP 刷新周期 900 秒(15 分钟),最大存活 1200 秒(20 分钟)
TLV:IS-IS 的扩展方式
LSP 的内容全是 TLV 拼起来的。TLV = Type(1 字节)+ Length(1 字节)+ Value。常见的:
| TLV | 名称 | 内容 |
|---|---|---|
| 1 | Area Addresses | 本路由器的区域地址 |
| 6 | IS Neighbors | 邻居的 System ID(+ 伪节点 ID) |
| 10 | Authentication | 认证信息 |
| 22 | Extended IS Reachability | 宽度量的邻居信息(含 TE 参数) |
| 128 | IP Internal Reachability | 区域内的 IP 前缀 |
| 130 | IP External Reachability | 引入的外部 IP 前缀 |
| 132 | IP Interface Address | 接口的 IP 地址 |
| 135 | Extended IP Reachability | 32 位度量的 IP 前缀(宽度量必用) |
度量:窄度量 vs 宽度量
IS-IS 的开销有新旧两套,混用会出问题:
| 窄度量 Narrow | 宽度量 Wide | |
|---|---|---|
| 取值范围 | 1~63(6 bit) | 1~16777215(24 bit) |
| 默认接口开销 | 10(与带宽无关) | 可手工指定,也可自动按带宽算 |
| TLV | 128 / 130 | 22 / 135 |
| 能否承载 TE | 不能 | 能(MPLS TE 必须用宽度量) |
所以跑 MPLS TE 或 SR 的网络必须配 cost-style wide。华为默认是 narrow,做实验时经常忘了改。
isis 1
cost-style wide
# 或者:
cost-style compatible # 收发都兼容两种(过渡期用)
路由渗透:解决 L1 的次优路径
默认情况下,L1 路由器只有本区域的路由 + 一条指向 L1/2 的默认路由。这会导致一个问题:
┌─── L1 区域 ───┐ ┌── L2 骨干 ──┐
R1(L1) ── R2(L1/2) ════════════ R3(L1/2) ── R4(L2)
│ ↑
└──────────── 另一条链路 ──────────┘
问题:R1 要去 R4,但 R1 只有默认路由指向 R2(最近的 L1/2)
→ R1 把包丢给 R2 → R2 查 L2 路由发现要绕回 R3
→ 实际路径:R1 → R2 → R3 → R4(绕远)
而物理上 R1 → R3 → R4 更近
原因:L1 路由器【不知道】区域外的具体路由,只能"盲猜"最近的出口
解法:路由渗透(Route Leaking)——在 L1/2 路由器上,
把 L2 学到的部分路由【泄露】到 L1 区域里,让 L1 路由器也能看到
# 在 L1/2 路由器(如 R2)上做
isis 1
import-route isis level-2 into level-1 filter-policy ip-prefix LEAK
# 先定义要泄露哪些路由
ip ip-prefix LEAK index 10 permit 10.1.0.0 16 less-equal 32
★ 注意方向:level-2 into level-1(把 L2 的泄露给 L1)
不能反过来做,否则 L1 的路由会污染骨干
★ 另一个用途:用路由渗透可以【只泄露需要的路由】,
而不是让 L1 路由器拿到全部 L2 路由(那样 LSDB 又会变大)
IS-IS 与 OSPF 全面对比
| 维度 | IS-IS | OSPF |
|---|---|---|
| 协议出身 | ISO / CLNP | IETF / IP |
| 区域边界 | 在链路上(一台路由器只属于一个区域) | 在路由器上(ABR 跨区域) |
| 骨干定义 | L2 + L1/2 组成的拓扑 | Area 0 |
| 网络类型 | 只有广播 / P2P | 广播 / NBMA / P2MP / P2P |
| 代表者 | DIS(可抢占、无备份) | DR/BDR(非抢占、有备份) |
| 邻接关系 | 广播网上全部 Up | DROther 之间停在 2-Way |
| 报文封装 | 链路层直接封装 | IP 协议号 89 |
| 报文数 | 4 种(IIH / LSP / CSNP / PSNP) | 5 种(Hello / DBD / LSR / LSU / LSAck) |
| 扩展方式 | TLV(加特性不动结构) | 新增 LSA 类型 / 协议版本 |
| 资源占用 | 较低(单播更新、报文少) | 较高 |
| 典型战场 | 运营商骨干、大型 DC | 企业网、园区 |
配置:两台路由器跑 IS-IS
# R1
isis 1
is-level level-1-2
network-entity 49.0001.0000.0000.0001.00
cost-style wide
#
interface LoopBack0
ip address 1.1.1.1 255.255.255.255
isis enable 1
#
interface GigabitEthernet0/0/1
ip address 10.0.0.1 255.255.255.0
isis enable 1
isis circuit-type p2p # 点对点(可选,广播口默认 broadcast)
isis cost 10 # 手工指定开销
isis circuit-level level-2 # 该接口只跑 L2
# 认证(可选)
isis 1
area-authentication-mode md5 cipher Huawei@123
domain-authentication-mode md5 cipher Huawei@123
几个配置要点:
- NET 必须手工配,没有默认值。忘了配 = 协议起不来;
is-level决定路由器角色。两端层次不匹配就成不了邻居(L1 只能和 L1 或 L1/2 建 L1 邻居);circuit-type两端必须一致(都是 broadcast 或都是 p2p);- 广播口跑 IS-IS 时,接口的 IP 网段必须一致(掩码可以不同);P2P 口可以配
isis peer-ip-ignore忽略 IP 检查。
验证与排错
display isis peer # ★ 邻居列表:System ID、状态、层次、接口
display isis interface verbose # 接口层次、DIS 是谁、开销
display isis lsdb # LSDB(L1/L2 分开看)
display isis lsdb local # 本机产生的 LSP
display isis route # ★ IS-IS 算出的路由(看 ATT 默认路由)
display isis route level-1 # 只看 L1
display isis brief # 进程概览:NET、is-level、cost-style
display isis statistics # 报文收发统计
display isis error # 报文级错误(排错用)
reset isis all # 重置 IS-IS(慎用)
# 重置某个邻居
reset isis peer 0000.0000.0002
四个高频问题:
- 邻居起不来 → 先查 NET 配了没、
is-level层次对不对、circuit-type两端是否一致; - 邻居 Up 但没路由 → 查
cost-style是否两端一致(窄/宽混用会导致度量算不出来),以及is-level是否匹配; - L1 路由器 ping 不通区域外 → 查 L1/2 的 ATT 位有没有置起来(
display isis lsdb local),没置说明 L1/2 没有 L2 邻居; - 路径明显绕远 → 就是上面说的 L1 次优问题,用路由渗透把 L2 路由泄露到 L1。
一句话总结:IS-IS 是"用 TLV 拼出来的 OSPF",区域边界画在链路上、DIS 可抢占无备份、广播网上全员邻接、扩展靠加 TLV。它比 OSPF 更省资源、更好扩展,代价是地址体系(NSAP)更绕、L1 的默认路由机制容易造成次优——后者要靠路由渗透来补。
📌 本篇整理自 2024–2025 的「数通」学习笔记(HCIE-Datacom 方向)
合并了原始笔记中「Is-is背景 / isis级别 / ISIS网络类型 / ISIS 报头 / ISIS开销 / ISIS工作流程 / ISIS与OSPF对比 / ISIs路由渗透及问题 / NET」九页。
原笔记里的层次对比表与 LSP 头部截图 OCR 损耗严重(IS-IS 被识别成「丐」),本文按 RFC 1195 与华为 VRP 实现重新校对,并补齐了 TLV 清单与路由渗透的推导过程。
配置命令保留华为 VRP 原样。