【HCNP路由交换学习指南】学习笔记丨第04章 IS-IS
01. 概述
IS-IS(Intermediate System to Intermediate System,中间系统到中间系统)是一种链路状态路由协议,在服务提供商网络中被广泛应用。IS-IS 与 OSPF 在许多方面非常相似,例如运行 IS-IS 的直连设备之间会通过 Hello 报文发现彼此,然后建立邻居关系,并交互链路状态信息,这些链路状态信息表现为 LSP(Link-State Packet,链路状态报文)。
每一台运行 IS-IS 的设备都会产生 LSP,设备产生的 LSP 会被泛洪到网络中适当的范围,所有的设备都将自己产生的、以及网络中泛洪的 LSP 存储在自己的 LSDB 中。IS-IS 设备基于自己的 LSDB 采用 SPF(Shortest Path First,最短路径优先)算法进行计算,最终得到 IS-IS 路由信息。另外,与 OSPF 一样,IS-IS 也支持层次化的网络架构,支持 VLSM,支持手工路由汇总等功能。
IS-IS 早期被 ISO 标准化时,是为 OSI 协议栈服务的,它是为 CLNP 设计的动态路由协议。需注意的是 OSI 与 TCP/IP 是两个不同的协议栈。
我们可以简单地将 OSI 协议栈中的 CLNP 理解为 TCP/IP 协议栈中的 IP 协议,两者实现的功能非常类似。最初的 IS-IS 是无法工作在 TCP/IP 环境中的,随着 TCP/IP 风靡全球,IETF 对 IS-IS 进行了扩展,使得它能够同时支持 IP 路由,这种 IS-IS 被称为集成 IS-IS(Integrated IS-IS) 。
由于在当今的通信网络中,TCP/IP 已经成了绝对的主流协议栈,因此如今我们所讨论的 IS-IS 几乎都指的是集成 IS-IS。
1.1 常用术语
- ISO(International Organization for Standardization,国际标准化组织):这是一个全球性质的非政府组织,成立于 1946 年,从其名称可以看出该组织的使命,即在国际上促进各领域的标准化实现。ISO 的一个广为人们所知的成果便是 ISO9000 质量体系,OSI 参考模型也是 ISO 的杰作。
- IS(Intermediate System,中间系统):指的是 OSI 中的路由器。
- IS-IS(Intermediate System to Intermediate System,中间系统到中间系统):用于在 IS 之间实现动态路由信息交互的协议。
- CLNP(Connection-Less Network Protocol,无连接网络协议):这是 OSI 的无连接网络协议,它与 TCP/IP 中的 IP 协议的功能类似。
- LSP(Link-State Packet,链路状态报文):这是 IS-IS 用于描述链路状态信息的关键数据,类似 OSPF 的 LSA。IS 将网络中的 LSP 搜集后装载到自己的 LSDB(Link State Database,链路状态数据库)中,然后基于这些 LSP 进行路由计算。LSP 分为两种:Level-1 LSP 及 Level-2 LSP
1.2 OSI 地址
在 TCP/IP 协议栈中,IP 地址用于标识网络中的设备,从而实现网络层寻址。一台设备如果存在多个接口,那么该设备便可能拥有多个 IP 地址,每个接口均可使用一个独立的 IP 地址。当然,有的时候,在一台设备的某个接口上,可能还会存在多个 IP 地址。
在 OSI 协议栈中,NSAP(Network Service Access Point,网络服务接入点) 被视为 CLNP 地址,它是一种用于在 OSI 协议栈中定位资源的地址。IP 地址只用于标识设备,而并不标识该设备的上层协议类型或服务类型,而 NSAP 地址中除了包含用于标识设备的地址信息,还包含用于标识上层协议类型或服务类型的内容,因此从这个层面上看,OSI 中的 NSAP 地址类似于 TCP/IP 中的 IP 地址与 TCP 或 UDP 端口号的组合。
一个 NSAP 地址由 IDP(Initial Domain Part,初始域部分) 和 DSP(Domain Specific Part,域指定部分) 两部分构成,而 IDP 及 DSP 这两部分又被进一步划分,如下图所示。在 NSAP 地址中,IDP 和 DSP 都是可变长的,这使得 NSAP 地址的总长度并不固定,最短为 8byte,最长则可以达到 20byte。

关于 IDP 及 DSP 中各个字段的含义,描述如下:
- AFI(Authority and Format Identifier,授权组织和格式标识符):长度为 1byte,用于标识地址分配机构。另外,该字段值同时也指定了地址的格式。一个在实验室环境中经常被使用到的 AFI 值是 49,该值表示本地管理,也即私有地址空间。
- IDI(Initial Domain Identifier,初始域标识符):该字段用于标识域(Domain),其长度是可变的。
- DSP 高位部分(High Order DSP):也就是 DSP 中的高比特位部分(在二进制数值中,最靠近左边的比特位被视为高位),该字段的长度是可变的,它用于在一个域中进一步划分区域。
- 系统 ID(System Identification):用于在一个区域内标识某台设备。在华为路由器上,系统 ID 的长度固定为 6byte,而且通常采用 16 进制格式呈现,例如
0122.a2f1.0031。在网络部署过程中,必须保证域内设备的系统 ID 的唯一性。考虑到在以太网环境中,设备的 MAC 地址具有全局唯一性,而且正好长度也是 6byte,因此使用设备的 MAC 地址作为其系统 ID 也是一个不错的方案。 - NSEL(NSAP-Selector):长度为 1byte,用于标识上层协议类型或服务类型
在 IS-IS 中,基于路由的目的,NSAP 的 IDP 及 DSP 高位部分加在一起被称为区域地址,该地址是可变长的,最短为 1byte。对于 IS-IS 而言,区域地址就是区域 ID(Area Identification,区域标识符)
除了 NSAP 外,在 OSI 协议栈中,还有另外一种非常重要的地址 NET(Network Entity Title,网络实体名称),NET 用于在网络层标识一台设备,可以简单地看作 NSEL 为 0x00 的 NSAP。由于 NSEL 为 0x00,因此 NET 不标识任何上层协议(或服务)类型,只用于标识该设备本身。
即使在纯 TCP/IP 环境中部署 IS-IS,我们也必须为每一台准备运行 IS-IS 的设备分配 NET,否则 IS-IS 将无法正常工作。一旦网络管理员为一台设备指定了 NET,该设备便可以从 NET 中解析出区域 ID,以及设备的系统 ID。通常情况下,管理员只会为设备的一个 IS-IS 进程指定一个 NET;在一些特殊场景中,也可能会为一个 IS-IS 进程指定多个 NET,此时这些 NET 中的系统 ID 必须相同。在 IS-IS 中,系统 ID 相当于 OSPF 中的 Router-ID。
在 NET 中,区域 ID 的长度是可变的,因此 NET 的长度并不固定。
既然 NET 是可变长的,设备该如何从中识别出区域 ID 及系统 ID 呢?以 49.0001.4f3c.23ab.0001.00 这个 NET 为例,下图展示了它的结构。NET 的最后一个字节为 NSEL,它对应的值必须为 0x00,与 NSEL 相邻的 6 个字节为系统 ID,而其余的部分便是区域 ID,处于同一个区域的两台 IS-IS 设备,其 NET 中的区域 ID 必须相同,而系统 ID 则必须不同。
在华为路由器上,创建一个 IS-IS 进程并为该进程分配 NET 的配置如下
[Router]isis 1
[Router-isis-1]network-entity 49.ac21.32al.00e0.fc43.f212.00
在以上配置中,isis 命令用于创建 IS-IS 进程并进入该进程的配置视图,isis 命令中可指定该进程的 Process-ID,本例中所创建的 IS-IS 进程的 Process-ID 为 1。如果使用 isis 命令创建 IS-IS 进程时未指定 Process-ID,则系统会自动为该进程分配一个缺省值作为 Process-ID。
另外,在 IS-IS 进程的配置视图中,network-entity 命令用于为该进程分配 NET,在本例中我们为该进程分配的 NET 为 49.ac21.32a1.00e0.fc43.f212.00,其中设备的系统 ID 为 00e0.fc43.f212,该值实际上是取自该设备某个以太网接口的 MAC 地址;另外设备所属区域的区域 ID 为 49.ac21.32a1。从以上描述可以看出,在华为路由器上部署 IS-IS 并为设备分配 NET 时,基本上只需关注区域 ID 及系统 ID 这两个信息。
02. IS-IS 的基本概念
02.01. IS-IS 的层次化设计
IS-IS 能够部署在规模非常大的运营商骨干网络中,这得益于它对层次化网络的支持。我们能够根据需要将一个 IS-IS 域(Domain)切割成多个区域,然后使用骨干路由器将这些区域连接起来。简单地说,IS-IS 采用两级分层结构:骨干网络及常规区域

IS-IS 的区域 ID 与 OSPF 是不同。对于 IS-IS 来说,其骨干网络并不像 OSPF 那样是一个唯一的、具体的区域(Area0),而是由一系列连续的 Level-2 及 Level-1-2 路由器所构成的网络范围。连续的 Level-1(含 Level-1-2)路由器构成的区域称为 Level-1 区域,例如图中的 Area 49.0001 和 Area 49.0002;而 Area 49.0003 及 Area 49.0004 则为 Level-2 区域。
当在一台设备上配置 IS-IS 时,就需要指定该设备所属的区域(区域 ID 在为该设备所分配的 NET 中体现,一个设备可以同时属于多个区域),完成上述配置后,设备的所有接口都属于该区域。对于 IS-IS 而言,两个区域的交界处却并不在设备上,而是在链路上,例如图中 Area 49.0001 与 Area 49.0004 的交界处是在 R1 与 R4 之间的互联链路上。
IS-IS 的每个 Level-1 区域必须与骨干网络直接相连,以 Area 49.0001 为例,该区域通过 Level-1-2 路由器 R1 连接到了骨干网络。
IS-IS 的 Level-1 区域与 OSPF 中的 Totally NSSA 非常类似。Level-1-2 路由器作为 Level-1 区域与骨干网络之间的桥梁,将其通过 Level-1 区域内泛洪的 Level-1 LSP 计算得出的路由以 Level-2 LSP 的形式通告给骨干网络,使得骨干网络中的路由器能够计算出到达该区域内相应网段的路由。另一方面,缺省情况下 Level-1-2 路由器并不会将其从骨干网络学习到的路由(包括到达其他区域的路由)向本地 Level-1 区域进行通告,就像 OSPF 不会向某个 Totally NSSA 下发描述区域间路由的 Type-3 LSA 一样。因此一个区域内的 Level-1 路由器仅知晓到达本区域内各个网段的路由,而对于区域外的网络,它是一无所知的,它只能通过指向本区域的 Level-1-2 路由器的默认路由来到达区域外部。IS-IS 的这个设计使得 Level-1 路由器的 LSDB 及路由表规模极大程度地减小了,从而设备的性能得到了优化。

上图展示了一个典型的 IS-IS 网络。在该网络中,R1、R2 及 R3 属于 Level-1 区域 Area 49.0001,R2 与 R1、R3 与 R1 均建立 Level-1 的邻居关系。R1 能够根据本区域内所泛洪的 Level-1 LSP 计算出本区域内的网络拓扑,以及到达本区域内各网段的路由。
而缺省时,R2 及 R3 不会将到达 Area 49.0001 区域外部的路由信息注入到该区域中,R2 及 R3 都在其向 49.0001 区域下发的 Level-1 LSP 中设置 ATT 比特位,而该区域内的 Level-1 路由器则基于该 Level-1 LSP 产生一条指向 R2 及 R3 的默认路由。因此 R1 不会学习到去往 Area 49.0002 的路由,但是它可以通过指向 R2 及 R3 的默认路由来到达 Area 49.0002 内的各个网段。与此同时,R1、R2 及 R3 是允许将外部路由引入 IS-IS 的。因此从以上所描述的特性来看,IS-IS 的常规区域的确很像 OSPF 的 Totally NSSA。
在某些场景中,可能期望 Level-1 区域内的路由器获知到达其他区域的具体路由,IS-IS 考虑到了这种需求,它允许管理员通过特定的配置,向 Level-1 区域注入到达其他区域的路由,这个特性被称为路由渗透。
2.2 IS-IS 路由器的分类
不仅仅路由器能够支持 IS-IS,许多交换机、防火墙等产品也支持 IS-IS,路由器仅为代表。
运行了 IS-IS 的路由器,根据其全局 Level(级别)属性的不同,可以分为两种类型,分别是 Level-1 及 Level-2。一台 IS-IS 的路由器可以是 Level-1 类型,或者是 Level-2 类型,还可以同时是 Level-1 和 Level-2 类型,对于同时为 Level-1 和 Level-2 类型的 IS-IS 路由器,我们将其称为 Level-1-2 路由器,实际上这并不是一种单独的 IS-IS 路由器类型。
Level-1 路由器
Level-1 路由器是一种 IS-IS 区域内部路由器,它只能够与同属一个区域的其他 Level-1 路由器,或者同属一个区域的 Level-1-2 路由器建立 IS-IS 邻居关系,我们将这种邻居关系称为 Level-1 邻居关系。
Level-1 路由器无法与 Level-2 路由器建立邻居关系。
Level-1 路由器只维护 Level-1 的 LSDB,它能够根据 LSDB 中所包含的链路状态信息计算出区域内的网络拓扑及到达区域内各网段的最优路由。注意,Level-1 路由器必须通过 Level-1-2 路由器接入 IS-IS 骨干网络从而访问其他区域。
Level-2 路由器
Level-2 路由器可以简单地视为 IS-IS 骨干网络路由器,实际上 IS-IS 的骨干网络是由一系列连续的 Level-2 路由器(及 Level-1-2 路由器)组成的。Level-2 路由器只能与 Level-1-2 或 Level-2 路由器建立 IS-IS 邻居关系,我们将这种邻居关系称为 Level-2 邻居关系。
Level-2 路由器只维护 Level-2 的 LSDB。在一个典型的 IS-IS 网络中,Level-2 路由器通常拥有整个 IS-IS 域(包括该域内所有的 Level-1 区域及 Level-2 区域)的所有路由信息
Level-1-2 路由器
所谓的 Level-1-2 路由器是同时为 Level-1 及 Level-2 级别的路由器,它能够与同属一个区域的 Level-1、Level-1-2 路由器建立 Level-1 邻居关系,也可与 Level-2 路由器或 Level-1-2 路由器建立 Level-2 的邻居关系。
Level-1-2 路由器与 OSPF 中的 ABR 非常相似,它也是 IS-IS 骨干网络的一个组成部分。Level-1-2 路由器可以同时维护 Level-1 的 LSDB 及 Level-2 的 LSDB,这两个 LSDB 分别用于 Level-1 路由及 Level-2 路由计算。
在一个典型的 IS-IS 网络中,Level-1-2 路由器通常连接着一个 Level-1 区域,也连接着骨干网络,它将作为该 Level-1 区域与其他区域实现通信的桥梁,它将在其向该 Level-1 区域下发的 Level-1 LSP 中设置 ATT 比特位,来告知区域内的 Level-1 路由器可以通过自己到达区域外部,而区域内的 Level-1 路由器则根据该 ATT 比特置位的 LSP 产生一条指向该 Level-1-2 路由器的默认路由。
在华为的路由器上配置 IS-IS 时,缺省时,路由器的全局 Level 为 Level-1-2,当然,可以通过命令修改该设备的类型。
2.3 度量值
IS-IS 使用 Cost(开销)作为路由度量值,所谓开销,亦可理解为成本或者代价,Cost 值越小,则路径(路由)越优。IS-IS 路由的 Cost 与设备的接口有关,与 OSPF 类似,每一个激活了 IS-IS 的接口都会维护接口 Cost。然而与 OSPF 不同的是,IS-IS 接口的 Cost 在缺省情况下并不与接口的带宽相关,无论该接口的带宽如何,缺省时其 Cost 值均为 10,当然也可以根据实际需要修改接口的 Cost 值。
这种接口 Cost 的设计显然在某些场景下会存在一些问题,例如可能会导致设备选择 Cost 更优的低带宽路径,而不是选择 Cost 更劣的高带宽路径。一条 IS-IS 路由的 Cost 等于本路由器到目标网段沿途的所有出接口的 Cost 总和。

在图示的网络中,如果全网运行了 IS-IS,则 R1 将通过 IS-IS 获知到达 3.3.3.0/24 的路由,而在 R1 的路由表中,3.3.3.0/24 路由的 Cost 值为 30,也就是 R3 的 GE0/0/0 接口 Cost 加上 R1 及 R2 的 GE0/0/0 接口 Cost。
缺省时,华为路由器使用的 IS-IS Cost 类型为 Narrow(窄),当使用该类 Cost 时,IS-IS 接口 Cost 的长度为 6bit,这意味着一个接口所支持的 Cost 值范围是 1~63。
另外,IS-IS 路由 Cost 的长度为 10bit,这意味着接收到的路由最大的 Cost 值为 1023。显然,在面对大规模的网络时,这种 Cost 的限制会成为 IS-IS 的瓶颈。正因如此,IS-IS 引入了 Wide(宽)类型的 Cost,当 IS-IS 使用 Wide 类型的 Cost 时,接口 Cost 变成了 24bit,这使得设备的接口支持更大的 Cost 值范围,与此同时一条路由的 Cost 值范围也有了相当大的扩展。IS-IS 在 Cost 值上的扩展,使得它突破了前面所提到的瓶颈,从而能够支持更大规模的网络,而且在组网时,基于 Cost 的路由控制也变得更加灵活。
使用如下命令,可以将 IS-IS 的 Cost 类型修改为 Wide
[Quidway]isis 1
[Quidway-isis-1]cost-style wide
缺省时,华为路由器使用的 IS-IS Cost 类型为 Narrow,这意味着路由器只能接收和发送 Cost 类型为 Narrow 的路由,使用 cost-style wide 命令将设备的 Cost 类型修改为 Wide 后,该设备只能接收和发送 Cost 类型为 Wide 的路由。在现实网络中,需确保 IS-IS 域内所有的路由器配置一致的 IS-IS Cost 类型。
正如上文所说,在华为的路由器上部署 IS-IS 时,缺省状态下 IS-IS Cost 类型为 Narrow,并且接口的缺省 Cost 值为 10,无论接口的带宽是多少,其 Cost 值缺省均为 10,这在某些场景下可能会导致 IS-IS 的路由优选不尽如人意。其中一个简单的改进方法是,根据组网的实际需求去手工修改设备的接口 Cost。另一个可选的方法则是使用 IS-IS 自动计算接口 Cost 的功能。这个功能被激活后,设备将自动根据接口的带宽值进行该接口 Cost 值的计算,这与 OSPF 的接口度量值计算就非常相似了,设备将使用一个参考带宽值(缺省 100Mbps,可以在 IS-IS 配置视图下使用 bandwidth-reference 命令修改)除以接口的带宽值,再将所得结果乘以 10,得到接口的 Cost 值。
例如千兆以太网接口缺省的带宽值为 1000Mbps,100/1000×10 得到的结果是 1,因此千兆以太网接口在激活 IS-IS 自动计算 Cost 值的功能后,Cost 值为 1。值得一提的是,只有当设备的 IS-IS Cost 类型指定为 Wide 或 Wide-compatible(宽度量兼容模式)时,上述计算才会发生,如果设备的 IS-IS Cost 类型为 Narrow、Narrow-compatible 或 Compatible,则激活了自动接口 Cost 计算功能后,设备将采用如下表所示的对应关系为接口设置缺省 Cost 值。在设备的 IS-IS 视图下,执行 auto-cost enable 命令,可激活自动计算接口 Cost 的功能。缺省时该功能未被激活。

如需手工指定设备的接口 Cost 值,可在接口视图下使用 isis cost 命令,例如使用 isis cost 20,可将接口的 Cost 值从缺省值修改为 20。需注意的是该命令中有两个可选关键字,它们分别是 level-1 及 level-2,如果在 isis cost 命令中使用了 level-1 关键字,那么该命令配置的是接口的 Level-1 Cost 值,例如 isis cost 20 level-1。同理,如果在 isis cost 命令中使用了 level-2 关键字,那么该命令配置的是接口的 Level-2 Cost 值。而如果没有使用 level-1 或 level-2 关键字,那么该命令配置的是接口的 Level-1 及 Level-2 Cost 值。
2.4 IS-IS 的三张表

邻居表
两台相邻的 IS-IS 设备首先必须建立邻居关系,然后才能够开始交互 LSP。IS-IS 设备将直连链路上发现的邻居加载到自己的邻居表中。在华为的路由器上,使用 display isis peer 命令可查看设备的 IS-IS 邻居表,在邻居表中,能看到邻居的系统 ID、状态、保活时间及类型等信息。
以下图为例,如果在 R2 上执行该条命令,可以看到如下输出。

LSDB
两台直连的 IS-IS 设备只有建立了邻居关系,才能够开始交互 LSP。
IS-IS 设备将自己产生的、以及网络中所泛洪的 LSP 收集后存储在自己的 LSDB(Link-State Database,链路状态数据库)中。与 OSPF 类似,IS-IS 也使用 LSDB 存储链路状态信息,这些信息将被用于网络拓扑绘制及路由计算。在华为路由器上,使用 display isis lsdb 命令可查看设备的 IS-IS LSDB。
以 R1 为例:

因为 R1 是一台 Level-1 路由器,所以它只维护 Level-1 LSDB,从以上输出可以看出,在 R1 的 Level-1 LSDB 中存在三个 LSP。每个 LSP 都采用 LSP ID(Link-State Packet ID,链路状态报文标识)进行标识,LSP ID 由三部分组成:
- 6byte 的系统 ID:产生该 LSP 的 IS-IS 路由器的系统 ID。
- 1byte 的伪节点 ID:该字段的值存在 0 及非 0 两种情况。对于普通的 LSP,该字段的值总是 0;对于伪节点 LSP,DIS(Designated Intermediate System,指定中间系统)负责为该字段分配一个非 0 的值。
- 1byte 的分片号:如果一个 LSP 过大,导致始发设备需要对其进行分片,那么该设备通过为每个 LSP 分片设置不同的分片号来对它们进行标识及区分。同一个 LSP 的不同分片必须拥有相同的系统 ID 及伪节点 ID
在 R1 的 LSDB 中,有两个 LSP 在 LSP ID 后面设置了星号“*”,这个星号表示该 LSP 是本设备产生的,这两个 LSP 分别是 0000.0000.0001.00-00 及 0000.0000.0001.01-00,其中前者是 R1 产生的普通 LSP,而后者则是由该 LAN 中的 DIS 产生的伪节点 LSP。
在伪节点 LSP 的 LSP ID 中,伪节点 ID 是一个非 0 的值,而对于普通 LSP(非伪节点 LSP),其 LSP ID 中的伪节点 ID 则必须为 0。由于 R1 被选举为 DIS,因此它负责产生伪节点 LSP。LSDB 中 Seq Num 一列显示的是 LSP 的序列号,在 IS-IS 中,LSP 序列号的概念与 OSPF 中 LSA 序列号的概念非常类似,都可以用来表示一个 LSP 的新旧。
注意,在 R1 的 LSDB 中,并没有 R3 所产生的 LSP,这是因为 R2 作为该 Level-1 区域的 Level-1-2 路由器,发挥着类似区域边界路由器的作用,它不会将其他区域的 LSP 泛洪到本地 Level-1 区域中。
由于 R2 是一台 Level-1-2 路由器,因此它会同时维护 Level-1 LSDB 及 Level-2 LSDB:

IS-IS 路由表
每台 IS-IS 设备都会基于自己的 LSDB 运行相应的算法,最终计算出最优路由,并存放于 IS-IS 路由表中,IS-IS 路由表中的路由未必最终一定被加载到设备的全局路由表中,这还取决于路由优先级等因素。
在 R1 上执行 display isis route 命令可看到如下输出:

由于 R1 是一台 Level-1 路由器,因此我们只能在其 IS-IS 路由表中观察到 Level-1 路由。
R2 的 IS-IS 路由表如下:

除了通告到 IS-IS 的本地直连路由,R2 还通过 IS-IS 学习到了 Level-1 路由 1.1.1.0/24,以及 Level-2 路由 3.3.3.0/24。R2 是一台 Level-1-2 路由器,因此它分别使用 Level-1 及 Level-2 路由表存储不同类型的 IS-IS 路由。从以上的描述可以看出,IS-IS 将路由分为 Level-1 路由及 Level-2 路由。其中 Level-1 路由是设备根据 Level-1 LSDB 计算出的路由,而 Level-2 路由则是根据 Level-2 LSDB 计算出的路由。当一台 IS-IS 设备发现了一条到达某个目的网段的 Level-1 路由,又发现了到达相同目的网段的 Level-2 路由时,Level-1 路由将会被优选,即使其 Cost 劣于 Level-2 路由。
再看 R2 的全局路由表,也能直观地看到 IS-IS 路由的类型。

2.5 协议报文
在以太网环境中,IS-IS 报文载荷直接封装在以太网数据帧中,相比于 OSPF 少了 IP 层的封装,从这个层面上看, IS-IS 报文的封装效率更高。
IS-IS 使用了以下几种 PDU(Protocol Data Unit,协议数据单元)。
IIH
IIH(IS-IS Hello)PDU 用于建立及维护 IS-IS 的邻居关系。
在 IS-IS 中存在三种 IIH PDU:Level-1 LAN IIH、Level-2 LAN IIH、P2P IIH
-
其中 Level-1 LAN IIH 及 Level-2 LAN IIH 用于 Broadcast 类型的网络中:
- 如果网络设备为 Level-1 设备,则它在 Broadcast 类型的接口上发送及侦听 Level-1 LAN IIH;
- 如果网络设备为 Level-2 设备,则它在 Broadcast 类型的接口上发送及侦听 Level-2 LAN IIH;
- 如果网络设备为 Level-1-2 设备,则在缺省时,它在 Broadcast 类型的接口上发送及侦听这两种类型的 LAN IIH。
-
P2P IIH 用于 P2P 类型的网络中。
LSP
IS-IS 使用 LSP(Link-State Packet)承载链路状态信息。
LSP 类似 OSPF 中的 LSA,只不过后者并非以独立报文的形式存在,必须使用 LSU 报文来承载,而 LSP 是一种独立的 PDU。
LSP 存在 Level-1 LSP 及 Level-2 LSP 之分,具体发送哪一种 LSP 视 IS-IS 邻居关系的类型而定。例如 A 与 B 建立了 Level-1 邻居关系,那么双方将交互 Level-1 LSP,而如果 A 与 B 同为 Level-1-2 路由器,并且建立了 Level-1 及 Level-2 两种邻居关系,则 Level-1 LSP 及 Level-2 LSP 均会在两者之间交互。
CSNP
CSNP(Complete Sequence Number PDU,完全序列号报文)存在 Level-1 CSNP 与 Level-2 CSNP 之分,不同的 IS-IS 邻居关系交互不同类型的 CSNP。
一个 IS-IS 设备发送的 CSNP 包含该设备 LSDB 中所有的 LSP 摘要。CSNP 主要用于确保 LSDB 的同步,在这个层面上看,CSNP 与 OSPF 的 DBD 报文的功能相似。
CSNP 中包含始发设备的 LSDB 中所有 LSP 的摘要信息,一条 LSP 的摘要信息包括该 LSP 的 LSP ID、序列号、剩余生存时间以及校验和,这四个信息是 LSP 头部当中的关键元素。CSNP 使用 LSP 条目 TLV 来承载这些 LSP 摘要信息。
PSNP
PSNP(Partial Sequence Number PDU,部分序列号报文)存在 Level-1 PSNP 与 Level-2 PSNP 之分,与 CSNP 不同,PSNP 中只包含部分 LSP 的摘要信息(而不是全部)。PSNP 主要用于请求 LSP 更新。另外,PSNP 还用于在 P2P 网络中对收到的 LSP 进行确认,因此从这个层面看,PSNP 实现了 OSPF 中的 LSR 及 LSAck 报文的功能。
协议报文结构说明
关于 IS-IS PDU 报文结构的详细介绍超出了 HCIP 的范围。简单地说,IS-IS PDU 的报文结构主要包含 3 个部分:通用的头部、PDU 特有的头部以及可变长部分。其中通用的头部指的是所有 IS-IS PDU 都拥有的、相同格式的头部。除了这个头部之外,每种 PDU 还有自己特有的头部。另外,PDU 中的可变长部分包含该 PDU 中非常关键的内容,IS-IS 采用三元组的格式存储这些内容。实际上,IS-IS 之所以拥有如此高的可扩展性正是得益于这部分功能模块的设计。
设想一下,如果希望在一个报文中携带一些关键信息,而且这些关键信息的内容及内容长度都各不相同的,此外,随着业务的发展,信息的类型也在不断变化,那么能否设计一种具有高可扩展性的方法,使得报文主体不做改变的情况下依然能够适应新的业务需求,依然能够承载新的关键信息?
TLV(Type-Length-Value,类型—长度—值)的设计完美地解决了这个问题。所谓 TLV,顾名思义,就是类型、长度以及值的三元组,例如(颜色,两个字,黑色)便是一个典型的 TLV 的实例。
在 IS-IS 中,TLV 中的每个元素的描述如下。
- 类型(Type):该字段的长度为 1byte,它标识了这个 TLV 的类型,IS-IS 定义了丰富的 TLV 类型,不同的 TLV 类型用于携带不同的信息。
- 长度(Length):该字段的长度为 1byte,它存储的数据用于指示后面的第三元(值)的长度。由于不同的 TLV 类型所描述的信息不同,因此信息的长短可能也有所不同,本字段指示了该 TLV 中值的长度。
- 值(Value):该字段的长度是可变的,所占用的字节数在长度字段中描述。本字段的值就是该 TLV 所携带的有效内容

从图中能看到 PDU 通用头部、PDU 特有的头部,以及后面所携带的多个 TLV。实际上,IS-IS 的每种 PDU 都会携带一定数量的 TLV。TLV 的设计使得 IS-IS 的灵活性和可扩展性变得非常高。随着业务的发展,网络势必会对 IS-IS 不断提出新的需求,而 IS-IS 则可以在不对协议做大的改动的前提下,仅通过引入新的 TLV 来实现对新需求的支持,这就是 TLV 的魅力所在。
IS-IS 定义了丰富的 TLV,表中列举了几个常见的 TLV

2.6 LSP
OSPF 使用了多种类型的 LSA 来对网络的拓扑及网段信息进行描述,然而 IS-IS 只使用两种 LSP:Level-1 及 Level-2 LSP。在图中能看到 IS-IS PDU 通用的头部,在该头部后面便是 LSP 报文载荷。LSP 报文载荷包含两部分,第一部分是 LSP 特有的头部,另一部分则是 TLV。


浙公网安备 33010602011771号