IS-IS 协议的用户虽然为数不多但毕竟还是存在,在一些网络(主要是一些 ISP 和运营商网络)运行 IS-IS 协议进行 IP 路由选择。IS-IS 的意思是中间系统到中间系统,并且是为 ISO 无连接网络协议(ISO’s Connectionless Network Protocol,CLNP)设计的路由选择协议。IS-IS 协议是由 ISO10589 定义和解释的。
ISO 发展 IS-IS 协议的时间和 IAB(Internet Architecture Board,Internet 体系结构委员会)发展 OSPF 的时间基本是同一时期,并且提议采用 IS-IS 协议替代 OSPF 协议作为 TCP/IP 的路由选择协议。当初认为 TCP/IP 只是一个过渡的协议族,并且最终会被 OSI 协议族替代。为了支持从 TCP/IP 向 OSI 协议的可预见转换,又提出了一个扩展的 IS-IS 协议,称为 集成 IS-IS 协议
。提出 集成 IS-IS 协议
的目的是为了把它作为一个具有双重功能的 IS-IS 协议,即利用单个路由选择协议同时为 CLNS 协议
和 IP 协议
提供路由选择能力。这个协议可以设计用来在单纯的 CLNS 环境,一个单纯的 IP 环境,或者一个 CLNS/IP 的混合环境中运行。
OSPF 工程组实际上学习和利用了很多 IS-IS 设计中的基本机制。从表面看来,OSPF 协议和 IS-IS 协议有很多共同的特性:
- 它们都维护一个链路状态数据库,并且基于 Dijkstra 的 SPF 算法都使用该链路状态数据库来计算最短路径树
- 它们都利用 Hello 数据包来形成和维护邻接关系
- 它们都使用区域的概念来构成一个两级层次化结构
- 它们都具有在区域之间提供地址汇总的能力
- 它们都是无类别路由选择协议
- 它们都通过选取一个指定路由器来描述广播网络
- 它们都具有认证能力
接下来只把集成 IS-IS 协议(简称 IS-IS)作为一个 IP 路由选择协议来讲述,只有在使用 IS-IS 协议为 IP 协议路由以及与 CLNS 协议有关的地方时才讲述 CLNS 协议。IS-IS 协议几乎是专门用在服务提供商网络的,这样的网络往往对可靠性与可扩展性具有很高的要求。
集成 IS-IS 协议的基本原理与实现
ISO 经常使用不同的术语来描述 IETF 所描述的相同概念的实体,有一些术语是非常基本的,因此在讲述 IS-IS 协议之前先介绍一下这些术语。
一台路由器就是一个中间系统(Intermediate System,IS),而一台主机就是一台端系统(End System,ES)。因此提供主机与路由器之间通信的协议称为 ES-IS,而被路由器用来进行相互宣告的协议(路由选择协议)称为 IS-IS 协议。CLNP 协议使用 ES-IS 协议来形成端系统和中间系统之间的邻接关系,对于 IP 协议来说,ES-IS 协议和 IS-IS 协议没有什么相关之处。
与一个子网相连的接口称为 子网连接点
(Subnetwork Point of Attachment,SNPA)。SNPA 有一些概念化,因为它实际上定义了一个提供子网服务的点,而不是一个实际的物理接口。SNPA 的基本概念特性和子网本身的基本概念特性是相符合的,它可以由数据链路交换机相连的多个数据链路组成。
从一个节点的 OSI 层到另一个节点对等的 OSI 层的数据单元称为协议数据单元(Protocol Data Unit,PDU)。因此,一个帧就是一个数据链路 PDU(DLPDU),而一个数据包(或者分组)就是一个网络层协议单元(NPDU)。执行与 OSPF 协议中的 LSA 等价功能的数据单元称为 链路状态 PDU(LSP)
。与 LSA 不同的是,LSA 是封装在 OSPF 头部之后的,并且都被封装在一个 IP 数据包内,而一个 LSP 本身就是一个数据包。
IS-IS 区域
虽然 IS-IS 协议和 OSPF 协议都使用区域的概念来创建两级的层次化网络结构,但是他们存在一个基本的不同之处,就是这两种协议在定义区域的方法上不一样。
OSPF 协议的区域边界是通过路由器来划分的,某些接口属于一个区域,而另一些接口属于其他区域。如果一台 OSPF 路由器具有的接口分布在多于一个的区域里,那么这台路由器就是一台区域边界路由器,即 ABR 路由器。而在 IS-IS 协议中,所有的路由器都完全处于一个区域内部,而区域的边界是在链路上,而不是在路由器上。IS-IS 的 骨干区域 是在第 2 层区域,而非骨干区域是在第 1 层区域。如下所示:
![](/fuchencong.github.io/2019/05/18/routing-tcp-ip-10/images/01.jpg)
一个中间系统可以是一台第 1 层路由器(L1)、一台第 2 层路由器(L2)或者两种类型皆是的路由器(L1/L2)。L1 路由器类似于 OSPF 协议中的非骨干内部路由器,而 L2 路由器类似于 OSPF 协议中的骨干路由器,同样地,L1/L2 路由器类似于 OSPF 协议中的 ABR 路由器。L1/L2 路由器和 L1 路由器以及 L2 路由器相连,这些 L1/L2 路由器必须同时维护一个 L1 的链路状态数据库和一个 L2 的链路状态数据库,这种方式和 OSPF 协议中 ABR 路由器必须维护与之相连的每一个区域的各自数据库相类似。在 Cisco 路由器上,可以使用命令 is-type 来配置 L1-only、L2-only 或 L1/L2 类型,缺省情况下配置为 L1/L2。
需要注意,IS-IS 区域不像 OSPF 区域那样显得清楚明了,与其把 IS-IS 区域当作拓扑上的区域,还不如将它们理解成一组邻接关系更好一些。一个邻接可以是 L1 邻接也可以是 L2 邻接。一个特定的 L1 区域实际上是具有相同 AID 的路由器一组相邻的 L1 邻接。L2 区域总是定义为一组 L2 邻接。一台 L1/L2 路由器是位于 L1 区域内的路由器,它可以同时具有一条或多条 L1 邻接和一条或多条 L2 邻接。一台 L2 路由器仅仅具有 L2 邻接关系。
与 OSPF 协议相同,区域间的通信量都必须经过 L2 区域,以便防止区域间路由选择环路。在一个区域内的每台 L1 路由器(包括区域内的 L1/L2 路由器)都会维护一个同样的链路状态数据库。但与 OSPF 协议中的 ABR 路由器不同,缺省情况下,L1/L2 路由器不需要通告 L2 类型的路由给 L1 类型的路由器。因此,一台 L1 路由器无法知晓它自己所在区域之外的目的路由。在这个意义上,一个 L1 区域就相当于 OSPF 协议中的完全末梢区域,为了路由转发数据包到其他区域,L1 路由器必须转发数据包到一台 L1/L2 路由器上。当 L1/L2 路由器发送它的第一层 LSP 进入一个区域时,它将通过在 LSP 中设置一个称为 区域关联位(Attached,ATT) 的二进制位来通知其他 L1 路由器它可以到达其他区域。
ISO 10589 描述了 IS-IS 协议路由器可以利用虚链路来修复被分段的区域,这和 OSPF 是一样的。但是这个特性在 Cisco 路由器和其他大多数厂商的路由器上都不支持,因为通常没有这个需求。OSPF 协议可以设置丰富的区域工具和特性,这是企业网络选用的协议。另一方面,多区域的 IS-IS 协议更为复杂,因而很少在企业网中出现。ISP 运行的是基于 BGP 协议的大型网络,而他们的 IGP 协议主要用来寻找 BGP 会话的节点,因此他们希望他们的 IGP 协议尽可能的简单,他们通常会把整个路由选择域作为单个 IGP 区域。IS-IS 协议在很多方面比 OSPF 协议更简单,这对于单个大型区域这种类型的应用来说更具可扩展性。因此在一个服务提供商的网络中,IS-IS 协议通常使用单一的 L2 区域。
由于一台 IS-IS 路由器可以完全地处于一个单一的区域内,因此区域 ID(或区域地址)将和整个路由器相关联,而不是和某一个接口相关联。IS-IS 协议的一个独特特性是,在缺省情况下一台路由器最多可以拥有 3 个区域地址,这在区域过渡期间是很有用的。每台 IS-IS 路由器必须拥有一种在它所在的路由选择域内唯一地标识它本身的方法。这个唯一的标识就是系统 ID 的功能,系统 ID(System ID)类似于 OSPF 协议中的路由器 ID,在一台 IS-IS 路由器上可以通过一个单一的地址同时定义区域 ID 和系统 ID,这个地址就是网络实体标题(Network Entity Title,NET)。
网络实体标题
即使 IS-IS 协议只用来为 TCP/IP 协议进行路由选择,它也依然是一个 ISO CLNP 协议。因此,IS-IS 协议对等体之间的通信数据包是 CLNS PDU。即使是在一个纯 IP 环境中,一台 IS-IS 路由器也必须有一个 ISO 地址。这个 ISO 地址是一个网络地址,称为网络实体标题(NET),并在 ISO 8348 中进行描述。
一个 NET 地址的长度范围为 8-20 字节,并可以描述为区域 ID 和一台设备的系统 ID 两部分。一个 ISO NET 地址可能具有多种格式。系统 ID 的长度可以是 1-8 个字节,但是在一个路由选择域内的所有节点的系统 ID 必须使用相同的长度,实际上这个系统 ID 的长度是 6 个字节,并且经常是这台设备上某个接口的 MAC 地址。对于路由选择域内的每一个节点,这个系统 ID 必须是唯一的。
在只有纯 IP 协议的环境中,NET 地址的设定可以基于某个标准,例如 GOSIP。如果你可以在一个纯 IP 环境中自由地选择任何 NET 地址的格式,那么将可以根据实际网络的需要选择最简单的格式。无论是何种格式的地址,都需要满足下面 3 个规则:
- NET 地址必须以一个字节的域开始
- NET 地址必须以一个字节的域结束,并且应该设置为 0x00。如果 SEL 是非零的,IS-IS 也会起作用,但是在一个 CLNP/IP 混合的路由器可能会出现一些问题
- 在 Cisco 路由器上,NET 地址的系统 ID 必须是 6 个字节
IS-IS 的功能结构
像 ISO 模型一样,之所以有一个分层的网络体系结构。其中一个最主要的目的是为了使每一层的功能都独立于它下面的一层。网络层必须适应大多数类型的数据链路或子网络,为了进一步满足这种适应性,网络层又由两个子层组成:子网独立子层为传输层提供了一致和统一的网络服务,而子网依赖子层则为子网独立子层的需求而去存取数据链路层提供的服务。子网依赖子层取决于数据链路的具体类型,而子网独立子层能够独立于数据链路。ISO 10589 中对这些子层的功能架构中有关 IS-IS 的操作做了大量描述。
依赖于子网的功能
依赖于子网的功能是指子网的功能依赖于它的下层,这是指为子网独立子层的功能层面隐藏掉不同种类数据链路(子网)的特征。下面的依赖于子网的功能对于路由选择是非常重要的:
- PDU 数据包的传送和接收是在一个具体相连的子网
- 通过 IS-IS 的 Hello PDU 数据包来发现邻居路由器并建立这个子网上的邻接关系
- 邻接关系的维护
- 链路的复用,或者说对于 OSI 进程转换为 OSI PDU 数据包,而对于 IP 进程转换为 IP 数据包
相比于 OSPF 协议中定义的 4 种网络类型,IS-IS 协议只定义了两种类型:广播型子网和点到点或一般拓扑子网。广播型子网的定义是和 OSPF 协议中的定义一样,即支持多路广播的多路访问数据链路,而点到点子网(非广播子网)则可能是永久链路,例如 T1 链路;或者动态链接链路,例如 X.25 的 SVC 链路。
IS-IS 路由器是通过交换 IS-IS Hello PDU 数据包信息来发现邻居并形成邻接关系。Hello 数据包每隔 10s 传送一次,在 Cisco 路由器中,这个时间间隔可以基于每个接口通过命令 isis hello interval 来改变。一台 IS-IS 路由器使用它的 Hello PDU 数据包可以标识它本身和它的性能,以及描述发送该 Hello 数据包的接口的一些参数。如果两台邻居路由器关于它们各自的性能和接口的参数协商一致,那么它们就形成了邻接关系。IS-IS 在形成邻接关系方面没有 OSPF 那么严格,在大多数实例中,一个邻居通告的特性如果其他邻居不支持的话不会阻止它们形成邻接关系,其中的特性可以被忽略。邻居之间甚至可以通告不同的 Hello 时间间隔。
对于第 1 层类型与第 2 层类型的邻居路由器,IS-IS 协议可以形成各自不同的邻接关系。L1-only 路由器可以和 L1 以及 L1/L2 邻居形成 L1 邻接关系,而 L2-only 路由器可以和 L2 以及 L1/L2 邻居形成 L2 邻接关系。L1/L2 路由器和它的邻居既可能形成 L1 邻接关系也可能形成 L2 邻接关系。但是一台 L1-only 和一台 L2-only 路由器不能形成一个邻接关系。缺省情况下,Cisco 路由器是 L1/L2 路由器。
当路由器的类型(L1-only、L2-only 或 L1/L2)影响所形成的邻接类型时,在两台邻居路由器上配置的区域 ID 也会对其产生影响。这可以应用以下规则:
- 两台 L1-only 路由器只有在它们的 AID 匹配时才能形成一个 L1 邻接关系
- 两台 L2-only 路由器即使它们的 AID 不同也能够形成一个 L2 邻接关系
- 一台 L1-only 路由器和一台 L1/L2 路由器只有在它们的 AID 匹配时才能形成一个 L1 邻接关系
- 一台 L2-only 路由器和一台 L1/L2 路由器即使在它们的 AID 不同时也能形成一个 L2 邻接关系
- 如果两台 L1/L2 路由器的 AID 匹配,它们就可以同时形成 L1 和 L2 类型的邻接关系
- 如果两台 L1/L2 路由器的 AID 不匹配,它们就只能形成 L2 类型的邻接关系
- 一旦邻接关系建立成功,Hello 数据包将担当保活(keepalive)的功能。每一台路由器都在它的 Hello 数据包中发送一个抑制时间(hold time),用来通告它的邻居路由器在宣告这台路由器无效之前,应该等待多长的时间去侦听下一个 Hello 数据包。与 OSPF 不同的是,两个 IS-IS 邻居之间的 Hello 时间间隔与保持时间是不需要匹配的。每一台路由器都会认同它的邻居通告的保持时间。
OSPF 和 IS-IS 邻接的另一个不同之处是:在 OSPF 协议中,两台路由器一旦建立了双向通信就认为形成了邻接关系,但直到数据库同步完成才认为形成了完全邻接关系。而 IS-IS 协议在路由器之间能够交换 Hello 数据包时就认为形成了邻接关系。
IS-IS 的邻居表可以通过命令 show clns is-neighbors
来查看。其中电路 ID(Circuit ID)是一个字节的数字,路由器用它来唯一地标识 IS-IS 接口。如果该接口是和一个广播型多路访问网络相连的,那么这个电路 ID 是和该网络上的指定路由器的系统 ID 相连的,并把这个完全的数字称为 LAN ID,或者也称为伪节点 ID。
IS-IS 协议在一个广播型多路访问网络上选取指定路由器的原因与 OSPF 协议相同,把网络本身看做是一台路由器或一个伪节点,要比局域网内的每一台路由器都要与该网络上相连的其余每台路由器形成一个邻接关系的方法好得多。包括指定路由器在内的每一台路由器都只需要通告单条链路到伪节点。指定路由器作为伪节点的代表也会通告一条链路到与之相连的所有路由器。
但是与 OSPF 协议不同的是,与广播型多路访问网络相连的 IS-IS 路由器。一旦可以交换 Hello 数据包就建立了 IS-IS 邻接关系。每一台路由器将以组播方式发送它的 LSP 数据包给所有的邻居路由器,并且指定路由器使用一个称为序列号 PDU 的数据包来确保 LSP 的泛洪是可靠的。
IS-IS 协议的指定路由器选取过程非常简单,每一台 IS-IS 路由器接口都被指定一个 L1 类型的优先级和 L2 类型的优先级,它们的范围是 0-127。Cisco 路由器接口的优先级对于 L1 和 L2 类型的缺省值都是 64,并且可以通过命令 isis priority 来改变这个值。
路由器通过其每一个接口发送 Hello 数据包,并在 Hello 数据包中通告它的优先级。在 L1 类型的 Hello 数据包中通告 L1 类型的优先级,在 L2 类型的 Hello 数据包中通告 L2 类型的优先级。拥有最高优先级的路由器将成为指定路由器,如果路由器的优先级相同,那么拥有在数值上具有最高 MAC 地址的路由器将成为指定路由器。优先级为 0 的 IS-IS 路由器仅仅表示优先级最低,仍然可能成为 DR 路由器。
与 L1 和 L2 类型的优先级相对应的是,需要在一个网络上为 L1 和 L2 分别选取单独的指定路由器。这种做法是必须的,因为在一个单一的局域网中存在着各自不同的 L1 和 L2 类型的邻接关系。由于每一台接口对于每一层都具有单独不同的优先级,因此在同一个局域网上的 L1 类型的 DR 路由器和 L2 类型的 DR 路由器有可能是同一台路由器。
指定路由器分配了所在网络的 LAN ID。LAN ID 是由该网络上的指定路由器的系统 ID 和它的伪节点 ID(电路 ID) 连在一起得到。该网络上其他所有的路由器都将使用指定路由器分配这个 LAN ID。附加在系统 ID 后面的电路 ID 是必需的,因为同一台路由器可以是多个网络的指定路由器,但每个网络的 LAN ID 必须保持唯一性。
和 OSPF 不同的是,IS-IS 协议不选取备份指定路由器,如果 IS-IS 的指定路由器失效了,那么将选取一个新的指定路由器。另外,如果一台新的 IS-IS 路由器具有比现有指定路由路由器更高的优先级,或者优先级相同但是具有更高的 MAC 地址,那么这台新的 IS-IS 路由器将成为新的路由器。
独立于子网的功能
子网独立层的功能定义了 CLNS 怎样分发数据包通过整个 CLNP 网络,以及怎样把这些服务提供给传输层。路由选择功能本身又分为 4 个过程:更新过程、决策过程、转发过程和接收过程。转发过程的职责是传送 PDU 数据包,而接收过程的职责是接收 PDU 数据包,这里不详细介绍。
更新过程的职责是构建 L1 和 L2 的链路状态数据库,为了做到这一点,L1 的 LSP 将在整个区域内进行泛洪,而 L2 的 LSP 将会在所有 L2 的邻接上进行泛洪。
每一个 LSP 数据包都包含一个剩余生存时间、一个序列号和一个校验和。剩余生存时间是一个老化时间或使用期限。IS-IS 的 LSP 数据包中的剩余生存时间和 OSPF 协议中 LSA 数据包的老化时间参数不同的是:LSA 数据包的老化时间是从 0 到最大生存时间递增,而 LSP 数据包的剩余生存时间则是从最大生存时间开始,并递减到 0。和 OSPF 协议一样,当 LSP 驻留在链路状态数据库中时,IS-IS 会随着时间的推移老化每一个 LSP,并递减它的剩余生存时间。并且,始发路由器必须周期性地刷新它的 LSP 以防止剩余生存时间减小到 0。如果剩余生存时间减小到 0 ,那么这个过期的 LSP 将还会在路由器的链路状态数据库中保存 60s 的时间,这个时间称为 零老化生存时间。如果区域的链路稳定,那么增加刷新时间和剩余生存时间可以显著减少 LSP 刷新引起的泛洪扩散负载。
在原来的 IS-IS 过程中,如果一台路由器收到了一个带有错误校验和的 LSP,那么这台路由器可以通过将 LSP 的剩余生存时间设置为 0 并重新扩散出去来清除这条 LSP。清除的行为将会引起始发这条 LSP 的路由器发送一个新的关于这条 LSP 的实例。但是 IOS 10589 的第二版中将不再清除带有错误校验和的 LSP,因为在一个可能出现错误的子网中,允许接收路由器启动清除 LSP 的功能将会显著增加 LSP 的流量。
序列号是一个 32 位的无符号线性数字,但一台路由器开始始发一条 LSP 时,它将使用设置为 1 的序列号,并且这条 LSP 的每一个后续实例的序列号都会递增 1。如果序列号递增到最大值,那么 IS-IS 进程必须失效 21min(最大生存时间 + 零老化生存时间),以便允许这条旧的 LSP 从所有的链路状态数据库中清除。
在一个点到点的子网上,路由器将直接发送 L1 和 L2 LSP 给他们的邻居路由器,在一个广播型的子网上,LSP 将以组播的方式发送到它所有的邻居路由器。携带 L1 LSP 的帧会有一个 0180.c200.0014 的目的 MAC 标识,称为 AllL1ISs,携带 L2 LSP 的帧会有一个 0180.c200.0015 的目的 MAC 标识,称为 AllL2ISs。
IS-IS 使用序列号数据包(SNP)来了解 LSP 的接收情况和维护链路状态数据库的同步情况。在这里有两种类型的 SNP:部分序列号报文(PSNP)和完全序列号报文(CSNP)。在一个点到点的子网上,路由器使用 PSNP 来明确地确认每一个 LSP 数据包是否收到。PSNP 数据包是通过下面的信息来描述正在被确认的 LSP:
- LSP ID
- LSP 的序列号
- LSP 的校验和
- LSP 的剩余生存时间
当一台路由器在一个点到点的子网上发送一条 LSP 时,它会设置一个周期为 minimumLSPTransmissionInterval 的计时器。如果该计时器超时,计时器还没有收到一个关于确认收到这条 LSP 的 PSNP 数据包,那么将会发送一个新的 LSP 数据包。
在一个广播型子网上,LSP 不需要每一台接收它的路由器确认。作为替代,指定路由器会周期性地以组播方式发送 CSNP,用来描述链路状态数据库中的每一个 LSP。当一台路由器收到一个 CSNP 时,它会把 PDU 中的 LSP 摘要与自己数据库中的 LSP 进行比较。如果发现在该路由器的数据库中存在 CSNP 中没有的 LSP,或者存在比 CSNP 中更新的 LSP 实例,那么该路由器将以组播方式在网络上发送这条 LSP。但是,如果其他路由器开始发送更新的 LSP,那么该路由器将不会发送相同 LSP 的另一个拷贝。如果路由器数据库中没有包含 CSNP 中列出的所有 LSP,或者数据库中包含的是某条 LSP 的旧实例,那么这台路由器将会以组播方式发送一个 PSNP 数据包,这个数据包列出了路由器所需要的所有 LSP。虽然 PSNP 数据包是以组播方式发送的,但是只有指定路由器才会使用包含相应 LSP 的数据包来响应。
IS-IS 还有一个特性,如果运行它的设备因内存不足而不能记录完整的链路状态数据库时,它具有通知其他路由器的能力。此时,路由器将会在所发送的 LSP 数据包中设置一个称为过载(Overload,OL)的位。OL 位用来指示路由器可能不能进行的正确的路由决策了,因为它的链路状态数据库已经不再完整。其他的路由器仍然会转发数据包到这台过载路由器的直连网络上,但是,在这台过载的路由器发送一个清除 OL 位的 LSP 数据包之前,其他路由器不会再利用这台路由器转发经过它传送的流量了。因为设置 OL 位可以避免过载的路由器被当做一条路由的下一跳,因此这个位又经常称为 hippity 位。
过载特性是路由器没有那么多内存时的产物,现代路由器一般不太可能出现过载的情况。但是,OL 位在现代网络中,特别是在 BGP 网络中还有另外一个用途。虽然像 IS-IS 这样的链路状态协议收敛速度非常快,但 BGP 网络的收敛非常慢。在一个 BGP 网络的内部,路由可能具有距离好几跳路由器的下一跳地址。当一个数据包到达时,将在 BGP 路由中查找它的目的地址,转发数据包之前,在 IGP 路由表中必须能够查找到该 BGP 路由的下一跳。现在假设有一台新路由器增加到某个网络上,并且 IGP 已经被收敛但 BGP 还没有收敛,如果一台路由器根据收敛的 IGP 路由确认这台新增加的路由器是达到 BGP 的下一跳的最优路径,那么它将把向下一跳地址转发的数据包转发到这台路由器。但是如果 BGP 还没有在新的路由器上完成收敛,那么该路由器就可能还没有关于这个数据包的 BGP 路由,从而丢弃该数据包,结果变成路由业务黑洞。
在 BGP 完成收敛前可以通过设置 IS-IS 的 OL 位,可以避免这个问题。如果设置了 OL 位,那么其他路由器将会绕过这台新的路由器进行路由选择,一旦 BGP 完成收敛,OL 位被清除,数据包将可以通过这台新路由器进行转发。
使用命令 set-overload-bit on-startup
可以指定一个秒数,用来说明在 IS-IS 启动后需要设置 OL 位的时间。当超过指定的秒数时,OL 位就会被自动清除。还有另一个可选的命令 set-overload-bit on-startup wait-for-bgp
,这样一旦 BGP 完成收敛就会清除 OL 位。
使用命令 show isis database
可以显示一个 IS-IS 链路状态数据库的摘要。使用带 level 和 LSP ID 的 show isis database detail
命令可以查看一个 LSP 的完整信息。
一旦更新过程建立了链路状态数据库,决策过程就将使用数据库中的信息去计算一个最短路径树。该过程使用生成的最短路径树去构建一个转发数据库(路由表),对于 L1 数据库和 L2 数据库,路由器将会执行不同的 SPF 计算。
ISO 10589 规定 IS-IS 协议使用下面的度量(一项是必须的,三项是可选的)来计算最短路径:
- 缺省度量(Default):这是每一台 IS-IS 路由器都必须支持和理解的度量
- 时延度量(Delay):这是一个可选项,反映一个子网的传输时延
- 代价度量(Expense):这是一个可选项,反映一个子网的成本代价
- 差错度量(Error):这是一个可选项,反映一个子网的出错概率,类似于 IGRP/EIGRP 协议中的可靠度量
每一种度量都使用一个范围在 0-63 之间的整数表示,并且每个路由都要为每种度量进行单独地计算。因此,如果一个系统同时支持这 4 种度量的类型,那么路由器必须为 L1 数据库和 L2 数据库各运行 4 次 SPF 计算。由于对每一个目的路由都可能需要进行多次反复地计算,结果会产生多个不同的路由表。由于可选的度量是用来支持根本没有发展起来的服务类型(ToS)的路由选择的,因此 Cisco 公司只支持缺省度量。
在 Cisco 路由器上,不论接口的类型如何,都会制定每一个接口的缺省度量为 10。使用命令 isis metric 可以修改这个缺省度量的值,而且可以分别为第 1 层和第 2 层的接口修改它们的缺省值,那么每个子网的度量可以认为是等价的,并且每个子网的 IS-IS 度量可以看作是一个简单的跳数,其中每一跳的代价为 10。
这种情况下,一条路由的总代价就可以看作是沿此路由路径方向的每一个出站接口的单独度量简单相加。对于任何一条路由,IS-IS 最大的度量值是 1023。这个比较小的最大度量值经常被认为是 IS-IS 协议的一个限制,因为在一个大型网络上它的度量尺度显得有点小了。但是 IS-IS 中新的扩展允许非常大的度量空间,具有 32 位度量,称为扩展度量。使用命令 metric-style wide 可以设置扩展度量。
IS-IS 协议的路由不仅分为 L1 路由和 L2 路由,而且分内部路由和外部路由。内部路由是指到达 IS-IS 路由选择域内的目的地的路由,而外部路由是指到达 IS-IS 路由选择域外的目的地的路径。L2 路由可能是内部路由,也可能是外部路由,但 L1 路由却总是内部路由。使用路由选择策略能够把一条 L1 路由变成外部路由。
如果到达某个具体目的地存在多条可能的路由,那么 L1 的路由将优先于 L2 的路由。在同一层的多条路由中,支持可选度量的路径要优先于只支持缺省度量的路径。在每一层所支持的度量中,具有最低度量的路由优先。如果经过这个决策过程处理后发现多条路径在同一层是等价的,那么它们都会被放入路由表中。在 Cisco 路由器的 IS-IS 协议的实现中将执行等价的负载均衡,并且最多支持 6 条等价负载均衡的路径。
之前讲过,LSP ID 的最后一个字节是 LSP 编号,并用来跟踪分段的 LSP。决策过程关注这个 LSP 编号有几种原因,首先如果一个 LSP 编号为 0 并且生存时间不为 0 的 LSP 不在路由器的数据库中,那么决策过程将不会处理任何具有同样系统 ID 但 LSP 编号不为 0 的 LSP。这种方法可以确保不会因为不完整的 LSP 而导致不精确的路由选择决策。另外,决策过程将仅从 LSP 编号为 0 的 LSP 中接受下面的信息,也就说说在一系列分段的 LSP 中,将由第一个 LSP 来宣告所有分段 LSP 的这 3 个设置信息:
- 数据库过载位的设置信息
- IS 类型字段的设置信息
- 区域地址可选字段的设置信息
对于 L1 的路由器来说,决策过程还有另外一项功能,就是为区域间路由选择计算到达最近的 L2 路由器的路径。当一台 L2 或 L1/L2 路由器与其他区域相连时,路由器将通过在它的 LSP 中设置 ATT 位为 1 来通告这种情况。对于 L1 路由器,决策过程将选择度量最近的 L1/L2 作为它缺省的区域间路由器。当使用 IS-IS 协议进行 IP 路由选择时,在路由器中会记录一条到达 L1/L2 路由器的 IP 缺省路由。
采用 IS-IS 协议需要注意一点,虽然 TCP/IP 协议是被路由转发的协议,但是决定路由选择策略的协议,包括所有路由的控制数据包和地址都是 CLNS 协议,有时把 CLNS 协议的信息和 IP 协议相关的信息关联起来是比较困难的,解决该问题的,有一条很有用的命令是 which-route,该命令用来确定某个具体的 CLNS 目的地址在路由表中的定位。
IS-IS 的 PDU 格式
IS-IS 协议使用 9 种 PDU 类型来进行它的控制信息处理,并使用一个 5 位的类型号来标识每一个 PDU 数据包,所有的 PDU 数据包可以归纳为 3 类。在所有的 IS-IS PDU 数据包起始的 8 个字节都是该数据包的头部字段,并且对于所有的 PDU 数据包类型都是公用的。如下所示,显示了 IS-IS PDU 数据包起始的 8 个字节:
![](/fuchencong.github.io/2019/05/18/routing-tcp-ip-10/images/02.jpg)
- 域内路由选择协议鉴别符:这是由 ISO 9577 分配的一个恒定不变的数值,用来标识网络层协议数据单元(NPDU),在所有的 IS-IS PDU 中,该字段的数值为 0x83
- 长度标识符(Length Indicator):标识该固定头部字段的长度,以字节数为单位
- 版本/协议 ID 扩展(Version/Protocol ID Extension):当前始终设置为 1
- ID 长度(ID Length):用来标识该路由选择域内使用的 NSAP 地址和 NET 的系统 ID(System ID)的长度,可能取值如下:1-8 的整数,表示系统 ID 字段具有相同长度的字节数;0,表示系统 ID 的长度为 6 个字节;255,表示系统 ID 字段为空。在 Cisco 路由器上系统 ID 字段的长度固定为 6 个字节,因此该字段的值始终为 0
- PDU 类型:是一个 5 位的字段,用于表示 PDU 类型号
- 版本号(Version):当前始终设置为 1
- 保留位:当前设置为全 0
- 最大区域地址数(Maximum Area Address):表示该 IS 区域所允许的最大区域地址数量,该字段的值可以是以下值之一:1-254 的整数,表示该区域实际所允许的最大区域地址数;0 表示该 IS 区域最多只支持 3 个区域地址数。Cisco 路由器始发的 IS-IS PDU 中,该最大区域地址数字段的值始终是 0,除非使用 max-area-address 改变缺省值。
紧跟在公共头部字段之后的专有 PDU 字段也是头部的一部分,根据 PDU 类型的不同它们会有所变化。紧跟在专有 PDU 字段之后的可变长字段是类型/长度/值(Type/Length/Value, TLV)这 3 个参数的不同组合。类型是一个指定值字段信息类型的数字,长度用来指定值字段的长度,而值字段就是它本身的信息内容。使用 TLV 的最大好处是我们只需要增加新的 TLV 类型,就可以为 IS-IS 添加新的特性。
IS-IS Hello PDU 格式
IS-IS Hello PDU 是同一条链路上的 IS-IS 路由器用来发现它们的 IS-IS 邻居路由器,一旦路由器发现了它的邻居路由器并且成功建立邻接关系,Hello PDU 的工作就只担当 keepalive 的功能,从而维护已有的邻接关系并将邻接关系中任何参数的变化通告邻居。
有两种类型的 IS-IS Hello 数据包:LAN Hello 数据包和点到点 Hello 数据包。LAN Hello 数据包可以进一步分为 L1 和 L2 的 LAN Hello 数据包,这两种类型的 LAN Hello 数据包格式是相同的,如下所示为 LAN Hello 数据包的格式:
![](/fuchencong.github.io/2019/05/18/routing-tcp-ip-10/images/03.jpg)
- 电路类型:是一个 2 位的字段,用来指定是 L1 路由器、L2 路由器还是 L1/L2 路由器
- 源 ID:是指始发该 Hello 数据包的路由器的系统 ID
- 抑制时间:是指邻居路由器在宣告始发路由器失效之前,它所等待接收下一个 Hello 数据包的时间间隔
- PDU 长度:是指整个 PDU 数据包的长度,单位为字节
- 优先级:一个用来选取 DR 的 7 位字段,数值越大表示优先级越高。
- LAN ID:就是指定路由器(DR)的系统 ID 再加上一个字节(伪节点 ID,用来区分这个 LAN ID和同一台指定路由器上的其他 LAN ID)
如下显示了 IS-IS 点到点 Hello PDU 数据包格式。点到点 Hello 数据包的格式和 LAN Hello 数据包相比,除了优先级字段外基本上是一样的。而且它用本地电路 ID 替代了 LAN ID。与 LAN Hello 数据包不同,L1 信息和 L2 信息是在同一个点到点 Hello PDU 数据包中传送的。
![](/fuchencong.github.io/2019/05/18/routing-tcp-ip-10/images/04.jpg)
- 本地电路 ID:是一个字节的标识字段,由始发路由器发送 Hello 数据包时分配给这条电路,并且在路由器的接口上是唯一的。在点到点链路的另一端,Hello 数据包中的本地电路 ID 可能包含,也可能不包含同样的值。
在 IS-IS LAN Hello 数据包中可以使用下面多种 TLV:区域地址、中间系统邻居、填充、认证信息、可选的校验和、支持的协议、IP 接口地址、重启、多拓扑、IPv6 接口地址、实验用。
- 区域地址 TLV: 是在始发路由器上配置的,并用来通告该区域的地址。一台路由器可以配置多个区域地址
- 中间系统邻居 TLV:列出了本地路由器所有邻居的系统 ID,但是这些邻居路由器必须满足在最新的一个抑制时间间隔内,能够被本地路由器接收到它们发出的 Hello 数据包。这在 OSPF 协议的 Hello 报文中也有类似的功能:为了验证双向通信,本地路由器列出了最近发出的所有 Hello 数据包以及被其收到的邻居路由器。该 TLV 只在 LAN Hello 中,点到点 Hello 数据包没有指定路由器的选取过程,因而在点到点 Hello 数据包中没有这个 TLV
- 填充 TLV:用来填充一个 Hello PDU 数据包,以使它达到允许的 IS-IS 大小的最小值,或者该链路的 MTU大小。
- 认证信息 TLV:只有在配置认证时才会使用,认证类型字段包含一个 0-255 之间的数字,用来指定认证使用的类型,并且也指定认证字段所包含的认证信息的类型
- 支持的协议 TLV:用来指定 PDU 数据包的始发路由器所支持的协议,仅支持 CLNP、仅支持 IP 或同时支持这两种协议。对于每一种所支持的协议,在 TLV 字段里都会有一个相应的 1 的字节的网络层协议标识符。
- IP 接口地址 TLV:是指发出 PDU 数据包的接口地址或 IP 地址
IS-IS 协议链路状态 PDU 格式
IS-IS 协议中 LSP 的功能在本质上和 OSPF 协议中的 LSA 的功能是一样的。一台 L1 路由器把 L1 类型的 LSP 泛洪到整个区域,用来确定它的邻接关系和这些邻接关系的状态。一台 L2 路由器把 L2 类型的 LSP 泛洪到整个第 2 层的域,用来确定它与其他 L2 路由器的邻接关系,并标识出通告 L2 路由器能够到达的地址前缀。
如下显示了 IS-IS LSP 的格式,这个格式对于 L1 LSP 和 L2 LSP 都是相同的:
![](/fuchencong.github.io/2019/05/18/routing-tcp-ip-10/images/05.jpg)
- PDU 长度:是指整个 PDU 数据包的长度,用字节表示
- 剩余生存时间:在确认一个 LSP 过期之前等待的秒数
- LSP ID:可以是系统 ID、伪节点 ID 或 LSP 数据包的 LSP 编号
- 序列号:一个 32 位无符号整数
- 校验和:对 LSP 内容的校验和
- P 位:是指分段区域的修复位,虽然这一位存在于 L1 和 L2 的 LSP 数据包中,但实际上只和 L2 的 LSP 数据包有关。当该位被设置为 1 时,表明始发路由器支持自动地修复区域的分段情况
- 区域关联位(ATT):用来指明始发路由器是与一个或多个其他区域相关联的。虽然区域关联位也存在于 L1 和 L2 的 LSP 数据包中,但是他们实际上只和 L1/L2 路由器始发的 L1 LSP 数据包有关。这 4 位用来表明相连的区域使用哪一种度量方式
- 过载位(OL):链路状态数据库的过载位。在一般情况下,该位设置为 0,收到过载位设置为 1 的 LSP 数据包的路由器,仍然会转发数据包到与这台始发过载信号的路由器直连的网络上,但是不会再使用这台始发路由器作为转发数据包的透传路由器
- 中间系统类型:一个两位字段,用来指明始发路由器是 L1 路由器还是 L2 路由器
如下将介绍在 L1 LSP 和 L2 LSP 数据包中可以使用的 TLV,之前介绍过的 TLV 这里不再叙述。
- 中间系统邻居 TLV(LSP):用来在 LSP 中列出始发路由器的 IS-IS 邻居(包括伪节点),同时它也列出了每一台邻居路由器的链路的度量。
- IP 内部可达性信息 TLV:IP 内部可达性信息 TLV 列出了与通告该 LSP 的、路由器直连的路由选择域内的 IP 地址和相关的掩码信息。这个 TLV 使用在 L1 和 L2 类型的 LSP 中,但是从来不会出现在伪节点的 LSP 中。
- IP 外部可达性信息 TLV:IP 外部可达性信息 TLV 列出了到达 IS-IS 路由选择域外部的 IP 地址和相关的掩码,这些外部的目的地址可以通过始发路由器的某个接口到达。
- 域间路由选择协议信息 TLV:域间路由选择协议信息 TLV 允许 L2 类型的 LSP 利用 IS-IS 域,来透传来自外部路由选择协议的信息
IS-IS 协议序列号 PDU 报文
SNP 通过描述数据库中的部分或者全部 LSP 的信息,对 IS-IS 链路状态数据库进行维护。在某些实例中,它们也用于请求 LSP,以及隐形或显性地确认收到的 LSP。因此,SNP 具有和 OSPF 中链路状态请求、数据库描述和链路状态确认消息的功能。
一台指定路由器(DR)将会周期性地以组播方式发送完全序列号数据包(CSNP),来描述伪节点数据库中的所有 LSP 信息,由于存在 L1 和 L2 类型的数据库,因此完全序列号数据包也可能是 L1 类型或者 L2 类型的。有时,某些链路状态数据库的信息量太大,以至于 LSP 的信息无法使用单个完全序列号数据包来描述。基于这个原因,完全序列号包头的最后两个字段作为起始 LSP ID(Start LSP ID)字段和结束 LSP ID(End LSP ID)字段,一起用来说明完全序列号数据包中描述的 LSP 的范围。如下显示了 IS-IS 完全序列号数据包格式:
![](/fuchencong.github.io/2019/05/18/routing-tcp-ip-10/images/06.jpg)
一个部分序列号数据包(PSNP)除了像前面描述的只是携带部分 LSP 的信息,而不是整个数据库的信息外,其他与完全序列号数据包相似。因此,不必像完全序列号数据包那样需要起始和结束字段。一台路由器可以在一个点到点的子网上发送部分序列号数据包来确认收到的 LSP。在一个广播型的子网上,部分序列号数据包将会用于请求丢失的或者最新的 LSP。和完全序列号数据包一样,部分序列号数据包也存在 L1 类型和 L2 类型。
在 SNP 中,无论是 CSNP 还是 PSNP,也不管是 L1 类型还是 L2 类型,它们都只利用到了 4 个 TLV 字段:LSP 条目、认证信息、可选的校验和和实验用 TLV
- LSP 条目 TLV:LSP 条目 TLV 总结了一个 LSP 中列出的该 LSP 的剩余生存时间、LSP ID、序列号和校验和。这些字段信息不仅可以确定某个 LSP,而且可以完全地确认某个 LSP 的一个具体实例
IS-IS 的扩展属性
在 IS-IS 协议扩展用来支持 IPv4 时已经增加了许多扩展属性,这些扩展属性有时为了支持可选的性能,有时改善了 IS-IS 协议的基本机制,接下来将介绍扩展特性中最重要的一些内容。
IS-IS 协议在基本机制方面有一个好的处理操作是,它和 OSPFv2 协议的 LSA 不同,IS-IS 协议碰到一个无法识别的 TLV 时,它只会忽略该 TLV。这一特性使 IS-IS 协议在处理扩展性和向后兼容性方面变得更加容易。
三路握手
在邻居之间建立邻接关系之前,邻居必须确保它们之间形成了双向通信。确保该过程的形成称作握手。对于双向握手而言,仅仅地发送和接收 Hello 数据包是不够的,因为你的邻居可能并未接收到你所发出的 Hello 数据包。因此对于你的邻居是否收到你所发出的 Hello 数据包作一些明确的确认是必要的,这就是三路握手(three-way handshake)。OSPF 协议总是使用三路握手,如果从邻居收到了 Hello 数据包,本地路由器就会在它所发送的 Hello 数据包中列出所有这样的邻居,因此,如果一台 OSPF 路由器看到它的 RID 在所收到的 Hello 数据包的邻居字段中列出,那么它就可以知道这个 Hello 数据包的始发路由器已经收到了这台路由器的 Hello 数据包。这是双向通信状态就可以得到确认。
在广播型的网络中,IS-IS 协议也是使用三方握手机制的。如果从邻居收到了 Hello 数据包,本地路由器所发送的 LAN Hello 数据包就会在它的 IS 邻居 TLV 中列出所有这样的邻居:IS-IS 路由器在它所收到的 LAN Hello 数据包的 IS 邻居 TLV 中看到它自己的 SysID,那么它就会认为双向通信已经确定建立了。
点到点 Hello 数据包是不携带 IS 邻居 TLV 的。ISO 10589 规定通过点到点链路只能建立双向握手,并且要求点到点的传输介质应该是可靠的。但是现实当中点到点链路可能经常是不可靠的。当然,我们也不会因为在网络中可能存在一条不能满足某些含糊的可靠性要求的链路,就不把 IS-IS 协议作为一个可能的 IGP 协议选择。
为了修正这个问题,RFC 3373 指定了一个点到点三方邻接 TLV,它列出了发起它的路由器所知道的所有邻居的 SysID,并且它也指出了始发路由器在该链路上可能的邻接关系状态。
跨域范围(Domain-Wide)的前缀分发
L1 区域的缺省特性和 OSPF 的完全末梢区域非常相似,也就是说,从区域 L2 到 L1 不通告任何前缀,相反的,L1/L2 路由器设置 ATT 位,并且 L1 路由器加载一条到达最近的 L1/L2 路由器的缺省路由。事实上,RFC 1195 规定,禁止从 L2 区域向 L1 区域通告前缀。
但是这样的规定也不总是可接受的,如果存在多台 L1/L2 路由器,有时更希望选择达到目的地最近的那台 L1/L2 路由器,而不是选择所在区域离出口最近的那台 L1/L2 路由器。为了达到这个目的,L1 路由器必须拥有相应前缀的必要信息和他们在本地区域外的路径代价。这也意味着必须把这个前缀从 L2 区域通告到 L1 区域。在 IS-IS 协议的专业术语中,这种情况称为 路由泄露。
如果一台 L1 区域内具有多台 L1/L2 路由器,这可能会引起潜在的区域间路由路由选择环路问题。如下所示演示了这个问题,L1/L2 路由器 Hague 通过一些 L2 LSP 学习到前缀 192.168.1.0/24 的信息,如果需要将该前缀信息通告到它的 L1 区域,那么它必须使用一个 IP 内部可达性 TLV 在它的 L1 LSP 中通告这个前缀信息,但这个 L1 TLV 在 L1 区域内扩散时,区域内的另一台 L1/L2 路由器 Rotterdam 将会收到它。但是由于这条前缀信息是在 L1 LSP 中扩散的,路由器 Rotterdam 没有办法得知它是始发于 L1 区域外部的前缀。因此这台路由器将会通过一条 L2 LSP 将这条前缀信息通告回 L2 区域,这样在 L2 路由器上就存在路由选择环路了,L2 路由器认为到达前缀 192.168.1.0/24 的路径存在于 L1 区域内。
![](/fuchencong.github.io/2019/05/18/routing-tcp-ip-10/images/07.jpg)
OSPF 协议并不存在这种问题,因为在 OSPF 协议中对于非骨干区域外部的前缀都是通过类型 3 的 LSA 通告的,在一个非骨干区域的其他 ABR 路由器将不会把从类型 3 的 LSA 学习到的前缀信息通告到区域 0。
在 RFC 2666 中,通过在 IP 内部可达性 TLV 和 IP 外部可达性 TLV 中定义一个称为 up/down 的位,来为该问题提供一种解决方案。当一台 L1/L2 路由器从 L2 区域向 L1 区域通告一条路由时,它将会设置这个 U/D 位。任何其他的 L1/L2 路由器收到在 L1 LSP 里设置了 U/D 位的前缀,都不会在 L2 LSP 中通告这个前缀。如果一台 L1/L2 路由器不能识别这个 U/D 位,那么它将忽略这一位。因此在使用 L2 到 L1 的路由泄露设计时,那么确保所有的 L1/L2 路由器都能识别这个扩展特性是很重要的。
扩展度量
流量工程(Traffic Engineering,TE)是一个主要与多协议标签交换(Multiprotocol Label Switching,MPLS)网络相关联的功能,在 MPLS 网络中的数据包的一些子集能够依赖用户指定的约束条件以不同的方式转发。换句话说,不像 IGP 协议那样总是选择单一的最短路径通过一个网络,业务流能够在不同的路径上传播。这种做法既可以帮助网络提高整个带宽的利用率,也能够提供区分服务:确保时延敏感的流使用最短的路径,而其他业务流使用较长的路径。
流量工程的一个关键是需要使用比度量更为详细的接口参数进行通信:使用用于共享路径设计的 IGP 协议和用于共享这些 TE 接口参数的的接口信息就变得有意义了。OSPF 与 IS-IS 协议都被扩展以便能够携带 TE 接口参数,对于 IS-IS 协议来说,使用以下两种新的 TLV:
- 扩展的 IS 可达性
- 扩展的 IP 可达性
这两个新的 TLV 不仅能够用于流量工程,而且可以用于支持一个更大的度量尺度。之前讲过,仅仅 6 位的度量字段不能满足一个大型网络所需要的足够的度量尺度,扩展的 IS 可达性 TLV 使用一个 24 位的度量字段,而扩展的 IP 可达性 TLV 使用一个 32 位的度量字段。
在 IOS 软件中启动扩展度量的命令是 metric-style wide
。
IPv6 的 IS-IS 路由选择
OSPF 协议需要一个全新的版本来支持 IPv6,但是另一方面,IS-IS 协议仅仅通过两个新的 TLV 就可以很容易地进行扩展来支持 IPv6 了。IS-IS 协议通过在它支持的 TLV 中包含 IPv6 NLPID 来支持 IPv6。这两个支持 IPv6 的 TLV 是:
- IPv6 可达性
- IPv6 接口地址
IPv6 可达性 TLV 可以说是为了实现 IPv4 中 IP 内部可达性信息和 IP 外部可达性信息 TLV 相同的功能,其也与扩展的 IP 可达性 TLV 更相近:
- 这个 TLV 用于同时通告内部和外部的前缀信息的
- 这个 TLV 包括了一个 32 位的度量字段,因此支持扩展度量特性
IPv6 接口地址 TLV 的功能等价于 IPv4 中类型为 132 的 IP 接口地址 TLV:它通告了始发这个 TLV 的接口的地址信息。并且和 IPv4 中相对应的,它能够被 Hello 数据包和 LSP 数据包携带。当 TLV 出现在 Hello 数据包中时,它所通告的地址就是始发接口的链路本地地址,如果 TLV 出现在 LSP 数据包中,那么它所通告的地址就不是始发接口的链路本地地址,而是地区或全球范围的地址。
动态主机名交换
使用 IS-IS 协议工作存在一个操作上的困难,就是它很难将多台不同路由器显示的 SysID 与正确的路由器相关联。标识 IPv4 地址是不容易的,但是往往为了方便而给它取一个比较熟悉的名字。
在 RFC 2763 中提供了一个动态主机名 TLV 的说明,它提供了解决上述困难的简单方案。这个简单的 TLV 在它的数字字段提供了最多 255 位的空间用来携带一个路由器名字的 ASCII 码。通常,支持这个扩展的实现方式是,将所配置的路由器主机名插入到这个字段中,然后就可以在任何非 LSP 中携带这个 TLV。
多拓扑结构
现代 IP 网络通常会在一个通用的网络基础设施中提供多种网络服务,一般通过基本的网络服务模块如 IPv4、IPv6 和多播实现。使用一个通用的网络基础设施提供所有的网络服务,而不愿为每一种服务组件各自独立的网络,这会在投资成本上带来巨大的好处。但是各个基本的服务模块需要不同的路由选择拓扑结构。
多拓扑路由选择允许在一个通用的网络基础设施上组建这些路由选择的网络子集。各个不同的拓扑可以使用多拓扑 ID(MT ID)来标识。这些 MT ID 是设计在路由器接口上的,用来表示这个接口属于什么拓扑。每一个接口都具有一个或多个 MT ID。邻接关系不是具体到特定 MT 的,而仍然是在所有的 IS-IS 邻居之间建立的,但是这些 LSP 都会标记上相应的 MT ID,并且每一个拓扑结构都会运行各自的 SPF 计算。在每一台路由器上,都会为每一个拓扑维护各自的路由表,而且路由表中的每一个路由条目都是基于各自的 SPF 计算而产生的。
IS-IS 支持 MT 路由选择目前仍然处于 Internet 草案阶段。在这个草案中指定了几个支持 MT 的 TLV:
- 多拓扑中间系统
- 多拓扑
- 多拓扑可达的 IPv4 前缀
- 多拓扑可达的 IPv6 前缀
当一台 MT IS-IS 路由器发送 Hello 数据包时,它会包含一个或多个多拓扑 TLV,用于始发接口所属于的每一个拓扑。如果一台邻居路由器没有包含 Hello 数据包中的多拓扑 TLV,那么这个邻居就会被认为仅仅属于缺省的 IPv4 拓扑(MT ID 为 0)。在一个点对点链路上,如果两个邻居之间没有任何共同的 MT ID,那么在这两个邻居之间将不会形成邻接关系。但是在广播型链路上即使邻居之间没有共同的 MT ID,邻居之间也会形成一个邻接关系。这是因为指定路由器的选举是独立于 MT IS-IS 扩展特性的,一台不支持扩展特性的路由器依然能够被选举为指定路由器(DR),因此在相同的层次的所有路由器一定是邻接的。
多拓扑 TLV 不仅可以由 Hello 数据包携带,也可以由 LSP 数据包携带。这个 TLV 可以分别为每一个拓扑表示过载(使用 O 位)和 L2 关联(使用 A 位)。多拓扑中间系统 TLV 和前面介绍的扩展 IS 可达性 TLV 几乎完全相同,除了对于每一个始发接口所属的的每种拓扑都要有各种单独的多拓扑中间系统 TLV 外,它和扩展的 IS 可达性 TLV 一样,也服务于同样的目的。
多拓扑可达的 IPv4 前缀 TLV 和多拓扑可达的 IPv6 前缀 TLV,在功能上分别与扩展的 IP 可达性 TLV 和 IPv6 可达性 TLV 相同。它们同样通告前缀,但同每一个给定的拓扑相关联。
Mesh 组
虽然有利于 SONET 和 MPLS 的技术正在快速消退,但是帧中继和 ATM 网络却依然经常作为许多大型网络的核心传输介质。帧中继和 ATM 网络经常使用的拓扑结构如下所示,是用于提供连接性的全网状连接的虚电路。但是过多的网状连接和全网状连接的网络容易受到过重的泛洪扩散负载影响。全网状连接是指所有的路由器都与其他所有的路由器相连接。
![](/fuchencong.github.io/2019/05/18/routing-tcp-ip-10/images/08.jpg)
由于每一台路由器和其他任何一台路由器都进行连接,那么在一台路由器扩散一条 LSP 时,其他路由器会立即收到该 LSP。现在存在的问题是,接收路由器和其余的路由器之间都存在链路连接,而它们并没有办法知道所扩散的 LSP 已经被其他路由器收到。因此根据泛洪扩散的基本水平分割法则,这些路由器将会把 LSP 从没有收到这个 LSP 的每个接口扩散出去,因此会产生大量不必要的扩散的 LSP。当然,在现代网络中,这个通信量与整个网络要处理的所有数据包的通信量相比也许不是不可接受的,但是对于许多网络架构设计师来说,任何无效率的设计都违背了审美的情趣。
对于这些为了简单地寻找更加简洁设计的工程师来说,在 RFC 2973 中提供了有关 IS-IS 协议的 mesh 组。Mesh 组的机制允许读者在清楚地确认路由器的邻居已经收到某个 LSP 时可以避免再扩散这个 LSP。Mesh 组将一个接口定义为下面 3 种模式之一:
- 不活动模式(Inactive)
- 阻塞模式(Blocked)
- 设置模式(Set)
不活动模式简单来说就是虽然路由器支持 mesh 组,但是没有 mesh 组在接口上启用,LSP 是正常扩散的。但是一个接口处于阻塞模式时,它就不再扩散任何 LSP。如下所示,通过阻塞接口来减少网络的扩散负载,全网状连接的拓扑简化成一个环形的扩散拓扑:
![](/fuchencong.github.io/2019/05/18/routing-tcp-ip-10/images/09.jpg)
但是部分接口被阻塞的拓扑也是需要权衡的,首先,每一台路由器之和其他两台路由器具有非阻塞的扩散连接时,如果这两台连接都失效了,那么即使这台路由器还有其它完好的连接到达邻居,扩散也将会被破坏。其次就是对收敛时间的影响,因为某些情况下要扩散的 LSP 需要通过一台或几台路由器传输后才会被所有的路由器接收到。
设置模式域阻塞模式相比,提供了更多的灵活性,在仍然降低扩散负载的情况下(虽然没有阻塞模式降低的多),提供了在阻塞模式中存在冗余性降低与收敛时间增加的一种折中方案。在设置模式下,可以定义带有编号的 mesh 组,并分配相应的接口到对应的组。在收到一条 LSP 时,这条 LSP 就在属于某个编号 mesh 组的接口上被收到。然后除了那些与接收到这条 LSP 的接口同属于一个组的接口外,这条 LSP 会在其他所有的接口上扩散出去。
不活动模式、阻塞模式和设置模式可以混合使用来组成一个复杂的拓扑,以便获取所希望的扩散模型。在实际使用中,阻塞模式比设置模式用的更为普遍。如果选择使用 mesh 组,那就是在以牺牲全网状连接的扩散拓扑所具有的健壮性为代价来降低泛洪扩散的负载的。
泛洪扩散的时延
虽然 mesh 组能够在比较密集的网状网络扩散过程中控制发送大量不必要的 LSP,但是如果一个网络不稳定的话泛洪扩散也会成为一个问题。IOS 软件系统也提供了几种在这些情况下减少扩散影响的工具。
在路由器碰到不稳定的情况下减少本地始发的 LSP 的扩散。通过在扩散一个 LSP 之前强制加上一个时延就可能避免每一次波动都引起一次扩散的情况发生。但是并不总是希望延迟扩散,例如网络稳定的情况下,等待一分钟才进行新的 LSP 的扩散,这会使收敛时间大大增加。因此在 IOS 软件中利用了一个指数补偿算法。这个指数补偿算法的缺省状态可以通过命令 lsp-gen-interval 来改变。
虽然在局部出现不稳定时可以采用 lsp-gen-interval 来抑制 LSP 的生成,但在某台特定的路由器出现性能问题并因为大量的扩散产生过载时也可能会产生问题,唯一的解决方法是升级路由器。但是在过渡阶段也可以利用一些选项来控制泛洪扩散到邻居。
- isis lsp-interval 命令选项可以用来在一个接口上改变 LSP 发送之间的缺省时延
- 重传一条 LSP 的缺省等待时间是 5s,通过增加等待时间可以稍微保护一下性能不足的邻居,使用命令 isis retransmit-interval 可以增加等待时间
- 使用命令 isis retransmit-throttle-interval 在等待时间超时的情况下,增加每一个重传的 LSP 之间的时间间隔
虽然这些命令提供了一些控制泛洪扩散的手段,但他们应该仅仅在极端的情况下使用。在绝大多数的情况下,缺省的参数值不应该改变。
提高 SPF 的效率
IOS 软件系统使用以下两个机制来提高 SPF 算法的效率:
- 递增 SPF(Incremental SPF,iSPF)
- 部分路由计算(Partial Route Calculations,PRC)
当一台末梢路由器增加到网络中时,那么区域内的所有路由器都不需要重新计算 SPF,相反只需要增加这台路由器到 SPF 树就足够了。如果还没加载到 SPF 树上的某些链路在某些方面的变化不会影响 SPF 树,那么就根本没有必要为此运行 SPF 计算。iSPF 考虑到这些情况,只根据拓扑变化的程度大小而运行 SPF 计算。iSPF 也能够限制 SPF 计算的范围,即如果一个变化只影响拓扑的有限部分,那么 iSPF 就可以把 SPF 的重新计算限制在拓扑变化的范围内。
另一个没有必要触发进行 SPF 计算的变化是 IP 前缀的增加、删除或度量变化。检测到这样一台变化的路由器会通过 IP 可达性 TLV(或功能等价上的 TLV)来扩散一个 LSP,从而通告这个变化。但是这个 LSP 不需要触发进行 SPF 计算,这就是部分路由计算:首先检测所收到的 LSP,然后确认如果不是需要进行 SPF 计算的拓扑变化,比如一个新的 IP 可达性 TLV 或新的 IS 邻居 TLV,那么就不进行 SPF 计算。
在网络不稳定的时期,在 SPF 计算的运行之间加入更长的时延可能跨越多条 LSP 的接收时间。即如果很多 LSP 正在进行泛洪扩散,两个 SPF 计算的运行之间等待可能意味着并不是每次收到一条 LSP 而运行 SPF 计算,而是意味着可能收到了很多 LSP,并为所有这些 LSP 运行一次 SPF 计算。IOS 软件系统对于运行 SPF 计算也采用了类似抑制 LSP 生成的指数补偿算法。
需要注意,改变 SPF 时延的缺省值通常不是一个好注意,解决频繁地进行 SPF 运行的实际可行方法是,可靠的链路和网络部件,并且尽可能的使用区域来减少泛洪扩散的范围。
集成 IS-IS 协议的配置
集成 IS-IS 协议在 IP 路由选择协议中显得比较独特,这有两方面的原因:
- 首先 IS-IS 协议是唯一一个必须作为一个进程启动而又要在单独的接口上启动的协议
- IS-IS 协议是唯一一个开始并不是为 IP 协议设计的 IP 路由选择协议
由于 IS-IS 协议使用 CLNS PDU 数据包而不是 IP 数据包,因此 IS-IS 协议的配置就不如其他路由选择协议的配置那么清楚直观。
案例研究:IPv4 集成 IS-IS 的基本配置
在一台 Cisco 路由器上配置一个集成 IS-IS,需要以下 4 个步骤:
- 确定路由器所在区域和启动 IS-IS 协议的接口
- 使用 router isis 命令来启动一个 IS-IS 进程
- 使用 net 命令来配置 NET 地址
- 使用命令 ip router isis 在相应的接口上启动集成 IS-IS。这个命令不仅在转发接口(和 IS-IS 邻居相连的接口)上必须增加,而且在一个和末梢网络相连的接口上也需要配置,这里的末梢网络是指 IS-IS 协议来通告的 IP 地址
如下显示了一个包括 6 台路由器的小型网络,它被分成了两个区域。使用 NET 地址表示方式,区域 1 和 区域 2 将分别表示为 00.0001 和 00.0002,而它们各自的系统 ID 是每台路由器 E0 或 FastEthernet0/0 接口的 MAC 地址标识符。
![](/fuchencong.github.io/2019/05/18/routing-tcp-ip-10/images/10.jpg)
CLNS 路由选择对于 IS-IS 协议处理 CLNS PDU 是必需的。当我们启动一个 IS-IS 进程的时候,就自动地启动了 CLNS 路由选择。
路由器 Paris 的路由表将同时包含了 L1 路由和 L2 路由。在缺省条件下,Cisco 路由器默认是 L1/L2 路由器,这可以查看邻居路由器的 IS 邻居表得到确认。由于在该网络中,每一台路由器都是 L1/L2 类型的,因此每一台路由器都会同时形成 L1 类型的邻接关系和 L2 类型的邻接关系,每一台路由器也将会同时维护一个 L1 类型的链路状态数据库和一个 L2 类型的链路状态数据库。
案例研究:更改路由器的类型
在如上所示的小型网络中,在路由器上保留他们缺省的 IS-IS 类型是可以接受的。但是当网络规模不断增大时,使用这些缺省的类型将越来越不能接受。因为这不仅要消耗大量的路由器 CPU 和内存去处理和维护这两个链路状态数据库,而且要消耗大量的缓存和带宽去处理和泛洪每一台路由器始发的 L1 和 L2 类型的 IS-IS PDU。
在该网络中,路由器 Paris、Berlin 和 Amsterdam 可以配置成 L1 路由器,因为它们都没有和其他区域直连的链路。在路由器上可以使用命令 is-type 来更改缺省的路由器类型。
之前介绍过 LSP 中的区域关联位(ATT 位),一台 L1/L2 路由器会通过设置 ATT 位来告知 L1 路由器它具有区域间的连接。因此在路由器 Paris 中会有一条到达路由器 London 或 Rome 的缺省路由,而且到达路由器 London 的路径将会成为优先路径,因为路由器 Paris 到达它的度量更小。
在 IOS 软件的旧版本中,IP 进程不能直接解释 ATT 位,ATT 位是一个 CLNS 的特性。当运行 IOS 软件的旧版本时,如果在 L1 路由器中没有自动地创建缺省路由,将有两种方法解决这个问题:
- 在路由器的接口上除了启用 IP 协议的 IS-IS,另外再启用 CLNS 协议的 IS-IS,这种方法假设 IS-IS 协议需要运行在 CLNS/IP 的混和环境中,但是如果 IS-IS 协议仅仅是作为一个单一的 IP 路由选择协议使用,那么启用 CLNS 路由选择仅仅为了生成一条 IP 缺省路由就显得十分没必要了
- 在 L1/L2 路由器上配置一条静态路由,并且使用命令 default-information originate 配置 IS-IS 协议来通告这条缺省路由
案例研究:区域的迁移
在 OSPF 协议中,如果更改区域的地址,必须考虑和预计好网络中断的时间。但是,在 IS-IS 协议的设计中,能够在网络不中断的情况下更改区域地址。Cisco 路由器最多允许配置 254 个 L1 区域地址,为了使两台路由器能够形成一个 L1 邻接,它们必须至少具有一个公用的区域地址。在具有多个区域地址的情况下,新的邻接关系能够在旧的邻接关系中断时替代它。
假定在如上网络中正在使用的区域地址安排不合法,需要使用新的 NET 地址:
- 更改区域地址的第一步是增加新的 NET 地址到路由器上,但是不改变原来的 NET 地址。
- 区域迁移的最后一步是从所有的路由器上删除原来的 NET 地址语句
案例研究:路由汇总
汇总路由具有如下好处:
- 汇总路由可以有效减小 LSP 的大小,这样也减少了链路状态数据库的大小,从而也节省了路由器的 CPU 和内存消耗
- 汇总路由可以隐藏区域内部网络的不稳定影响。如果仅仅是一个汇总地址范围内的地址发生了改变或一条链路的状态发生变化,那么并不会通告做到汇总的外部区域
当然,汇总路由也有一些缺点:
- 汇总路由的效果依赖于能够进行汇总的连续的 IP 地址范围,因此地址分配必须进行仔细规划
- 汇总路由由于隐藏区域内的细节因而减少了路由的精确性。如果有多条进入汇总区域的路径,那么将无法确定最佳的路径
路由汇总可以在 IS-IS 的配置下使用命令 summary-address
来启动。配置了这条语句后,任何在汇总地址范围内的更具体的目的地址都将被抑制,而汇总路由的度量会选择它所有更具体的地址中更小的度量。
案例研究:认证
IS-IS 协议的认证可以使用明文口令或 HMAC-MD5。有两种方法配置明文口令,这两种认证方式对于防止来自网络的攻击提供了一个很弱的安全机制,但是对于防止因为配置出错或者未授权的路由器造成网络服务的中断还是比较有效的。
Cisco IOS 支持 3 个级别的 IS-IS 认证:邻居之间、区域范围和 IS-IS 域范围。这 3 个级别的认证可以单独使用,也可以一起使用。IS-IS 的认证规则如下:
- 当在邻居之间进行认证时,互相连接的路由器接口必须配置相同的口令
- 当在邻居之间进行认证时,必须分别为 L1 和 L2 类型的邻接关系配置各自的认证
- 当在邻居之间进行认证时,可以使用明文或 MD5 认证
- 当认证在整个区域范围内有效时,区域内的每一台路由器都必须使用相同的认证模式和具有共同的钥匙串
- 当认证在整个 IS-IS 域范围内有效时,IS-IS 域内的每一台路由器都必须使用相同的认证模式和具有共同的钥匙串
在 IS-IS 中配置认证的步骤和在 RIPv2 和 EIGRP 中的配置步骤是一样的,这些步骤重复如下:
- 定义一个带有名字的钥匙链
- 在钥匙链上定义一个或一组钥匙
- 在某个接口上,或者为 L1(区域范围)或者 L2(域范围)的 IS-IS 实例启用认证,并指定使用的钥匙链
- 为某接口,或者为 L1 或 L2 的 IS-IS 实例指定将使用明文或 MD5 认证
- 可选地配置钥匙的管理
在网络配置中认证可以不中断路由器之间的邻接关系,为了完成这项功能,命令 isis authentication send-only 必须首先配置在需要使用认证的所有路由器上。这条命令在接口上用来进行邻居之间的认证,在 ISIS 路由选择进程下用来进行区域范围或域范围的认证,在认证完全配置好之后可以删除这条命令。
如果要在邻居之间进行认证,先配置钥匙链,命令 isis authentication key-chain 引用预先配置的钥匙链,接着使用命令 isis authentication mode 在直连的接口上配置认证类型。L1 与 L2 邻接可能引用不同的钥匙链。相邻的邻居必须共享相同的钥匙串或口令。当配置完成后,钥匙串可以由 IS-IS 邻居之间的 L1 或 L2 Hello 数据包内的认证信息 TLV 携带。
如果在一个区域内进行认证,可以使用命令 isis authentication mode mode level-1 和命令 isis authentication key-chain name level-1 来定义认证模式,并在一个 IS-IS 配置下引用一个钥匙串。在接口配置模式下使用命令 isis authentication 指定的钥匙串是在 Hello 数据包中传送的,而在 IS-IS 进程下使用的 level-1 认证命令指定的钥匙串是在所有的 L1 LSP、CSNP 和 PSNP 中传送的。
因此邻居级别的口令可以用来验证邻接关系的建立,而区域级别的口令则可以用来验证 L1 类型的链路状态信息的交换。如果区域认证没有配置正确,路由器将仍然形成邻接关系,但是不会进行 L1 LSP 的交换。
如果要在 IS-IS 域范围内配置认证信息,可以在 IS-IS 进程下使用带关键字 level-2 的命令 authentication key-chain 和 authentication mode。定义在钥匙链中的被这些认证命令引用的钥匙串将在 L2 LSP、CSNP 和 PSNP 中传送。因而 IS-IS 域认证可以用来验证 L2 路由信息的交换。
案例研究:IPv6 集成 IS-IS 的基本配置
集成 IS-IS 对于 IPv4 和 IPv6 协议(还有 CLNS)只需要计算单个 SPF 来创建单个拓扑。如果在网路中配置了 IPv4 和 IPv6,那么所有接口和所有的路由器都必须配置这两种协议。
为了运行 IPv6 协议下的 IS-IS 协议,可以先利用命令 ipv6 unicast-routing 在全局模式下启动 IPv6 路由选择,然后在接口上启动 IPv6 的 IS-IS 协议。在每一个具有 IPv4 地址的接口上都增加了一个 IPv6 地址和 IPv6 IS-IS 协议。
IPv6 地址也可以类似于 IPv4 地址那样进行汇总。IPv6 地址的汇总是在全局 IS-IS 路由选择进程模式下,通过指定 IPv6 地址族和配置希望汇总的地址范围来实现的。IPv4 和 IPv6 共享相同的的拓扑结构,因此也共享同样的度量值。
案例研究:过渡到多拓扑模式
因为单一的拓扑时为 IS-IS 的每一层存在的,因此这个拓扑是由 IPv4 和 IPv6 协议共享的,IPv4 和 IPv6 协议必须同时配置在每一条链路和每一台路由器上。如果使用单一的拓扑,并同时配置 IPv4 和 IPv6 协议,那么具有 IPv6 地址的链路也都必须具有 IPv6 地址。
IOS 软件除了支持缺省的单一拓扑模式,还支持多拓扑模式的 IS-IS。在单一拓扑模式下,IPv4、IPv6 和 CLNS 都共享相同的 IS-IS 拓扑。在配置了多拓扑模式后,IOS 软件系统可以支持两种拓扑:一种与 IPv6 相关,另外一种与 IPv4 和 CLNS 相关。对于每一种拓扑都会有各自独立的 SPF 计算。
单拓扑的 IS-IS 和多拓扑的 IS-IS 使用不同的 TLV 交换信息,一台不能支持多拓扑模式的路由器将无法理解多拓扑 TLV。一台多拓扑模式的路由器可以处理单拓扑模式的 TLV:如果在邻接连接上没有收到多拓扑 TLV,那么这台接收路由器就假定它的邻居是 IPv4/CLNS 拓扑的一部分。这在单拓扑模式和 IPv6 都已经配置在网络中,并且你希望把网络迁移到多拓扑模式的时候可能会出现问题。在迁移期间,IPv6 网络的区域会变得不可达。
IOS 软件系统提供了一个过渡模式,在这种模式下可以发送单拓扑和多拓扑 TLV,但是路由器只能在多拓扑模式下操作。在所有的路由器都配置完成后,将会删除过渡模式。在配置多拓扑模式之前,在路由器上必须配置用在多拓扑 TLV 中的扩展度量。
案例研究:层之间的路由泄露
当一台 L1/L2 路由器发送 L1 LSP 到一个区域时,它会通过在 LSP 中设置 ATT 位来通知其他的 L1 路由器它能够到达另一个区域。当需要转发数据包到外部时,L1 路由器会把数据包转发到最近的 L2 路由器(到设置 ATT 位的路由器具有最小代价的路径)。
把 L2 的路由通告给 L1 路由器的做法称为路由泄露(route leaking)。下行方向的路由泄露要求 L1 路由器需要明确地知道附加的地址和这些地址的路径。
路由泄露的配置方式是,首先通过创建一个包含所要通告到该区域的地址列表,然后配置这个列表分发到 L1 路由器上。
泄露的路由通过和其他地址一样的方式进行通告:使用类型为 128、130 或 135 的 IPv4 可达性 TLV、以及类型为 236 和 237 的 IPv6 可达性 TLV。为了把泄露的路由和其他相连接的 IP 路由或外部的 IP 路由区分开来,这里定义了一个 up/down 位,如果该位为 0,那么这条路由就是始发于本地 L1 区域的,如果 up/down 位设置 为 1,那么说明这条路由是由 L2 泄露到 L1 的。设置该位有助于避免产生路由环路。一台 L1/L2 路由器不会把设置了 up/down 位的 L1 路由地址通告给其他 L2 路由器。
案例研究:多个 L1 区域运行在同一台路由器上
IOS 软件系统具有在单台路由器上支持多个 L1 区域同时运行的能力:在 IOS 路由器上最多可以配置 29 个 L1 区域,但是只能配置一个 L2 区域。在缺省情况下,第一个配置的 IS-IS 路由选择进程定义为 L2 区域。它也可以定义单个 L1 区域,为了在路由器上增加运行另外的 L1 区域,需要定义另外的 IS-IS 路由选择进程。在所配置的每一个 L1 区域内的路由器都是通过这台 L1/L2 路由器来通信。因为每一个区域都不需要具有单一的 L1/L2 路由器到达网络的其他部分,因此 L1/L2 路由器的数量可以减少到最少。
集成 IS-IS 协议的故障诊断
IS-IS 协议故障诊断的基本方法和 OSPF 协议的故障诊断方法十分相似。集成 IS-IS 协议和其他 IP 路由选择协议的故障诊断相比,一个主要的不同之处是 IS-IS 协议使用的是 CLNS PDU 数据包,而不是 IP 数据包。如果是对协议本身做故障诊断的话,需要记住你是在做 CLNS 协议的故障诊断,而不是 IP 协议。
正如所有的路由选择协议一样,故障诊断的第一步是检查路由表来获取精确的信息。如果一个预期的路由条目在路由表中丢失了或变得不正确,那么故障诊断接下来的任务就是确定引起故障的源头。在检查过路由表之后,查看链路状态数据库就是获取故障诊断信息的一个最重要来源。
在检查一台单独的路由器配置时,可以考虑以下问题:
- 在 IS-IS 协议配置下面的 net 语句是否指定了正确的 NET 地址,在该路由器上配置的区域 ID 和系统 ID 是否正确无误,配置的 NET 地址是否符合在网络上正在使用的 CLNS 编制约定
- 是否在正确的接口上使用命令 ip router isis 或 ipv6 router isis 启动 IS-IS 协议
- IP 地址和子网掩码或前缀的配置是否正确?在一个集成 IS-IS 环境里检查这些配置更加重要,因为配置错误的 IP 地址不会妨碍部分地建立一个 IS-IS 邻接关系
IS-IS 邻接关系的故障诊断
使用命令 show clns is-neighbors
可以显示 IS-IS 的邻居表,从这个表中可以看出所有预期的邻居是否都出现了 。可以使用命令 show clns is-neighbors detail 来显示与每一个邻居相关联的区域地址和 IP 地址,以及每一个邻居的上线时间等。
在检查邻接关系时,可以考虑以下问题:
- 路由器的层是否配置正确?L1 路由器只能和 L1 与 L1/L2 类型的路由器建立邻接关系,而 L2 路由器只能和 L2 与 L1/L2 类型的路由器建立邻接关系
- 是否这两台邻居路由器都在发送 Hello 数据包?Hello 数据包的层是否正确?Hello 数据包包含的参数是否正确,调试命令 debug isis adj-patchests 可以用来查看 Hello 数据包
- 如果使用了认证,那么在邻居之间的口令和认证是否相同?区域(第 1 层)和域(第 2 层)认证,不是验证普通的邻接关系,它们只验证 LSP 的交换
- 是否存在任何阻塞 IS-IS 或 CLNS 协议的访问列表
log-adjacency-changes 是一个 IS-IS 进程配置模式命令的命令,该命令将在日志中记录所有的邻接关系的变化,日志可能在缓存区也可能发送到一台日志服务器上。
IS-IS 链路状态数据库的诊断
IS-IS 链路状态数据库的信息可以通过命令 show isis database 来查看。如果一台路由器是 L1/L2 路由器,那么缺省情况下将同时显示 L1 和 L2 类型的数据库。如果只需要查看其中一个数据库,可以使用 level-1 或 level-2 关键字。如果需要查看 LSP 更详细的信息,可以使用 detail 关键字。
如果 SPF 发生了频繁计算,这表明网络发生了频繁的变化。有 3 个有用的调试命令可以跟踪这一问题:
- debug isis spf-triggers 显示了与触发一个 SPF 计算有关的事件消息
- debug isis spf-events 显示了触发事件引起 SPF 计算的一个详细报告
- debug isis spf-statistics 显示了有关 SPF 计算本身的信息
在一个区域内的每一台路由器都必须维护一个同样的链路状态数据库。另外,IS-IS 域内的每一台 L1/L2 和 L2 路由器都必须维护一个同样的 L2 类型的数据库。如果怀疑某台路由器的链路状态数据库不能正确同步,可以检查它的 LSP ID 以及校验和。相同的 LSP ID 应该存在与每一个数据库中,并且在每一个数据库中的每一个 LSP 的校验和也都应该相同。
有两条调试命令可以帮助查看数据库的同步过程:
- debug isis update-packets:显示了路由器接收和发送 SNP 与 LSP 有关的信息
- debug isis snp-packets:显示了路由器接收和发送某个指定的 CSNP 与 PSNP 有关的信息
总结
到现在为止,所有的 IP IGP 协议都已经介绍完成了,下一步将开始研究一些有效的工具来帮助控制网络,这包括路由再分配、缺省路由、按需路由选择、路由过滤和路由映射。