在IS-IS出现前,网络上广泛使用RIP(Routing Information Protocol)作为内部网关协议。由于RIP是基于距离矢量算法的路由协议,存在着收敛慢、路由环路、可扩展性差等问题,所以逐渐被IS-IS取代。IS-IS存在如下优势:
- IS-IS报文中采用TLV格式,扩展性很高;
- 一个路由器最多可配置多个区域地址,可以实现多区域的平滑合并;
- 报文结构简单,邻居交互效率高;
- 由于IS-IS工作在数据链路层,因此不依赖IP地址;
- 采用最短路径SPF算法,收敛速度快。
- 可应用于规模较大的网络中。如大型ISP(Internet Service Provider)中。
2.1 IS-IS路由器分类
为了支持大规模的路由网络,IS-IS在路由域内采用两级的分层结构,即一个大的Domain(域)可以被分为多个Areas(区域)。IS-IS网络中三种不同级别的路由设备:一般来说,将Level-1路由设备部署在区域内,Level-2路由设备部署在区域间,Level-1-2路由设备部署在Level-1和Level-2路由设备的中间。如下图所示,一个运行IS-IS协议的网络,整个骨干区域(backbone)不仅包括Area1中的所有Level-2路由设备,还包括其他区域的Level-1-2路由设备。
Level-1路由器
Level-1路由器负责区域内的路由,它只与属于同一区域的Level-1和Level-1-2路由器形成邻居关系。一个Level-1路由器只负责维护本区域内的LSDB(Link State Database,链路状态数据库),对于目的地不在本区域内的路由,Level-1路由器会将该路由的目的地标识为最近的Level-1-2路由器。
Level-2路由器
Level-2路由器负责区域间的路由,可以与Level-2或其它区域的Level-1-2路由器形成邻居关系,维护一个Level-2的LSDB,该LSDB包含区域间的路由信息。
所有Level-2级别的路由器组成路由域的骨干网,负责在不同区域间通信,路由域中Level-2级别的路由器必须是连续的,以保证骨干网的连续性。只有Level-2级别的路由器才能直接与区域外的路由器交换数据报文或路由信息。
Level-1-2路由器
同时属于Level-1和Level-2的路由器称为Level-1-2路由器,可以与同一区域的Level-1和Level-1-2路由器形成Level-1邻居关系,也可以与其他区域的Level-2和Level-1-2路由器形成Level-2的邻居关系。Level-1路由器必须通过Level-1-2路由器才能连接至其他区域。
Level-1-2路由器维护两个LSDB,Level-1的LSDB用于区域内路由,Level-2的LSDB用于区域间路由。
2.2 IS-IS的网络类型与网络链路关系
IS-IS可以运行在广播链路和点到点链路上,广播链路包括Ethernet、Token-Ring等;点到点链路如PPP。
IS-IS包括两种网络类型:广播网络类型和P2P网络类型(如下图所示)。广播链路可以配置成广播网络类型也可以配置成P2P网络类型,点到点链路仅支持P2P网络类型。
2.3 IS-IS的报文类型
IS-IS报文有以下几种类型:Hello PDU(Protocol Data Unit)、LSP和SNP。
Hello PDU
Hello报文用于建立和维持邻居关系,也称为IIH(IS-to-IS Hello PDUs)。其中,广播网中的Level-1 IS-IS使用Level-1 LAN IIH;广播网中的Level-2 IS-IS使用Level-2 LAN IIH;非广播网络中则使用P2P IIH。它们的报文格式有所不同。P2P IIH中相对于LAN IIH来说,多了一个表示本地链路ID的Local Circuit ID字段,缺少了表示广播网中DIS的优先级的Priority字段以及表示DIS和伪节点System ID的LAN ID字段。
广播网Hello:广播网中的Hello报文格式如下图所示。
P2P Hello:P2P网络中的Hello报文格式如下图所示。
Intradomain Routing Protocol Discriminator:域内路由选择协议鉴别符,用来标识网络层协议数据单元。在IS-IS中,该字段的值固定为0x83。
Length Indicator:长度标识符,用来标识该固定头部的长度。
ID Length:用来标识该路由选择域内SystemID的长度。
PDU Type:用来标识PDU的类型。
Maximum Area Address:最大区域地址数,表示该IS-IS区域所允许的最大区域地址数量。目前,该字段固定为0,表示最多支持3个区域地址。
TLV:即Type/Length/Value(类型/长度/值),不同PDU类型所包含的TLV是不同的。
LSP
链路状态报文LSP(Link State PDUs)用于交换链路状态信息。LSP分为两种:Level-1 LSP和Level-2 LSP。Level-1 LSP由Level-1 IS-IS传送,Level-2 LSP由Level-2 IS-IS传送,Level-1-2 IS-IS则可传送以上两种LSP。
两类LSP有相同的报文格式,如下图所示。
主要字段的解释如下:
ATT(Attached):区域关联位。
由Level-1-2路由器产生,用来指明始发路由器是否与其它区域相连。当L1区域中的路由器收到Level-1-2路由器发送的ATT位被置位的L1 LSP后,它将创建一条指向Level-1-2路由器的缺省路由,以便数据可以被路由到其他区域。
虽然ATT位同时在L1 LSP和L2 LSP中进行了定义,但是它只会在L1 LSP中被置位,并且只有L1/2路由器会设置这个字段。
OL(LSDB Overload):过载标志位。
设置了过载标志位的LSP虽然还会在网络中扩散,但是在计算通过过载路由器的路由时不会被采用。即对路由器设置过载位后,其它路由器在进行SPF计算时不会使用这台路由器做转发,只计算该节点上的直连路由。
IS Type:生成LSP的IS-IS类型。
用来指明是Level-1还是Level-2 IS-IS(01表示Level-1,11表示Level-2)。
SNP
序列号报文SNP(Sequence Number PDUs)通过描述全部或部分LSP的摘要信息来同步各LSDB(Link-State DataBase),它包括CSNP(Complete Sequence Number Protocol Data Unit,全序列号协议数据单元)和PSNP(Partial Sequence Number Protocol Data Unit,部分序列号协议数据单元)。CSNP包括LSDB中所有LSP的摘要信息,从而可以在相邻路由设备间保持LSDB的同步。
在广播网链路和点到点链路中,SNP运行机制略有不同:
在广播网链路上,CSNP由DIS设备周期性的发送。当邻居发现LSDB不同步时,发送PSNP报文来请求缺失的LSP报文。
在点到点链路上,CSNP只在第一次建立邻居关系时发送,邻居发送PSNP报文来做应答。当邻居发现LSDB不同步时,同样发送PSNP报文来请求缺失的LSP报文。
3.1 邻居关系建立
两台运行IS-IS的路由设备在交互协议报文实现路由功能之前必须首先建立邻居关系。在不同类型的网络上,IS-IS的邻居建立方式并不相同。
广播链路邻居关系的建立
如下图所示以Level-2路由设备为例,描述了广播链路中建立邻居关系的过程。Level-1路由设备之间建立邻居与此相同。
DeviceA广播发送Level-2 LAN IIH,此报文中无邻居标识。
DeviceB收到此报文后,将自己和DeviceA的邻居状态标识为Initial。然后,DeviceB再向DeviceA回复Level-2 LAN IIH,此报文中标识DeviceA为DeviceB的邻居。
DeviceA收到此报文后,将自己与DeviceB的邻居状态标识为Up。然后DeviceA再向DeviceB发送一个标识DeviceB为DeviceA邻居的Level-2 LAN IIH。
DeviceB收到此报文后,将自己与DeviceA的邻居状态标识为Up。这样,两个路由设备成功建立了邻居关系。
因为是广播网络,需要选举DIS,所以在邻居关系建立后,路由设备会等待两个Hello报文间隔,再进行DIS的选举。Hello报文中包含Priority字段,Priority值最大的将被选举为该广播网的DIS。若优先级相同,接口MAC地址较大的被选举为DIS。
P2P链路邻居关系的建立
在P2P链路上,邻居关系的建立不同于广播链路。分为两次握手机制和三次握手机制。
两次握手机制:只要路由设备收到对端发来的Hello报文,就单方面宣布邻居为Up状态,建立邻居关系。
三次握手机制:此方式通过三次发送P2P的IS-IS Hello PDU最终建立起邻居关系,类似广播邻居关系的建立。
两次握手机制存在明显的缺陷。当路由设备间存在两条及以上的链路时,如果某条链路上到达对端的单向状态为Down,而另一条链路同方向的状态为Up,路由设备之间还是能建立起邻居关系。SPF在计算时会使用状态为UP的链路上的参数,这就导致没有检测到故障的路由设备在转发报文时仍然试图通过状态为Down的链路。三次握手机制解决了上述不可靠点到点链路中存在的问题。这种方式下,路由设备只有在知道邻居路由设备也接收到它的报文时,才宣布邻居路由设备处于Up状态,从而建立邻居关系。
4.1 LSP产生的原因
IS-IS路由域内的所有路由设备都会产生LSP,以下事件会触发一个新的LSP:
- 邻居Up或Down
- IS-IS相关接口Up或Down
- 引入的IP路由发生变化
- 区域间的IP路由发生变化
- 接口被赋了新的Cost值
- 周期性更新
4.2 收到邻居新的LSP的处理过程
- 将接收的新的LSP合入到自己的LSDB数据库中,并标记泛洪标记。
- 本端设备泛洪新的LSP到除了收到该LSP的接口之外的接口。
- 邻居再扩散到其他邻居。
4.3 LSP的泛洪
LSP报文的泛洪(flooding)是指当一个路由设备向相邻路由设备通告自己的LSP后,相邻路由设备再将同样的LSP报文传送到除发送该LSP的路由设备外的其他邻居,并这样逐级将LSP传送到整个层次内所有路由设备的一种方式。通过这种“泛洪”,整个层次内的每一个路由设备就都可以拥有相同的LSP信息,并保持LSDB的同步。
每一个LSP都拥有一个标识自己的4字节的序列号。在路由设备启动时所发送的第一个LSP报文中的序列号为1,以后当需要生成新的LSP时,新LSP的序列号在前一个LSP序列号的基础上加1。更高的序列号意味着更新的LSP。
4.4 广播链路上LSDB同步
DIS和伪节点
在广播网络中,IS-IS需要在所有的路由设备中选举一个路由设备作为DIS(Designated Intermediate System)。DIS用来创建和更新伪节点(Pseudo node),并负责生成伪节点的链路状态协议数据单元LSP(Link state Protocol Data Unit),用来描述这个网络上有哪些网络设备。
伪节点是用来模拟广播网络的一个虚拟节点,并非真实的路由设备。在IS-IS中,伪节点用DIS的System ID和一个字节的Circuit ID(非0值)标识。
如下图所示,使用伪节点可以简化网络拓扑,使路由设备产生的LSP长度较小。另外,当网络发生变化时,需要产生的LSP数量也会较少,减少SPF的资源消耗。
广播链路中新加入路由设备与DIS同步LSDB数据库的过程
如下图所示,新加入的路由设备DeviceC首先发送Hello报文,与该广播域中的路由设备DeviceA和DeviceB建立邻居关系,邻居关系建立之后,DeviceC等待LSP刷新定时器超时,然后将自己的LSP发往邻居设备,这样网络上所有的邻居都将收到该LSP。
该网段中的DIS会把收到DeviceC的LSP加入到LSDB中,等待CSNP报文定时器超时,然后发送CSNP报文,进行该网络内的LSDB同步。
DeviceC收到DIS发来的CSNP报文,对比自己的LSDB数据库,然后向DIS发送PSNP报文请求自己没有的LSP。
DIS收到该PSNP报文请求后向DeviceC发送对应的LSP进行LSDB的同步。
在上述过程中DIS的LSDB更新过程如下:
DIS接收到LSP,在数据库中搜索对应的记录。若没有该LSP,则将其加入数据库,并广播新数据库内容。
若收到的LSP序列号大于本地LSP的序列号,就替换为新报文,并广播新数据库内容;若收到的LSP序列号小本地LSP的序列号,就向入端接口发送本地LSP报文。
若两个序列号相等,则比较Remaining Lifetime。若收到的LSP的Remaining Lifetime小于本地LSP的Remaining Lifetime,就替换为新报文,并广播新数据库内容;若收到的LSP的Remaining Lifetime大于本地LSP的Remaining Lifetime,就向入端接口发送本地LSP报文。
若两个序列号和Remaining Lifetime都相等,则比较Checksum。若收到的LSP的Checksum大于本地LSP的Checksum,就替换为新报文,并广播新数据库内容;若收到的LSP的Checksum小于本地LSP的Checksum,就向入端接口发送本地LSP报文。
若两个序列号、Remaining Lifetime和Checksum都相等,则不转发该报文。
选举DIS
在广播网中,任意两台路由器之间都要传递信息。如果网络中有n台路由器,则需要建立n*(n-1)/2个邻接关系。这使得任何一台路由器的状态变化都会导致多次传递,浪费了带宽资源。为解决这一问题,IS-IS协议定义了DIS,所有路由器都只将信息发送给DIS,由DIS将网络链路状态广播出去。使用DIS和伪节点可以简化网络拓扑,使路由器产生的LSP报文长度较小。另外,当网络发生变化时,需要产生的LSP数量也会较少,减少SPF的资源消耗。
DIS选举发生在邻居关系建立后,Level-1和Level-2区域的DIS是分别选举的,用户可以为不同级别的DIS选举设置不同的优先级。IS-IS协议选举DIS的过程是每一台路由器接口都被指定一个L1类型的优先级和L2类型的优先级,路由器通过其每一个接口发送Hello数据包,并在Hello数据包中通告它的优先级。DIS优先级数值最大的被选为DIS。如果优先级数值最大的路由器有多台,则其中MAC地址最大的路由器会被选中。不同级别的DIS可以是同一台路由器,也可以是不同的路由器。
在选举DIS过程中,IS-IS协议与OSPF协议的不同点是:
- 优先级为0的路由器也参与DIS的选举;
- 当有新的路由器加入,并符合成为DIS的条件时,这个路由器会被选中成为新的DIS,此更改会引起一组新的LSP泛洪。
P2P链路上LSDB同步
两台设备建立P2P邻居关系之后,先互相发送CSNP报文。如果对端的LSDB与CSNP没有同步,则发送PSNP请求索取相应的LSP。
如下图所示假定DeviceB向DeviceA索取相应的LSP。DeviceA发送DeviceB请求的LSP的同时启动LSP重传定时器,并等待DeviceB发送的PSNP作为收到LSP的确认。
如果在接口LSP重传定时器超时后,DeviceA还没有收到DeviceB发送的PSNP报文作为应答,则重新发送该LSP直至收到PSNP报文。
IS-IS采用SPF(Shortest Path First)算法计算路由,可以达到路由快速收敛的目的。
IS-IS协议使用链路状态通告LSA描述网路拓扑,即有向图。Router LSA描述设备之间的链接和链路的属性。设备将LSDB转换成一张带权的有向图,这张图便是对整个网络拓扑结构的真实反映。各个设备得到的有向图是完全相同的。如下图所示。
每台设备根据有向图,使用SPF算法计算出一棵以自己为根的最短路径树,这棵树给出了到自治系统中各节点的路由。如下图最小生成树所示。
当OSPF的链路状态数据库LSDB发生改变时,需要重新计算最短路径,如果每次改变都立即计算最短路径,将占用大量资源,并会影响设备的效率,通过调节SPF的计算间隔时间,可以抑制由于网络频繁变化带来的占用过多资源。缺省情况下,SPF时间间隔为5秒钟。
具体的计算过程如下:
【1】计算区域内路由。
Router LSA和Network LSA可以精确的描述出整个区域内部的网络拓扑,根据SPF算法,可以计算出到各个设备的最短路径。根据Router LSA描述的与设备的网段情况,得到了到达各个网段的具体路径。
【2】计算区域外路由。
从一个区域内部看,相邻区域的路由对应的网段好像是直接连接在ABR上,而到ABR的最短路径已经在上一过程中计算完毕,所以直接检查Network Summary LSA,就可以很容易得到这些网段的最短路径。另外,ASBR也可以看成是连接在ABR上,所以ASBR的最短路径也可以在这个阶段计算出来。
【3】计算自治系统外路由。
由于自治系统外部的路由可以看成是直接连接在ASBR上,而到ASBR的最短路径在上一过程中已经计算完毕,所以逐条检查AS External LSA就可以得到到达各个外部网络的最短路径。
6.1 IS-IS for IPv6
IETF的标准协议中规定了IS-IS为支持IPv6所新增的内容,通过新增支持IPv6路由信息的两个TLV(Type-Length-Values)和一个新的NLPID(Network Layer Protocol Identifier),使IS-IS支持IPv6路由的处理和计算。
新增的两个TLV分别是:
IPv6 Reachability
类型值为236(0xEC),通过定义路由信息前缀、度量值等信息来说明网络的可达性。
IPv6 Interface Address
类型值为232(0xE8),它相当于IPv4中的“IP Interface Address”TLV,只不过把原来的32比特的IPv4地址改为128比特的IPv6地址。
NLPID是标识网络层协议报文的一个8比特字段,IPv6的NLPID值为142(0x8E)。如果IS-IS支持IPv6,则向外发布IPv6路由时必须携带NLPID值。
6.2 IS-IS for SR-MPLS
段路由SR(Segment Routing)是基于源路由理念而设计的在网络上转发数据包的一种协议。Segment Routing MPLS是指基于MPLS转发平面的Segment Routing,简称为Segment Routing。Segment Routing将网络路径分成一个个段,并且为这些段和网络中的转发节点分配段标识ID。通过对段和网络节点进行有序排列(Segment List),就可以得到一条转发路径。
Segment Routing将代表转发路径的段序列编码在数据包头部,随数据包传输。接收端收到数据包后,对段序列进行解析,如果段序列的顶部段标识是本节点时,则弹出该标识,然后进行下一步处理;如果不是本节点,则使用ECMP(Equal Cost Multiple Path)方式将数据包转发到下一节点。
SR-MPLS使用IGP协议进行拓扑信息、前缀信息、SRGB和标签信息的通告。IS-IS协议为了完成上述功能,对于协议报文的TLV进行了一些扩展。IS-IS协议主要针对SID和网元SR-MPLS能力的子TLV(Sub-TLV)进行了一些扩展。
携带SR信息的IS-IS LSP报文格式如下图所示:
Prefix-SID Sub-TLV:用于通告SR-MPLS的Prefix SID。
Adj-SID Sub-TLV:用于在P2P网络中通告SR-MPLS的Adjacency SID。
LAN-Adj-SID Sub-TLV:用于在LAN网络中通告SR-MPLS的Adjacency SID。
SID/Label Sub-TLV:用于通告SR-MPLS的SID或MPLS Label。
SID/Label Binding TLV:用于通告前缀到SID的映射。
SR-Capabilities Sub-TLV:用于对外通告自己的SR-MPLS能力。
SR Local Block Sub-TLV:用于通告网元为本地SID预留的标签范围。
6.3 IS-IS for SRv6
SRv6(Segment Routing IPv6,基于IPv6转发平面的段路由)是基于源路由理念而设计的在网络上转发IPv6数据包的一种协议。SRv6通过在IPv6报文中插入一个路由扩展头SRH(Segment Routing Header),在SRH中压入一个显式的IPv6地址栈,并由中间节点不断的进行更新目的地址和偏移地址栈的操作来完成逐跳转发。
SR使用IGP协议进行拓扑信息、前缀信息、Locator和SID信息的通告。IS-IS协议为了完成上述功能,对于协议报文的TLV进行了一些扩展。
携带SRv6信息的IS-IS LSP报文格式如下图所示:
SRv6 Locator TLV:用于通告SRv6的Locator以及该Locator相关的End SID。
SRv6 Capabilities sub-TLV:用于通告SRv6能力。
SRv6 End SID sub-TLV:用于通告SRv6的SID。
SRv6 End.X SID sub-TLV:用于在P2P网络中通告SRv6的SID。
SRv6 LAN End.X SID sub-TLV:用于在LAN网络中通告SRv6的SID。
Node MSD sub-TLV:用于通告设备能够接受的最大SID栈深度MSD(Maximum SID Depth)。
IS-IS与OSPF的区别如下:
协议类型:OSPF使用IP层协议。IS-IS使用链路层协议。
协议扩展性:OSPF通过扩展LSA type应对新的需求,扩展性一般。比如对IPv6的支持,需要新的OSPFv3协议来支持。IS-IS由于本身TLV的报文结构,决定了其超强的扩展性。比如对IPv6的支持,仅需扩展TLV。
适用范围:OSPF应用于规模适中的网络中,最多可支持几百台设备。例如,中小型企业网络。IS-IS应用于规模较大的网络中。例如,大型ISP(Internet Service Provider)中。
路由算法:OSPF采用最短路径SPF(Shortest Path First)算法。通过链路状态通告LSA(Link State Advertisement)描述网络拓扑,依据网络拓扑生成一棵最短路径树SPT(Shortest Path Tree),计算出到网络中所有目的地的最短路径。IS-IS采用最短路径SPF算法。依据网络拓扑生成一棵最短路径树SPT,计算出到网络中所有目的地的最短路径。在IS-IS中,SPF算法分别独立的在Level-1和Level-2数据库中运行。
收敛速度:OSPF与IS-IS收敛速度都比较快,小于1s。
区域划分:OSPF是基于接口划分区域的,IS-IS是基于路由器划分区域的。