IS-IS动态路由协议
一、协议的概要:
A、相关定义和概要:
1、由来:
IS-IS(中间系统到中间系统)路由协议最初是ISO(国际标准化组织)为CLNP(无连接网络协议)设计的一种动态路由协议,也是一种基于链路状态并使用最短路径优先算法(SPF)进行路由计算的一种IGP协议。 协议优先级为15。现在CLNP网络已经基本不再别使用,但是IS-IS协议由于其优秀性,被保留了下来。

为了提供对IP路由的支持,通过对IS-IS进行扩充和修改,使IS-IS能够同时应用在TCP/IP和OSI环境中,形成了集成化IS-IS(Integrated IS-IS或Dual IS-IS)。IS-IS工作在数据链路层。现在提到的IS-IS协议都是指集成化的IS-IS协议,主要用于城域网和承载网。应用场景如下图:

2、相关术语:

IS:Intermediate System中间系统(Router路由器)
DIS:Designated Intermediate System(指定中间系统,以便周期性地向区域内其他路由器进行区域LSDB数据库的泛洪,区域内的非DIs仅与DIS之间进行LSDB交互,非DIS之间不能直接进行LSDB交互)
ES:End System(Host也就是终端设备,主机系统)
SysID:System ID(在ISIS中,用SysID来唯一标识一台路由器,必须保证在整个IS-IS路由域中每台路由器的系统ID都是唯一的,与OSPF的路由器ID一样)
PDU:Protocol Date Unit 协议数据单元(IP Packet)
LSP:LinkStateProtocolDataUnit(链路状态数据单元,ISP是IS-IS网络中的设备用来通过泛洪方式向所有邻居通告自己的链路状态信息的报文,类似于OSPF中的LSA,网络中每台路由器都会产生带有自己系统ID标识的LSP报文,可以通过发送LSP不断更新字段链路状态信息)
LSDB:LSPDatabase(LSP数据库,通过LSP的泛洪,最终使整个区域内的所有路由器拥有相同的LSDB)
Level-1 路由器:只维护当前区域的LSDB。
Level-2 路由器:维护一个Level-2的LSDB,Level-2区域是一个逻辑区域,可包含多个物理区域,Level-2的LSDB包含整个IS-IS域的所有路由信息。
Level-1-2 路由器:维护两个LSDB,Level-1的LSDB用于区域内路由,Level-2的LSDB用于区域间路由。
IIH:Intermediate System to Intermediate System Hello PDU(类似于OSPF的HELLO报文)
PSNP:Partial Sequence Number Protocol Data Unit (部分序列号协议数据单元,类似于OSPF的ACK、Request)
CSNP:Complete Sequence Numbers Protocol Data Unit(全部序列号协议数据单元,类似于DBD报文)
NET:Network Entity Title(网络实体标记)(特殊NSAP,最后一个字节为0,RID+AREA
3、路由器的分类:
为了支持大规模的路由网络,IS-IS在路由域内采用两级的分层结构,即一个大的Domain(域)可以被分为多个Areas(区域)。IS-IS网络中三种不同级别的路由设备:
level-1路由设备部署在区域内,只维护当前区域的LSDB,Level-1的LSDB用于区域内路由
Level-2路由设备部署在区域间,Level-2区域是一个逻辑区域,可包含多个物理区域,Level-2的LSDB包含整个IS-IS域的所有路由信息。Level-2的LSDB用于区域间路由
Level-1-2路由设备部署在Level-1和Level-2路由设备的中间。类似于OSPF网络中的ABR(区域边界路由器),用于区域间的连接,缺省所有IS-IS路由器都是L1/2类型的
如下图所示,一个运行IS-IS协议的网络,整个骨干区域(backbone)不仅包括Area1中的所有Level-2路由设备,还包括其他区域的Level-1-2路由设备。

4、支持的网络:
IS-IS只支持两种类型的网络,根据物理链路不同可分为:
广播链路:如Ethernet、Token-Ring等。在广播类型网络中,IS-IS 在同一网段上的同一级别的路由器之间都会形成邻接关系, 包括所有的非DIS 路由器之间也会形成邻接关系
点到点链路:如PPP、HDLC等。
对于NBMA(Non-Broadcast Multi-Access)网络,如ATM,需对其配置子接口,并注意子接口类型应配置为P2P。
IS-IS不能在点到多点链路P2MP(Point to MultiPoint)上运行
5、与OSPF 对比:
B、地址结构和报文解析:
1、地址介绍:
由于IS-IS原来是为CLNP设计的。CLNP网络不是使用IP地址来进行通信的,而是使用NSAP地址来进行通信。即便现在是集成IS-IS,但是使用NSAP地址这项还是保留了下来。
NSAP地址与IP地址一样,都是用于定位资源的地址,主要用于提供网络层和上层应用之间的接口

我们将支持IP网络的,也就是SEL=00的NSAP地址,叫做NET地址。
NET的长度与NSAP的相同,最多为20个字节,最少为8个字节。
在路由器上配置IS-IS时,只需要考虑NET即可,NSAP可不必去关注。

关于NET地址:每台运行IS-IS的网络设备至少需要拥有一个NET地址,一台设备可以同时配置多个NET,但是这些NET的SystemID必须相同。
同一个区域的路由器区域地址需一致,System ID 可以不一致。不同区域的路由器区域地址需不一致,System ID 可以一致。
在华为设备上,SystmeID的长度总是固定6Byte。
设备的SystemID在网络中必须唯一,为了便于管理,一般会根据设备的Router-ID进行配置SystemID。
2、Router-Id转换成NET地址:

C、报文介绍:
1、报文结构:
因为IS-IS协议是基于链路层的,所以IS-IS报文直接封装在链路层报文中。所有的IS-IS报文由三部分组成:IS-IS通用头,PDU固定专用头和PDU TLV,其中IS-IS通用头是8个字节,这部分所有的IS-IS报文都包含;PDU固定专用头由不同的PDU决定(这点与OSPF类似),不同类型的PDU长度不一致,详见各类PDU的报文结构;PDU TLV是变化的,由不同PDU携带的TLV决定。

2、报文TLV:
IS-IS报文结构中除了固定的部分,每个报文还会携带TLV传递信息,TLV在IS-IS报文中是可变长字段。
TLV实际上是一个数据结构,这个结构包含了这三个字段:类型(TYPE),长度(LENGTH),值(VALUE),这三个已被称为三元组。TLV也称为CLV。而且IS-IS协议规定,对于不能识别的TLV的动作是忽略,而不是丢弃。IS-IS定义的TLV类型及作用表:

网络拓扑结构和路由信息使用TLV结构构建报文,使报文结构的灵活性和扩展性获得提升。TLV结构使报文的整体结构固定,增加新特点时只需要增加新TLV即可,不需要改变整个报文的整体结构。
3、报文类型:
Hello:用于建立和维持邻居关系,也称为IIH(IS-to-IS Hello PDUs)hello时间为10s,hold时间 为30s,DIS路由器发送hello时间为3.3s,hold时间依然为30s
Broadcast L1-Hello 用于建立Level-1 的邻居关系 ,使用组播方式发送,地址:0180.C200.0014
Broadcast L2-Hello 用于建立Level-2 的邻居关系 ,使用组播方式发送,地址:0180.C200.0015
P2P Hello:点到点网络的hello报文

LSP(链路状态PDU)类似于OSPF的LSU,分为Level-1、Level-2,用于交换链路状态信息,触发更新或 15分钟周期更新(900秒)

CSNP(完全序列号数据包)类似于OSPF的DD报文,分为Level-1、Level-2,包括LSDB中所有LSP的摘要信息,从而可以在相邻路由器间保持LSDB的同步。在广播网络上,CSNP由DIS定期发送(缺省的发送周期为10秒);在点到点链路上,CSNP只在第一次建立邻接关系时发送。

PSNP(部分序列号数据包)类似于OSPF的LSRequest或LSAck报文,分为Level-1、Level-2,只列举最近收到的一个或多个LSP的序号,它能够一次对多个LSP进行确认,当发现LSDB不同步时,也用PSNP来请求邻居发送新的LSP

二、网络和邻居建立:
两台运行IS-IS的路由器在交互协议报文实现路由功能之前必须首先建立邻居关系。在不同类型的网络上,IS-IS的邻居建立方式并不相同。
A、邻居建立前置条件:
1、不同网络建立:
广播网络:采用的是可靠的邻接建立过程,即三次握手。如果在接收的IIH报文中看到了自己接口的MAC地址,说明邻接已经收到并确认了自己发送的IIH报文。那么本地维护邻居的状态变为UP状态。
如下图:RTA发送IIH报文,报文中包含自己的系统ID,邻居状态为:null(不知道邻居是谁),RTB接收到了报文之后,发现RTA发送过来的报文里面没有自己的系统ID,RTB进入initialized(初始化状态),然后给RTA发送自己IIH报文,里面包含了自己的系统ID,并宣告邻居是RTA,RTA收到之后进入UP状态,并回复IIH报文,RTB收到之后进入UP状态,此时邻居关系建立完成。然后进行DIS选举。
只有收到邻居发过来的Hello PDU有自己的system ID才会up,排除了链路单通的风险。

点到点网络:可分为 2次握手 及 3 次握手 二种。
2Way是属于两次握手,没有可靠性保证。只要收到邻接发送的IIH报文,并检测通过,维护邻居的状态为UP状态。
3Way是属于三次握手,在点到点网络中使用3way的方式保证邻接建立的可靠性。新增一种TLV,点到点邻居状态TLV。
两次握手机制存在明显的缺陷。当路由器间存在两条及以上的链路时,如果某条链路上到达对端的单向状态为Down,而另一条链路同方向的状态为Up,路由器之间还是能建立起邻接关系

2、建立条件:
只有同一层次的相邻路由器才有可能成为邻居。
对于Level-1路由器来说,区域号必须一致。类似于OSPF中的router id
链路两端IS-IS接口的网络类型必须一致。ISIS只支持两种网络类型 P2P 和broadcast
链路两端IS-IS接口的地址必须处于同一网段。非同一个子网,不可以建立邻居关系
相连路由器的接口MTU值必须一致,PPP链路接口MTU值为1500,以太网链路MTU值为1497
由于IS-IS是直接运行在数据链路层上的协议,并且最早设计是给CLNP使用的,IS-IS邻居关系的形成与IP地址无关。但在实际的实现中,由于只在IP上运行IS-IS,所以是要检查对方的IP地址的。如果接口配置了从IP,那么只要双方有某个IP(主IP或者从IP)在同一网段,就能建立邻居,不一定要主IP相同。
当链路两端IS-IS接口的地址不在同一网段时,如果配置接口对接收的Hello报文不作IP地址检查,也可以建立邻居关系。对于P2P接口,可以配置接口忽略IP地址检查;对于以太网接口,需要将以太网接口模拟成P2P接口,然后才可以配置接口忽略IP地址检查。
3、DIS(指定中间系统):
DIS(Designated IS):指定中间系统。又叫虚节点。伪节点是指在广播网络中由DIS创建的虚拟路由器。DIS 负责:
生成并泛洪 伪节点 LSP(pseudonode LSP),描述 LAN 上的拓扑,减少 LSP 数量。
在 LAN 上担任 LSP 泛洪的“协调者”。
在广播网络,需要选举DIS,所以在邻居关系建立后,路由器会等待两个Hello报文间隔再进行DIS的选举。选举依据:
Hello报文中包含Priority 字段,Priority值最大的将被选举为该广播网的DIS,默认缺省值为64(0 表示永远不参与选举),值越大越高。若优先级相同,接口MAC地址较大的被选举为DIS。

IS-IS中DIS发送Hello时间间隔默认为10/3秒,而其他非DIS路由器发送Hello间隔为10秒。选举等待时间:DIS选举时间只有两个HELLO报文间隔,时间短,所以不需要备份。而OSPF的DR选举间隔为40S,时间长,重新选举造成网络瘫痪时间多长,所以有BDR的存在。
DIS 与 DR 核心异同总结表
B、LSDB 同步过程:。
1、LSP 产生原因:
IS-IS路由域内的所有路由设备都会产生LSP,以下事件会触发一个新的LSP:
邻居Up或Down
IS-IS相关接口Up或Down
引入的IP路由发生变化
区域间的IP路由发生变化
接口被赋了新的Cost值
周期性更新
收到邻居新的LSP的处理过程:
将接收的新的LSP合入到自己的LSDB数据库中,并标记为flooding。
发送新的LSP到除了收到该LSP的接口之外的接口。
邻居再扩散到其他邻居。
LSP的”泛洪”:
LSP报文的“泛洪”(flooding)是指当一个路由器向相邻路由器通告自己的LSP后,相邻路由器再将同样的LSP报文传送到除发送该LSP的路由器外的其它邻居,并这样逐级将LSP传送到整个层次内所有路由器的一种方式。通过这种“泛洪”,整个层次内的每一个路由器就都可以拥有相同的LSP信息,并保持LSDB的同步。
每一个LSP都拥有一个标识自己的4字节的序列号。在路由器启动时所发送的第一个LSP报文中的序列号为1,以后当需要生成新的LSP时,新LSP的序列号在前一个LSP序列号的基础上加1。更高的序列号意味着更新的LSP。
2、P2P网络:

在P2P链路中设备的LSDB更新过程如下:
若收到的LSP比本地的序列号更小,则直接给对方发送本地的LSP,然后等待对方给自己一个PSNP报文作为确认;若收到的LSP比本地的序列号更大,则将这个新的LSP存入自己的LSDB,再通过一个PSNP报文来确认收到此LSP,最后再将这个新LSP发送给除了发送该LSP的邻居以外的邻居。
若收到的LSP序列号和本地相同,则比较Remaining Lifetime,若收到的LSP报文的Remaining Lifetime为0,则将收到的LSP存入LSDB中并发送PSNP报文来确认收到此LSP,然后将该LSP发送给除了发送该LSP的邻居以外的邻居;若收到的LSP报文的Remaining Lifetime不为0而本地LSP报文的Remaining Lifetime为0,则直接给对方发送本地的LSP,然后等待对方给自己一个PSNP报文作为确认。
若收到的LSP和本地LSP的序列号相同且Remaining Lifetime都不为0,则比较Checksum,若收到LSP的Checksum大于本地LSP的Checksum,则将收到的LSP存入LSDB中并发送PSNP报文来确认收到此LSP,然后将该LSP发送给除了发送该LSP的邻居以外的邻居;若收到LSP的Checksum小于本地LSP的Checksum,则直接给对方发送本地的LSP,然后等待对方给自己一个PSNP报文作为确认。
若收到的LSP和本地LSP的序列号、Remaining Lifetime和Checksum都相同,则不转发该报文。
3、广播网络:
新加入路由器与DIS同步LSDB数据库的过程:

LSDB更新过程如下:
DIS接收到LSP,在数据库中搜索对应的记录。若没有该LSP,则将其加入数据库,并广播新数据库内容。
若收到的LSP序列号大于本地LSP的序列号,就替换为新报文,并广播新数据库内容;若收到的LSP序列号小本地LSP的序列号,就向入端接口发送本地LSP报文。
若收到的LSP和本地LSP的序列号相等,则比较Remaining Lifetime。若收到的LSP报文的Remaining Lifetime为0,则将本地的报文替换为新报文,并广播新数据库内容;若收到的LSP报文的Remaining Lifetime不为0而本地LSP报文的Remaining Lifetime为0,就向入端接口发送本地LSP报文。
若两个序列号和Remaining Lifetime都相等,则比较Checksum。若收到的LSP的Checksum大于本地LSP的Checksum,就替换为新报文,并广播新数据库内容;若收到的LSP的Checksum小于本地LSP的Checksum,就向入端接口发送本地LSP报文。
若两个序列号、Remaining Lifetime和Checksum都相等,则不转发该报文。
三、相关扩展:
A、认证:
IS-IS认证是基于网络安全性的要求而实现的一种认证手段,通过在IS-IS报文中增加认证字段对报文进行认证。当本地路由器接收到远端路由器发送过来的IS-IS报文,如果发现认证密码不匹配,则将收到的报文进行丢弃,达到自我保护的目的。同时注意 IS-IS为单向认证,未开启认证的一端不会进行检查报文中的认证TLV,而开启认证的一端必须保证认证通过才能接收。
1、认证的分类和类型:
根据报文的种类,认证可以分为以下三类:
接口认证:是指使能IS-IS协议的接口以指定方式和密码对Level-1和Level-2的Hello报文进行认证,认证不成功,无法建立邻居。
区域认证:是指运行IS-IS的区域以指定方式和密码对Level-1的SNP和LSP报文进行认证。Area区域将认证TLV封装在Level-1的SNP和LSP消息中, IS-IS网络中Level-1路由器工作在相同区域内。如果区域认证不通过会导致路由器无法接收相应的Level-1的SNP和LSP消息。不会影响Level-1路由器邻居关系建立但是会导致Level-1的链路状态数据无法同步,从而无法计算路由。
路由域认证:是指运行IS-IS的路由域以指定方式和密码对Level-2的SNP和LSP报文进行认证。域认证将认证TLV封装在Level-2的SNP和LSP消息中, IS-IS网络中所有Level-2路由器组成了骨干网络。如果域认证不通过会导致路由器无法接收相应Level-2的SNP和LSP消息。不会影响Level-2路由器邻居关系建立但是会导致Level-2的链路状态数据无法同步,从而无法计算路由。
根据报文的认证方式,可以分为以下三类:
明文认证:一种简单的认证方式,将配置的密码直接加入报文中,这种认证方式安全性不够。
MD5认证:通过将配置的密码进行MD5算法之后再加入报文中,这样提高了密码的安全性。
Keychian认证:通过配置随时间变化的密码链表来进一步提升网络的安全性。
2、认证设置:
对于接口认证,有以下两种设置:
发送带认证TLV的认证报文,本地对收到的报文也进行认证检查。
发送带认证TLV的认证报文,但是本地对收到的报文不进行认证检查。
对于区域和路由域认证,可以设置为SNP和LSP分开认证。
本地发送的LSP报文和SNP报文都携带认证TLV,对收到的LSP报文和SNP报文都进行认证检查。
本地发送的LSP报文携带认证TLV,对收到的LSP报文进行认证检查;发送的SNP报文携带认证TLV,但不对收到的SNP报文进行检查。
本地发送的LSP报文携带认证TLV,对收到的LSP报文进行认证检查;发送的SNP报文不携带认证TLV,也不对收到的SNP报文进行认证检查。
本地发送的LSP报文和SNP报文都携带认证TLV,对收到的LSP报文和SNP报文都不进行认证检查。
3、认证信息的携带形式:
IS-IS通过TLV的形式携带认证信息,认证TLV的类型为10,具体格式如下:
Type:ISO定义认证报文的类型值为10,长度为1字节。
Length:指定认证TLV值的长度,长度1字节。
Value:指定认证的具体内容,其中包括了认证的类型和认证的密码,长度为1~254字节。
其中认证的类型为1字节,具体定义如下:
0:保留的类型
1:明文认证
54:MD5认证
255:路由域私有认证方式
B、路由渗透:
通常情况下,Level-1区域内的路由通过Level-1路由器进行管理。所有的Level-2和Level-1-2路由器构成一个连续的骨干区域。Level-1区域必须且只能与骨干区域相连,不同的Level-1区域之间并不相连。
Level-1-2路由器将学习到的Level-1路由信息装进Level-2 LSP,再泛洪LSP给其他Level-2和Level-1-2路由器。因此,Level-1-2和Level-2路由器知道整个IS-IS路由域的路由信息。但是,为了有效减小路由表的规模,在缺省情况下,Level-1-2路由器并不将自己知道的其他Level-1区域以及骨干区域的路由信息通报给它所在的Level-1区域。这样,Level-1路由器将不了解本区域以外的路由信息,可能导致与本区域之外的目的地址通信时无法选择最佳的路由。

如上图所示,当RTA学习到达10.0.0.1/24网络的路由以后,对应整个链路的开销就很明了,所以RTA和10.0.0.1/24网络通信就会根据链路开销进行选路,而不会再走默认路由,从而避免了次优路径;
为解决上述问题,IS-IS提供了路由渗透功能。通过在Level-1-2路由器上定义ACL(Access Control List)、路由策略、Tag标记等方式,将符合条件的路由筛选出来,实现将其他Level-1区域和骨干区域的部分路由信息通报给自己所在的Level-1区域。
C、开销计算:
在IS-IS协议中,cost 被称为 metric,用于表示路径的开销。协议规定:路径总开销 = 路径中所有链路开销之和,路由选择时优先选择 “总开销最小” 的路径。IS-IS开销类型有三种,分别是接口开销、全局开销和自动计算开销;其优先级顺序为接口开销>全局开销>自动计算开销;
所谓接口开销是指为单个接口设置开销,生效范围是单个接口;
全局开销是为所有接口设置开销,生效范围是所有接口;
自动计算开销是是指根据接口带宽自动计算开销;
对于IS-IS来讲开销取值类型主要分两种,分别是narrow和wide;narrow取值范围是1-63;wide取值为1-16777215;缺省的开销类型是narrow;缺省情况下,华为接口开销为10。

宽度量模式下,华为、H3C 等厂商设备默认按链路带宽自动分配开销,核心映射关系如下(非绝对标准,可手动修改):
D、路由聚合:
路由聚合又称路由汇总,从字面理解就是把多个明细路由聚合(汇总)为一条路由;我们知道在ospf里路由汇总是优化LSDB、路由表的一种手段;在ospf中路由的汇聚只能在abr或asbr上进行汇总;而对于IS-IS来讲,汇总路由是只可以在本地生成LSP的路由器上做,主要作用是优化路由表;
在IS-IS 网络中,level-1路由器只维护level-1链路状态数据库,只能对相应的level-1的直连路由进行聚合,并将聚合后的路由以level-1 LSP 的形式发送给其他路由。level-2路由器只维护 level-2 链路状态数据库,只能对相应的 level-2的直连路由进行聚合,并将聚合后的路由以 level-2 LSP 的形式发送给其他路由。
路由聚合总结如下:
在L1 L2 路由器上执行路由聚合,只会聚合本地的之链路由,对其他非直连的路由无效。
L1L2路由器上执行路由聚合,类似与ospf的ABR聚合,一般会汇聚成L1L2LSP风别产生给骨干和非骨干区域。
在ABSR对引入的路由进行汇总,会在自身的叶子节点描述。
汇总路由继承明细中COST值最小的
汇总的路由当成自身叶子节点在LSP中描述。
所有明细失效后,聚合路由才会失效
summary 1.1.1.1 255.0.0.0 avoid-feedback 防止环路,对发出的汇总不在接收
summary 1.1.1.1 255.0.0.0 generate_null0_route 生成一条黑洞路由防止环路