概述:
IS-IS协议主要有两大功能:子网依赖功能和子网无关功能。子网依赖功能就是建立和维护邻接关系的功能,而子网无关功能则主要用于执行和管理和管理链路状态信息的交换和路由计算,具体可以分为四个过程。
更新过程。路由决策过程。转发过程。接收过程。
更新过程的任务是泛洪LSP以构建L1和L2的链路状态数据库;一旦建立了链路状态数据库,决策过程就使用数据库的信息去计算一个最短路径树,并计算出最好的路由放进路由表;转发和接收过程分别是指路由器对于LSP的转发和接收。
所以,子网无关功能的核心是链路状态数据库,如果想要精通IS-IS 协议原理,必须要理解链路状态数据库的构建、更新的操作过程。
组成IS-IS链路状态数据库最基本的元素是LSP,叫链路状态报文,它的作用是描述路由器的接口及所连网络的信息,包括接口所连网络的子网、类型、开销等信息。除了LSP报文外,两台邻接的IS-IS路由器在数据库同步过程中,还会用到其他报文,比如PSNP和CSNP,相对于LSP,这两种报文在为实现可靠的数据库同步过程中发挥了很大的作用。
LSP专用报头信息:
PDU长度:是指整个LSP报文的长度。Remaining Lifetime:剩余生存时间,表示LSP到期之前的生存时间。LSP-ID: LSP 的标识号,用于LSP的鉴别。一个完整的LSP-ID是由源路由器的系统ID、伪节点ID和LSP报文编号构成的。Sequence Number: LSP 的序列号,是一个32位的无符号整数。Checksum: 从Sys-ID开始到报文末尾所有字段的校验和。Partition Repair:区域修复位,表示源路由器是否支持区域修复,虽然在L1和L2 LSP中都有这一位,但实际上只有在L2LSP中发挥作用。华为VRP系统目前不支持该功能,始终设置为0。Attachment:区域关联位,用于表明源路由器是否与多个区域相连。L1/2 路由器连接了多个区域,所以会在它的L1 LSP 中设置该位为1。L1路由器利用该位来判断本区域的L1/2 路由器。它下面的四个比特位表示所连区域的度量类型,从左到右依次表示: (第7位:差错度量;第6位:代价度量;第5位:时延度量;第4位:缺省度量)。OverloadBit:链路状态数据库的超载位,超载时表明始发路由器的内存和CPU资源已经严重不足。IS Type:路由器类型,用于表明LSP源路由器是L1路由器还是L2路由器。IS-IS链路状态数据库:
由上面的输出信息中可以看到,该路由器为L1/2路由器,因为有两张独立放置的数据库(L1和L2)。数据库中的每一行代表了一个LSP,表示每一个LSP显示了以下信息:LSPID、LSP序列号、LSP校验和、LSP剩余生存时间、LSP 长度、区域关联位、区域修复位和数据库过载位。LSPID 之后的星号*表示该LSP是本地路由器生成的。
一、LSP ID:
LSP ID用来在链路状态数据库中唯一标识一条LSP,使接收路由器能区别出每条不同的LSP及其始发源路由器。如上图所示,LSP ID总长8Byte。前6Byte表示始发路由器的系统ID,在系统ID之后的1个字节表示伪节点ID。如果这个字节值是零,表示LSP是由普通路由器发出的;如果是非零,则表示LSP是由DIS发出的。比如上例中LSP ID为000.0000.0002.01-00和00.0000.0004.01-00的两条LSP都是由相应广播网络
中的DIS产生的。前文中提到过,由系统ID+伪节点ID起构成了LAN ID。
LSP ID最后的1Byte表示LSP编号。因为IS-IS协议的LSP只有L1和L2两类,所以不论是在L1区域,还是在L2区域,一台路由器会把本区域的所有路由信息都放在一条LSP传送。如果路由信息很多,会导致LSP报文很大以至于超过了发出接口的MTU值,这时需要分段处理,也就是将路由信息放在不同分段的LSP传送。LSP第一个分段的编号为0,第二个分段的编号为1,以此类推,一共可以有2*8=256编号。如果某些分段在传递过程中丢失了,那么接收端路由器也会放弃所有其他分段,导致该LSP的所有分段都必须重传,造成带宽的浪费。LSP ID由一段数字组成,可读性不强,为使管理员更容易、直观地区别不同的LSP,可以使用主机名映射功能,也就是使用始发路由器的主机名来替代系统ID。
动态主机名映射功能是指以类型137的TLV将自己的主机名随LSP发布到网络中,这个TLV是可选的,在其他IS-IS路由器上可以通过命令看到本地System-ID直接被主机名所替代。动态主机名的TLV是可选的,它可以存在于LSP中的任何位置。其中,TLV的value值不能为空。设备在发送LSP的时候可以决定是否携带该TLV,接收端的设备也可以决定是否忽略该TLV,或者提取该TLV的内容放在自己的映射表中。静态主机名映射是指在本地设备上对其他运行IS-IS 协议的设备设置主机名与System-ID的映射。静态主机名映射仅在本地设备生效,并不会通过LSP 报文发送出去。在IS-IS进程下使用is-name命令指定主机名就可以了。下例显示了使用了动态主机名映射后的显示结果,这里只输出了L1的数据库信息。
静态主机名映射是指在本地设备上对其他运行IS-IS 协议的设备设置主机名与System-ID的映射。静态主机名映射仅在本地设备生效,并不会通过LSP报文发送出去。
华为设备在IS-IS进程下使用is-name命令指定主机名就可以了。下例显示了使用了动态主机名映射后的显示结果,这里只输出了L1的数据库信息:
二、LSP序列号:
LSP序列号用来表示被刷新的次数,是一个4Byte长的无符号整数,从0开始计数,但是一台路由器启动IS-IS进程后,第一次生成LSP序列号是1,以后LSP每刷新(重新生成)一一次,序列号加1,最大值为232-1。通过LSP序列号,可以判断一条LSP的新旧。
如图所示,路由器在接收到LSP后,会跟本地链路状态数据库作比较。如果本地链路状态数据库没有此LSP,则直接将其放进数据库,并且泛洪此LSP到区域中。
如果数据库中已经有了这个LSP,则比较新收到的LSP和本地数据库中已有的LSP序列号,如果新收到的LSP序列号大于数据库已有的,则用这个新的LSP替换掉数据库原有的LSP,并产生新的LSP泛洪到区域中;如果本地数据库中的LSP序列号更大,则忽略掉新到的LSP,并向接收端口发送自己的LSP;如果新到的LSP和本地数据库中的LSP序列号-样,则忽略新到的LSP,不做任何操作。
前面提到,LSP的序列号只有4Byte长,它的最大值为232-1=4294967295,读者一定会担心,如果哪一天LSP的序列号用完了(超出范围)怎么办?这里我们假设路由器使用最小的LSP刷新间隔(30s) 来不断生成新的LSP,那么用完整个序列号空间所使用的时间就是(4294967295x30)s,按年来计算就是(429496729530) / (36524x3600),这个值大约是4085,也就是说即,使路由器每30s不停地产生LSP,要花上4085年才能耗完序列号。
关于LSP的序列号,这里有两种情况需要注意:
如果一台路由器发生故障而没有向其他路由器清除它的LSP(序列号已经大于1),等到这台路由器从故障中恢复后它会重新产生序列号为1的LSP,其他路由器接收到这条LSP后会忽略,导致路由无法及时更新。解决的办法是在其他路由器接收到这条序列号为1的LSP后,会立刻将本地数据库中的LSP拷贝一份扩散出来,这台路由器接收到后会产生一条序列号比原来LSP还要大1的新的LSP,保证了路由器故障前后生成的LSP的序列号的连续性。
当LSP的序列号到达最大值时,这台路由器的IS-IS 进程会停止一段时间,这个时间=LSP最大生存时间+零生存时间,直到这条LSP在网络中其他路由器的数据库被老化并且清除。接着,路由器重新启动,启动完成后会生成一条序列号为1的新的LSP。
三、LSP校验和:
校验和用来在接收端路由器上进行完整性检查,确保LSP在传送过程没有被损坏。校验和的结果是利用校验和算法根据LSP中剩余生存时间字段之后到报文最后的内容计算出来的,这个值会在LSP始发路由器计算一次,然后将结果放在校验和字段中。
LSP的接收路由器也会根据同样的算法和内容计算出一个校验和的值,用这个值和收到的校验和值进行比较,如果一致,则说明报文是完整的,将其存放进数据库,然后实行路由计算:如果校验和不一致,则说明LSP在传送的过程中被损坏了,接收端路由器会将这条LSP的剩余生存时间重置为0,然后从数据库中清除该LSP,被损坏的LSP是不能参与路由计算的。
四、LSP剩余生存时间:
在ISO10589中规定IS-IS的LSP最大生存时间为1200s, 华为设备可以通过timer Lsp-max-age命令设置LSP的最大生存年龄,最大可以配置到65535s。始发路由器产生LSP时,会将剩余生成时间设置到最大年龄值,然后泛洪到区域中,这条LSP被存储在数据库中,并且它的剩余生成时间会随着时间的推移而逐渐减少,如果没有及时得到刷新,这条LSP的剩余生存时间减少到0时会从数据库中清除。
IS-IS和OSPF一样,也有周期性的刷新,IS-IS 的刷新间隔时间为900s,华为系统可以通过timter lsp-refresh 命令修改刷新间隔时间,最小间隔为1秒,最大间隔为65534s。减少刷新间隔时间,可以加快IS-IS的收敛时间,但同时增大了网络宽带和路由器CPU的资源开销;相反,增大刷新间隔时间,可以减少对资源的占有,但是不利于网络的收敛。在调整LSP的刷新间隔时间时,要记得LSP的最大生存时间也要做适当的调整,并且要保证最大生存时间要大于刷新间隔时间。
当一条LSP收到始发路由器的刷新时,剩余生存时间被重置到最大生存时间;如果没有得到及时刷新,LSP 的剩余生存时间会逐渐减少到0,这时,路由器在等待60s后,如果始发路由器还没发来更新,那么该LSP会被清除掉,这个60s的时间叫“零年龄老化时间”,相当于在宣判一条LSP“死刑”之前最后的宽限期。
五、区域关联位(ATT):
区域关联位用于指明一台L2或L1/2路由器具有其他区域的路由(与其他区域有连接)。由前面的内容可以知道,IS-IS 的L1/2路由器虽然是L1区域内的路由器,但它同时连接到了骨干区域(L2区域),具备L1和L2两张数据库。
有了L2数据库,也就等于有了其他区域的路由信息。一台L1/2 路由器在向L1区域通告的LSP中将ATT位设置为1,向L1区域内的路由器表明它具有到其他区域的路由信息。L1路由器根据这条LSP,生成一条指向最近的L1/2路由器的默认路由,用于将数据包发向其他区域。这里需要注意的问题是,L1/2通告ATT=1的L1 LSP的条件是至少在骨干区域有个活动的L2邻接。虽然在L1和L2的LSP都能设置ATT位,但是ATT位只能用于L1区域的选路。
如上面的输出显示,路由器R1接收到- -条ATT设置为1的LSP,在它的路由器表就会增加一条默认路由,下一跳指向离它最近的L1/2路由器。
也可以根据实际需要,配置L1/2是否通告ATT置位的LSP,在华为系统中, 使用attached-bit advertise命令配置能让L1/2路由器在通告的L1 LSP中永远或永远不设置ATT位,也可以通过命令attached-bit avoid-learing 配置在接收到ATT置位的L1 LSP时,L1路由器也不生成默认路由。
六、Partition Repair (区域修复):
OSPF协议要求网络中的区域是连续的,并且只能有一个区域0。如果区域不连续或网络中有多个区域0 (比如区域0被分裂开了),需要使用虚链路技术来修复。IS-IS 协议的区域修复是指L1区域被分裂后的修复,如果该位设置为1,表示源路由支持区域修复。一个L1区域修复需要通过骨干区域(L2区域),如下图所示:
通过骨干区域创建虚连接实现L1区域的修复,虚连接的端点是在该L1区域的两台L1/2路由器上,它们产生的LSP会将P位设置为1。修复后,两个分裂的L1区域能够通过虚链路正常传递路由信息而不是通过默认路由器发送到L2区域再进行转发。
华为目前的VRP系统还不支持区域修复功能,所以我们看到的LSP中P位为0。
七、OverLoad(过载):
OverLoad位表示始发路由器的数据库是否过载。在一般情况下,该位设置为0;如果设置为1,则表示LSP始发源路由器的CPU和内存资源已经不足,无法维护一个 完整的链路状态数据库,数据流经过这台设备时有可能得不到正常的转发。如果一台路由器收到了过载位设置为1的LSP,那么它在进行SPF计算时不会以过载的那台路由器作为中间转发设备,除了去往那台过载路由器的直连网络外,如图所示:
如图所示,正常情况下,R1通过R2访问10.1.1.0 网络,但是如果R2的LSDB 。处于过载状态(发出的LSP过载位为1),那么R1就会绕过R2,而通过R4和R5访问10.1.1.0网络,但是R1访问R2的直连网络不受影响。
下面的输出内容显示了LSDB中OL置位的LSP:
在华为的VRP系统中,设备可以自动进入过载状态(比如设备工作异常),在过载状态下,设备会删除所有引入或渗透进来的路由信息;也可以通过手工设置让设备进入过载状态,比如在设备需要升级或维护时,需要将业务切换到其他路径转发。这种方式下,还可以通过配置让设备在过载状态下是否删除所有引入或渗透进来的路由信息。
一般来说, 现在的设备性能比以前好多了,通过过载设置来避免因为设备性能不足而带来的问题,这种需求已经不多了。
资料整理于:《HCIE路由交换学习指南》