集成ISIS协议
作者:Danbo 2015-7-5
ISIS的意思是表示中间系统,并且是为OSI无连接网络协议(OSI Conectionless Network Protocol,CLNP)设计的路由选择协议。为了支持从TCP/IP协议向OSI协议可预见的转换,又提出了一个了扩展的ISIS协议,称为集成ISIS协议。提出集成ISIS协议的目的是为了把它作为一个具有双重功能的ISIS协议,即利用单个路由选择协议同时为CLNS协议和IP协议提供路由选择的能力。这个协议可以设计用来在一个单纯的CLNS换进,一个单纯的IP环境,或者一个CLNS/IP的混合换进中运行。
与一个子网相连的接口称为子网连接点(Subnetwork Point of Attackment,SNPA),SNPA有一些概念化,因为它时间上是定义了一个提供子网服务的“点”,而不是一个实际的物理接口。SNPA的基本概念特征和子网本身的基本概念特征是相符的,它可以由数据链路交换的多个数据链路组成。
从一个节点的OSI层到另一个节点对等的OSI层的数据单元称为协议数据单元(Protocol Data Unit,PDU)。但是与LSA不同,LSA是封装在OSPF头部之后的,都被封装在一个IP数据包内,而一个LSP本身就是一个数据包。
ISIS区域
所有的路由器都完全处在一个区域内部,并且区域的边界是在链路上,而不是在路由器上,ISIS骨干区域是第2层区域,而非骨干区域是第1层区域。
ISIS区域是可重叠的。
缺省条件下,L1/L2路由器不需要通告L2类型的网络给L1类型的路由器。因此一台L1路由器无法知晓它自己所在区域之外的目的路由。在这个意义上一L1区域类似与OSPF的Stub区域,一次为了转发数据包到其他的区域,L1路由器都必须要转发到最近的一台L1/L2路由器上,当L1/L2路由器发送它的L1的LSP进入一个区域时,它将通过在LSP中设置一个成为“区域关联位(Attached,ATT)”的二进制来通知其他L1路由器它可以到达其他的区域。
我们讨论一下ISIS与OSPF的区别:OSPF协议可以设置丰富的区域工具和特征,是企业网路选用的协议。另一方面,多区域的ISIS运行更为复杂,因此很少在企业网中出现。运行商和ISP运行的是基于BGP协议的大型网络,他们的IGP协议主要用来寻找BGP的会话点。因此,他们希望IGP更为简单--通常会把他们整个路由选择域作为单个IGP区域,ISIS协议在很多方面无疑比OSPF协议更加简单,这对于“单个大型区域”这种类型的应用过来说根据有可扩展性。
由于一条ISIS路由器可以完全地处于一个单一的区域内,因此区域ID将和整个路由器相关联,而不是和某一个接口相关联。ISIS协议最多有3个区域地址,我们可以通过:max-area-address来修改。
NET地址
SysID:类似于OSPF协议中的RID,在一台ISIS路由器上可以通过一个单一的地址同时定义区域ID和系统ID,这个地址就是网络实体标题(Network Entity Title,NET)
6byte的SysID:这个系统ID的长度6个八位组字节,并且经常是这台设备上的某个接口MAC地址。
1byte的NSEL:在所有的情况下,这个1个八位组字节都被设置为0x00.一个网络服务接入端(NSAP)所描述的都是和某个节点的网络层上的一种特有服务相关。因而,在一个ISO地址中,SEL设置为大于0x00的某些值时,这个地址就是一台NSAP地址。这种情况和一个IP数据包内的IP目的地址与IP协议号的组合有些类似,它表明一台具体设备的TCP/IP协议栈的网络层上的一个具体服务。而在一个ISO地址的SEL设置为0x00时,这个地址就是一个NET地址,指明了某个节点网络层本身的地址。
1-13字节的区域(可变长)。常用的包含:AFI和IDI部分。
ISIS的功能结构
像ISO模型一样,之所以有一个分层的网络体系结构:是为了使每一层的功能都独立与它下面的一层。比如OSI网络层有两个子层组成:1.子网独立自称(subnetwork independent sublayer):为传输层提供了一致的和统一的网络服务;为了子网独立子层的功能层面隐藏掉不同种类数据链路(子网)的特征。2.子网依赖子层(Subnetwork dependent sublayer):则为子网独立子层的需求而去存取数据链路层提供的服务。
ISIS Hello数据包每隔10s传送一次,可通过isis hello-interval来改变。然后,ISIS在形成邻接关系方面没有OSPF那样严格。
一旦邻接关系建立,Hello Packet将担任keepalive功能,每一台路由器都在它的Hello数据包中发送一个抑制时间(hold time),用途通知宣告邻居路由器无效之前,应该等待多长时间去侦听下一个Hello数据包:isis hello-multiplier来改变。
两台路由器一旦建立双向通信就认为形成了邻接关系,但直到数据库完成同步才认为形成了完全的邻接关系。而只要他们之间能够交换Hello数据包就认为它们形成了邻接关系。通过show clns is-neighbor来查看邻居状态。
Circuit ID,这是一个八位组字节的数字,路由器用它来唯一地标识ISIS接口。如果该接口是和一个广播型多路访问网络相连的,那么这个电路ID是和该网络上的指定路由器的SysID相连的,并把这个完全的数字称为LAN ID,我们应该把电路ID称为伪节点ID(Pseudonode ID)
与OSPF不同,与广播型多路访问网络相连的ISIS了路由器要与网络上的所有邻居建立邻接关系,而不仅仅是指定路由器。每一台路由器将以组播方式发送它的LSP数据包给它的所有邻居路由器,并且指定路由器使用一个称为序列号PDU(Sequence Number PDU,SNP)的数据包来确保LSP的泛洪是可靠的。
每个接口都有L1的优先级和L2的优先级,范围:0~127,默认是64,可通过isis priority来改变这个值,优先级为0的仅代表优先级最低,并不表示不能参与于指定路由器的选择。如果优先级一样,那么拥有最高的MAC地址的接口的路由器将成为一台指定路由器。
LSP的更新过程
每个LSP数据包都包含一个老化时间、一个序列号、一个校验和。剩余时间是从最大1200s(20min)减到最小,ISIS的MaxAge是1200s,而ISIS的刷新时间间隔是15min减去一个最大不超过25%的随机抖动变量。如果剩余时间为0,那么这个过期的LSP将还会在路由器的链路状态数据库中保存60s,这个时间成为零老化生存时间(ZeroAgeLifetime)
MaxAge默认1200s,可以通过:max-lsp-lifetime更改,刷新时间可以通过lsp-refresh-interval设置。原来情况下如果一台路由器收到错误的LSP,他会将该LSP的生存时间设置为0然后泛洪出去,不过这样会增加LSP的流量,可以通过ignore-lsp-errors来忽略这个行为,目前则是直接丢弃错误的LSP。这点与OSPF不同,OSPF协议里只有始发路由器才能清除这个LSA。
序列号:如果LSP的序列号增加到最大值,那么ISIS必须失效21min(Maxagelifetime+Zeroagelifetime)。
ISIS协议使用序列号数据包(SNP)来了解LSP的接收情况和维护链路状态数据库的同步情况。在这里有两种类型的SNP:1.部分序列号报文(PSNP)2.完全序列号报文(CSNP)。在点到点的子网上,路由器使用PSNP来明确地确认每一个LSP数据包是否收到。
每当一台路由器在一个点到点子网上发送一条LSP时,它会设置一个周期为minimumLSPTransmissionInterval的计时器,路由器还没有收到这个LSP的PSNP(类似与ACK)确认数据包,那么将会发送一个新的LS数据包。默认时间为5s,可以通过isis retransmit-interval来更改。
在广播型子网上,指定路由器将会周期低以组播方式发送CSNP(DBD),用来描述链路状态数据库中每一个LSP。周期为10s,我们可以通过:isis csnp-interval来更改。同时其他路由器发送PSNP(LSR)去请求最新的LSP,然后指定路由器组播返回LSP,然后其他路由器收到后,返回PSNP(ACK)。
ISIS路由设置过载位(Overlaod,OL)。OL位用来指示可能不能再进行正确的路由决策了,因为它的链路状态数据库已经不再完整,其他路由器仍会转发数据包到这台过载路由器的直连网络上,但是在这台路由器发送清除OL位之前,其他路由器不会再利用这台路由器转发经过它传送的数据流了。因此设置了OL位可以避免过载的路由器被用作一条路由的下一跳,因此这位又常称作hipity(hippity-hop)。一般情况下内存会平均分配给L1和L2的数据库,路由器能够在其中一个内存过载时而保证其他曾的内存处于正常的状态。
现在假设有一台新增的路由器某个网络上,并且IGP已经收敛但BGP还没有收敛。如果另一台路由器根据收敛的IGP路由确认这台新增的路由是到达BGP下一跳的最优路径,那么他将把下一跳地址转发的数据包转发到这台路由器上,但是,如果BGP还没有在新的路由器上完成收敛,那么就就会形成路由黑洞。
我们可以使用set-overload-bit on-startup可以指定一个秒数,用来说明子在ISIS启动后需要设置OL位的时间。如若我们想确保BGP在OL位被清除前完成BGP的收敛,可以使用set-overload-bit on-startup wait-for-bgp,但是这有一个新的问题,如果BGP由于某些原因无法收敛,那么OL位永远不会被清除掉,因此我们的通常的做法还是设置一个超时时间。
ISIS协议:
-缺省度量(Default)--这个每一台ISIS路由器都必须支持和理解的度量
-时延度量(Delay)--这是一个可选的,反映一个子网的传输时延。
-代价度量(Expense)--这是一个可选项,反映一个子网的成本代价。
-差错度量(Error)--这是一个可选项,反映一个子网的出错的概率,类似于IGRP/EIGRP协议中的可靠度量。
在思科路由器上,所有的接口Cost的值都是10,通过isis metric进行修改,我们也可以仅针对L1或者L2分别进行修改。ISIS最大的度量值是1023。我们可以通过命令:metric-style wide设置扩展度量,具有32bit的度量。
ISIS的路由泄露
如果有多个L1/L2路由器,我们希望会选择达到最近的L1/L2路由器,而不是选择所在区域里离出口最近的那台路由器。为了达到这个目的,L1路由器必须拥有相应前缀的必要信息和它们在本地区域外的路径代价;这也以为着必须把这个前缀从L2区域通告到L1区域。ISIS称之为:“路由泄漏(路由泄漏(route leaking))”
提高SPF的效率
-递增SPF(Incremental SPF,iSPF);
-部分路由计算(Paritial Route Calculations,PRC)
iSPF:iSPF只根据拓扑改变程度的大小而运行SPF计算。iSPF也能够限制SPF计算的范围,也就是说,如果一个变化值影响拓扑的有限部分,那么iSPF就可以把SPF的重新计算限制在拓扑变化的范围内。
PRC:prc-interval应用于部分路由计算。并不是收到任意一个LSP都进行SPF计算,而是运行SPF计算采用了类似抑制LSP生成的指数补偿算法。
这里可能导致存在潜在的问题:路由环路:如果在L1区域内具有多台L1/L2路由器--这很可能是读者起初为什么从L2区域向L1区域泄漏路由的原因,这可能会引起潜在的区域间路由选择环路。然而由于这套前缀信息是在L1LSP中扩散的,路由器没办法知道泄漏的路由是起L1区域外部的前缀。因此,这台路由上将会通过一条L2的LSP将这条前缀信息通告回了L2区域。这样,在L2路由器上就存在路由选择环路,L2路由认为到达前缀的路径存在L1区域内。
而OSPF协议不存在这种问题,因为在OSPF协议中,对于骨干区域外部的前缀是通过Type-3 LSA通告的。在一个非骨干区域内的其他ABR路由器将不会把从Type-3的LSA学到的前缀通告到区域0中。
在RFC2666中,通过在IP内部可达性TLV和IP外部可达性TLV中定义一个称为up/down(U/D)的位。来为该问题提供一个解决方案。查看IP内部可达性TLV的格式(并记住IP外部可达性TLV的位格式也是相同的),请注意着八位组包含了一个I/E位和一个6位的缺省度量字段,它们开始一个保留的位置,这个保留的位置变成一个u/d位。再指定类型字段后,就可以为IP内部可达性TLV和IP外部可达性TLV定义该一位了。
当一台L1/L2路由器从L2区域向L1区域通告这条路由时,它将设置这个U/D位。任何其他的L1/L2路由器收到在L1 LSP里设置了U/D位的前缀,都不会在L2 LSP中通告这个前缀。如果有一台L1/L2路由器不能识别这个U/D位,那么它将忽略这一位。因此。如果读者正在使用L2到L1路由泄漏设计,那么确保你所有的L1/L2路由器都能识别这个扩展特性。
常用的ISIS路由命令
查案拓扑表:show isis topology
查看邻居关系:show isis neighbors 不过这个并不显示邻居接口优先级
查看邻居关系:show clns is-neighbors 显示接口优先级
查看hostname与SysID之间的映射关系:show isis hostname
手工设置过载位的命令位:set-overload-bit on-startup+时间
等待BGP收敛后清除OL位:set-overload-bit on-startup wait-for-bgp 不过推荐使用设定时间
配置路由泄漏:redistribute isis ip level-2 into level-1 distribute-list <100-199> //必须使用扩展acl。
重发布:redistribute potocol [process-id] metric [metric] match [internal | external]
或者:metric-type [value] level-1 level-2 level-1-2 route-map [map-name]
重发布静态路由:redistgribute static [clns|ip] route-map [map-name]
ISIS 计时器
10s IIH timer for non-DIS ISs on a LAN
20s IIH holdtime for non-DIS ISs on a LAN
3.3s IIH timer for the DIS on a LAN
10s IIH holdtime for DIS ISs on a LAN
10s IIH timer for p2p links
30s IIH holdtime on p2p links
33ms Minimum interval between transmitting two LSPs
5s LSP retransmission timer while flooding
100ms Delay between any retranmitted LSPs
10s Minimum time between 2 SPF runs
5s Minimum time between regenerating one LSP
60s Time to keep an expired LSP in the LSDB during pruge
15min Periodic regeneration of LSP
20min Maximum lifetime of an LSP
ISIS协议的优点
1.能支持多种网络协议;
2.区域能平滑地平移/分割/合并/流量不中断;
3.邻居之间和Hello和Dead等间隔不一定必须一样,不像OSPF要求那么严格,配置相对简单。
4.采用TLV方式编码,有较好的扩展性。
其他
ISIS默认的接口metric为10,我们可以通过ISIS metric进行更改(0-63)。默认的情况下会更改所有区域的metric,我们可以加上level-1或者level-2来仅更改相应的metric。
路由汇总,在L1路由进入L2的时候进入路由汇总个。缺省汇总路由命令是:summary-address **** **** level-1-2
还有一点此时会产生一个指向空接口的路由,以防黑洞路由的问题。
SPF算法过程:
-也叫Duhjstra算法(Shorttest Path Firs)
-目的在于计算达到网络拓扑中其他路由器的最短路径
-通过计算得到的最短路径树SPT我们可以建立路由表(RIB)
-通过顶点集和边线集的有向图的方法表示-把图命名为G,G=(N,L)N为顶点,L为边线集。
SPF算法创建并维护三张表
1.Unknown list
开始所有节点都属于这个列表(还没考虑顶点集)
2.Tentative list(Candidate list):正在计算的列表。
当前考虑的所有节点属于这个列表(正在考虑的顶点集)即包含去往目的地的所有有序的路径
3.Path List(Konwn list)
已经计算出最短路径的节点属于这个列表(计算好的顶点集)即去往目的地的最佳路径
SPF算法执行的过程:
1.从Tentative List的所有路由器中找出离自己(跟)最近的节点,并将其从tentative list转移至path list
2.发现此节点通告的所有前缀并安装到RIB中
3.发现此节点的所有邻居,并将这些邻居移动到tentative list中。
在ISIS中,IP前缀最短路径数撒谎个的子叶。//这点与OSPF最大的不同点。
不使用IP前缀来计算和建立SPT。
使用CLNS SysID来标记路由器。
当Tentative list表为空的时候,所有SPF计算结束
比较OSPF与ISIS协议的不同点
1.ISIS协议直接在链路层上使用,报文直接封装在而二层链路层报文中,支持IP,OSI CLNP多种协议,而OSPF封装在IP内,只支持IP协议。
2.ISIS的LSP生存时间是20min往下计算到0来清除超时的LSP,而OSPF则是从0增大到60min
3.ISIS协议整个路由只能全部属于一个区域,路由器的LSDB按Level1来维护,而OSPF按接口来,每台路由器可以属于多个区域,每个区域维护一个LSDB数据库。
4.对于骨干区域的类型定义不同:OSPF通过特殊的area0区域来定义,而ISIS通过连续的L2来组成骨干区域
5.ISIS的DIS选举比较简单,并且是preempt,优先级最高的为DIS。优先级相同则是通过最大的mac地址
6.ISIS仅支持P2P和Broadcast;OSPF则支持5中网络类型(包括p2p,p2mp,broadcast,NBMA,Virtual Links)
在广播网上数据库的交换
1.DIS周期性的发送CSNP
2.IS收到一个LSP的行为
3.中间系统接收到报文,在数据中搜索对应的记录。若就存在,则将其加入数据库,并广播新得内容。
否则:若数据库中的序列号小于报文中的序列号,就替换为新报文,并广播数据库内容。
否则:若数据库中的序列号大于报文中的序列号,就向入端口发送一个包含本地数据库的新报文。
否则:若连个序列号相等,则不做任何事情。
在p2p链路上:
P2P链路上数据库的交换
1.如果收到LSP比已有的序列号大,则将这个新的LSP存入自己的LSDB中,再通过一个PSNP报文来确认收到此LSP,最后将这个新LSP再接收再发送到所有其他邻居。
2.如果收到的LSP和已有的具体相同的序列号,则直接通过一个PSNP报文确收到此LSP
3.如果收到的LSP比已有的序列号更小,则通过一个PSNP报文确认此LSP,再发送给对方我们版本的LSP,然后等等待对方给我一个PSNP报文作为应答确认。
在点到点链路上当邻居关系up的一瞬间会发送一次CSNP,然后就不在发送了。
这个是在P2P网络中如果对方收到LSP后5s之内没有对方对此LSP的PSNP,则本端会在5s之后进行重传。
我们可以通过抓取ISIS邻接关系建立的过程,包括MA和P2P网络类型。