集成IS-IS路由协议简介
                IS-IS是一种链路状态路由协议,它是由ISO定义和发展,IS-IS支持的是ISO的CLNS(Connectionless Network Protocol,无连接的网络协议),为了能够支持IP,后来将IS-IS扩展为可以同时支持OSI和TCP/IP的集成IS-IS(Integrated IS-IS)
               在IS-IS中,路由器被描述为是一个中间系统(Intermediate System,IS),主机被描述为端系统(End System,ES).因此提供主机和路由器之间的通信的协议即为ES-IS;而路由器之间的通信即为IS-IS,如下图:
非常值得一看:集成IS-IS的路由协议_休闲 
            和IP中使用Proxy ARP或IRDP,或在主机上配置默认网关不同的是,CLNP会ES和IS之间形成ES-IS的邻接关系,与1个子网相连的接口就叫SNPA(Subnetwork Point of Attachment).SNPA并不是物理接口,它的基本概念和子网的基本概念是相同的
9.2 IS-IS的区域
            IS-IS也定义了2层区域的概念,和OSPF不同的是,OSPF的区域是以路由器为边界;而IS-IS中是以链路为边界,如下图:
非常值得一看:集成IS-IS的路由协议_职场_02 
         连接不同区域的IS为Level 2(L2)路由器,或者是同时具有Level 1和Level 2的L1/L2路由器,L1/L2路由器要同时分别维持L1和L2的LSDB 。在IS-IS中,也有类似于RID的System ID.由于IS-IS中区域是以路由器为边界,因此,1个路由器的每个接口上的区域ID都是一样的.在IS-IS中,1个路由器最多可以具有3个区域ID,这样对区域中的过渡是很有用的
9.3 IS-IS的网络地址
               在IS-IS中,可以通过Network Entity Tiyle(NET)来同时定义区域ID和系统ID.即使集成IS-IS只使用在一个TCP/IP的环境中,由于它是CLNP协议,使用的是CLNS PDU(Protocol Data Unit),所以仍然要有1个ISO地址.ISO地址就是NET,长度为8到20字节.NET的结构如下图:
非常值得一看:集成IS-IS的路由协议_职场_03 
            如下为3种NET格式
非常值得一看:集成IS-IS的路由协议_路由_04 
         第1个是简单的NET,区域ID,系统ID(为路由器某个接口的MAC地址)和选择符(SEL),SEL被设置
         为0x00;如果当SEL不为0,它就是一个NSAP(Network Service Access Point);第3个为GOSIP
         NSAP.无论是那种格式的NET,都要满足下面的几个规则:
                        1.NET必须是以单个的8位位组开始(比如,47.xxxx…)
                         2.NET必须是以担搁的8位位组结束(比如,…xxxx.00).如果SEL不为0,IS-IS也能正常工作,
                               但是在CLNP/IP这种双环境中可能会出问题
                         3.在Cisco路由器上,NET中的系统ID必须为6字节
9.4 子网的功能
            9.4.1 依赖于子网的功能
                          IS-IS中只定义2种网络类型: 广播型和点到点型.
                          IS-IS hello packet
                          IS-IS路由器通过IS-IS Hello PDU形成邻接关系,
                          IS-IS Hello PDU每10秒发送1次
                              在接口配置模式下使用isis hello-interval <seconds>来修改.
             当然L1路由器可以和L1路由器和L1/L2路由器形成邻接关系,而L1路由器是不可以和L2路由器形成邻接关系的,
                 IS-IS Hello PDU中也有Hold Timer,默认为IS-IS Hello PDU发送间隔的3倍长,
                      可以通过接口配置命令isis hello-multiplier <seconds>来修改
使用命令show clns is-neighbors查看IS-IS的邻居表
非常值得一看:集成IS-IS的路由协议_职场_05 
State为邻接的状态,一般为Init(学习到但是还未邻接)和Up(邻接成功建立)
 Circuit ID为电路ID,8字节长,用来标识IS-IS接口.
          如果这个接口是和广播型多路访问的网络相连,那么电路ID和该网络上的指定路由器(Designated Router,DR)的系统ID相连,这个完整的字符串就叫LAN ID.在这种用法里,把电路ID称为仿真节点ID(Pseudonode ID).如上的例子里,0000.0C76.5B7C就是DR的系统ID,00就是仿真节点ID
Format为邻接关系的格式,
           对于集成的IS-IS,这里的值永远为Phase V,代表OSI/DECnet Phase V;另外的一种值是DECnet Phase IV IS-IS会广播型网络上选举1个DR,与OSPF不同的是,这种广播型多路访问的网络中所有的IS-IS路由器都要和它所有的邻居建立邻接关系,而不仅仅是只和DR邻接.路由器通过组播的方式发送LSP(Link State Packet)给它的邻居,DR采用SNP(Sequence Number PDU)来保证LSP的洪泛是可靠的
              每个IS-IS路由器的接口都有1个基于L1和L2的优先级,这个优先级的范围是0到127,Cisco默认的基于L1和L2的优先级都是64,这个值可以通过命令isis priority <value>来修改
              IS-IS中DR的选举也是根据优先级来判定的,IS-IS路由器发送的Hello包分都包含的有优先级字段(L1的Hello包宣告L1的优先级;L2的Hello包宣告L2的优先级).如果优先级为0,它就不能成为DR,如上图:
              第一行显示的优先级为0,因为它是串性点到点链路,不需要选举DR,所以设置为0(非广播型网络不需要选举DR).优先级最高的成为DR;如果优先级一样,就比较系统ID,系统ID最大的成为DR.与L1和L2的优先级分别对应的是,要分别选举1个L1的DR和L2的DR
             与OSPF不同的是,IS-IS中,不会选举BDR,另外DR会抢占,只要网络上出现1个优先级高过现有DR的优先级的路由器,它将立即取代现有DR的位置而成为新的DR.这样,每次DR的更改都将产生1组LSP的洪泛
9.4.2 独立于子网的功能
         子网独立子层定义了CLNS如何把书数据包通过CLNP的网络把这些服务提供给传输层路由功能被分为4个过程:
         1.更新(Update)过程
          2.决策(Decision)过程
          3.转发(Forwarding)过程
          4.接收(Receive)过程
                更新过程负责洪泛滥L1和L2的LSP来构建LSDB(Link State Database),L1的LSP会在整个区域洪泛,而L2的LSP只会在所有建立了L2邻接的路由器上洪泛。每个LSP都包含提个剩余生存时间(Remaining Lifetime),一个序列号(Sequence Number)和一个校验和(Checksum).
                和OSPF中LSA的Age不同的是,IS-IS中的生存时间是递减的.IS-IS中LSP的最大生存周期(MaxAge)是1200秒(20分钟),和OSPF的LSA一样,当LSP驻留在LSDB中,这个剩余生存时间也会随之推移的.为防止LSP的剩余生存时间为0,源路由器会周期刷新它的LSP,这个刷新的时间周期为900秒(15分钟),Jitter 25%.当LSP的剩余生存时间递减到0以后,这个LSP还会在LSDB中保留60秒,这个时间叫做ZeroAgeLifetime
               如果1个IS-IS路由器收到了校验和错误的LSP,它将把这个LSP的剩余生存时间设置为0来移除这条LSP,源路由器将重新发送这个LSP的1个新的实例(这点和OSPF不同,OSPF的源路由器仅仅清除这条LSA)
              在一个错误机率比较高的网络上,允许路由器清除错误的LSF可能会导致LSP流量过高,因为这将使得源路由器不断重发LSP的新的实例.可以使用命令ignore-lsp-errors来忽略这种错误的LSP而不去清除它(当然发出这条错误的LSP的源路由器可以通过SNP得知这条LSP没有被收到)
              序列号是一个无符号的32位长的线性数字,当IS-IS路由器初次发送LSP的时候,序列号设置为1,以后这个LSP的每个实例的序列号都会递增1,如果序列号达到了最大的0xFFFFFFFF,IS-IS进程将关闭至少21分钟(MaxAge+ZeroAgeLifetime),以便允许旧的LSP从LSDB中清除
              在点到点的网络上,路由器直接发送L1和L2的LSP给邻居.
                 在广播型的网络上,LSP通过组播的方式发给邻居,运载L1的LSP的帧的目标MAC地址为0180.c200.0014,又叫AllL1ISs;运载L2的LSP的帧的目标MAC地址为0180.c200.0015,又叫AllL2ISs
IS-IS通过SNP来确认LSP的接收和维持LSDB信息的同步,有2种类型的SNP:
                   1.Parial SNP(PSNP)
                    2.Complete SNP(CSNP)
         在点到点网络上,IS-IS路由器通过PSNP来确认每个LSP是否收到.PSNP通过下面的信息来描述它所确认的LSP:
                      1.LSP ID
                          2.LSP的序列号
                         3.LSP的校验和
                         4.LSP的剩余生存时间
          在点到点的环境中,当有路由器要发送LSP的时候,它会设置个叫做minimumLSPTransmission
Interval的时间,在这个时间超出之前没有收到关于这个LSP的PSNP时,新的LSP将被重传.Cisco路由器上这个时间默认为5秒,可以通过接口配置命令isis retransmit-interval <seconds>来修改
              在广播型网络上,LSP不需要被每个路由器都确认.DR将周期性的组播CSNP,用来描述LSDB中的每个LSP,默认发送时间为10秒,这个时间可以通过命令isis csnp-interval <seconds>来修改, L1的CSNP是组播到AllL1ISs L2的CSNP是组播到AllL2ISs
                     当路由器收到CSNP的时候,它会把这个CSNP中的LSP的信息和它LSDB中的LSP做比较.如果路由器发现LSDB中存在CSNP中没有的LSP,或者有比CSNP中更新的LSP,那么这个路由器就将组播这个LSP,但是如果其他的路由器先发送这个更新的LSP,这个路由器就不会发送这个LSP的另1个拷贝.如果路由器的LSDB中没有包含CSNP中所列出来的LSP,或者LSDB中的LSP比CSNP中列出来的LSP更旧,路由器将组播PSNP,这个PSNP列举了路由器所需要的LSP的清单.虽然PSNP是组播出去的,但是只有DR会以合适的LSP响应它
              IS-IS还有个特性,当路由器因内存不足的原因而不能记录完整的LSDB信息的时候,它可以通知其他的路由器,它将在LSP中设置1个超载(Overload,OL)位,它用来表示路由器可能不能够再做路由决策了,因为它的LSDB不完整.再这个发生超载现象的路由器发送1个清除OL位的LSP之前,其他的路由器就会避免经过它来把数据包转发到其他网络上去,因此OL位也被叫做hippity(或hippity-hop)位
show isis database命令查看IS-IS路由器的LSDB信息,如下:
非常值得一看:集成IS-IS的路由协议_路由_06 
可以看出路由器Brussels是一个L1/L2路由器,其中LSP ID后面跟的星号表示这个LSP是正在
查看的路由器所发出去的
LSP Holdtime也就是剩余生存时间
ATT表示Attached位,设置为1表示包含有达到其他区域的路由
P表示Partition位,该位一般设置为0
如下是加上detail参数查看具体某条LSP的信息:
非常值得一看:集成IS-IS的路由协议_职场_07 
          一旦更新过程建立了完整的LSDB后,决策过程就将使用LSDB中的LSP信息来构建一条最短路径树,然后形成路由表.对于L1和L2的路由,路由器会分别执行不同的SPF计算
IS-IS的metric标准如下(1个是必须,另3个是可选):
1.Default:必须的.每台IS-IS路由器都必须支持和理解的metric
 2.Delay:可选的,反映了子网的传输
3.Expense:可选的,反映子网的成本开销
4.Error:可选的,反映了子出错的机率(类似IGRP/EIGRP中的RELY)
          每1种metric的范围都是0到63之间的整数,并且每条路由要根据每种metric进行单独的计算,并且有可能产生不同的路由表.Cisco的路由器只支持Default类型的metric.
在Cisco路由器上,接口默认的metric都为10,可以使用命令isis metric <value>进行修改,
            因此一条路由的总的开销就是接口开销之和.对于任何一条路由来说,最大的metric为1023
            IS-IS路由不光分为L1和L2,还分为内部路由和外部路由,
对于L2,它有可能是内部路由也有可能是外部路由; 对于L1,它始终都是内部路由.
 
                 如果存在到达某个目标地址的多条路由,L1的路由将优先与L2的路由.在同一Level中的路由,支持可选metric的路由将优先与只支持Default metric的路由.在每个Level里,开销最低的路由将优先被采用,如果在同一Level中多条路由的等价的,那么它们将都被放入路由表里.Cisco支持最大6条路径的等价的负载均衡
            LSP ID中最后的1个字节是LSP Number,用来跟踪分片(因LSP过大而分片)的LSP.决策过程将注意到LSP Number的原因是:如果路由器的LSDB中没有LSP Number为0并且剩余生存时间不为0的LSP,决策过程将不会处理具有相同的系统ID,但是LSP Number不为0的LSP.这将保证不会因不完整的LSP信息而导致不正确的路由决策.另外,决策过程将仅从LSP Number为0的LSP接受下面几种信息:
1.OL位
2.IS的类型字段
3.区域地址可选字段的信息
         在LSP Number不为0的LSP中,决策过程将忽略上面3个信息,在分片的LSP中,上述3个字段的信息由LSP Number为0的LSP来宣告
 IS-IS支持VLSM,并且管理距离(administrative distance,AD)是115
如果ATT位设置为1,集成IS-IS就会增加一条到达最近的L1/L2路由器的默认路由,如下:
非常值得一看:集成IS-IS的路由协议_路由_08 
         如上反映了一个问题,就是CLNP信息和IP信息的关联不太方便.解决办法是使用命令which-route,如下:
非常值得一看:集成IS-IS的路由协议_协议_09 
这个命令的作用是确定某个CLNS地址在路由表中的位置,把CLNS信息和IP信息相互关联
9.5 IS-IS的PDU格式
       IS-IS使用9种PDU,可以分为3个大类,如下:
非常值得一看:集成IS-IS的路由协议_路由_10 
非常值得一看:集成IS-IS的路由协议_路由_11 
      这些IS-IS PDU的前8字节的头部信息格式如下图:
非常值得一看:集成IS-IS的路由协议_IS-IS_12 
Interdomain Routeing Protocol Discriminator:
          ISO9577分配的一个恒定不变的数,值为0x83,用来标识网络 层的 PDU(Network PDU,NPDU)
Length Indicator:
          标记固定头部信息的长度,1字节长
Version/Protocol ID Extension:始终设置为1
ID Length:
表示路由域里NSAP和NET使用的系统ID的长度.该字段的值可以是以下几种数值之一:
         1.值为1到8的整数:表示系统ID具有和这个值相同的长度
          2.值为0:表示系统ID为6字节长
          3.值为255:表示系统ID字段为null(0字节)
R:保留,设置为0
PDU Type:PDU类型,5位长
Version:版本号,始终为1,这和之前的Version/Protocol ID Extension是一样的
Maximum Area Addresses:
最大区域数,表示区域内允许的最大区域地址数量.值可以是下面几种数值之一:
         1.值为0:表示最大只支持3个区域地址
         2.值为1到254的整数,表示支持的区域地址数和这个值相同
          Cisco路由器中,只支持值为0,即最大支持3个区域地址
9.5.1 CLV字段
             Variable-Length Fields:可变长字段,为CLV字段,即代码/长度/值(Code/Length/Value)
非常值得一看:集成IS-IS的路由协议_职场_13 
          其中Code和Length字段长度分别为1字节,Value字段就是它本身的信息.Value字段的大小
       最大可为255字节.
9.5.2 IS-IS的Hello包格式
         有2种类型的IS-IS Hello PDU:
非常值得一看:集成IS-IS的路由协议_休闲_14 
IS-IS LAN Hello PDU
IS-IS Point-to-point Hello PDU
IS-IS LAN Hello PDU还可以分为L1和L2,但是这2种类型是一样的.
Circuit Type:
2位长,之前的6个R位保留,设置为0.在这个字段里,如果值为01表示是L1路由器,如果为02则
表示是L2路由器,为11的话表示是L1/L2路由器,如果值为00,这个PDU将被忽略
Source ID:发出这个IS-IS Hello PDU的源路由器的系统ID
LAN ID:系统ID加上一个1字节长的仿真节点ID
9.5.3 IS-IS的链路状态报文(LSP)格式
P:Cisco路由器中设置为0
ATT:4位长,表示相连的区域使用了哪种的metric类型,从右(第4位)到左(第7位)依次是:
         Default,Delay,Expense和Error,
因为Cisco的路由器只支持Default,因此其他3位设置为0
IS Type:2位长,用来表示源路由器的类型,如下:
        00:未使用
        01:L1路由器
        10:未使用
         11:L2路由器
非常值得一看:集成IS-IS的路由协议_IS-IS_15 
9.5.4 IS-IS的序列号报文格式
非常值得一看:集成IS-IS的路由协议_职场_16 
9.6 配置集成IS-IS
        9.6.1 IS-IS基本配置
                  配置IS-IS的基本步骤如下:
                         1.确定路由器所在的区域和要起用IS-IS的接口 
                         2.使用router isis来启动IS-IS(router isis也可以跟一个名字,比如router isis dancer)
                         3.使用net命令配置NET地址
                          4 ip router isis在相应的接口上启动集成IS-IS
非常值得一看:集成IS-IS的路由协议_职场_17 
NET地址表如下
非常值得一看:集成IS-IS的路由协议_路由_18 
非常值得一看:集成IS-IS的路由协议_休闲_19 
非常值得一看:集成IS-IS的路由协议_休闲_20 
非常值得一看:集成IS-IS的路由协议_路由_21 
9.6.2 更改路由器类型
           我们可以发现路由器Paris和路由器Amsterdam都分别维持的有L1和L2的LSDB,
非常值得一看:集成IS-IS的路由协议_职场_22 
               但是实际上路由器Berlin,Amsterdam还有Paris配置成L1的路由器就可以了,这样可以减轻路由器的负担,使用命令is-type来更改路由类型,因此,要把路由器Berlin更改为L1路由器,只需做如下配置:
非常值得一看:集成IS-IS的路由协议_IS-IS_23 
            可以看到LSDB和路由表的体积都减小了.但是还有个问题,就是虽然L1/L2路由器会在LSP中设置ATT位来告诉L1路由器它具有区域间的连接,因此路由器Paris会有1条到达路由器London或Rome的默认路由,但是之前Paris的路由表中并没有这条默认路由.原因是ATT位是CLNS的特性,在IP环境中它不能被直接的理解.解决办法有2种,
           1种是不光在路由器London和Paris的接口上启用IP的IS-IS,还要启用CLNS的IS-IS,如下:
非常值得一看:集成IS-IS的路由协议_IS-IS_24 
非常值得一看:集成IS-IS的路由协议_休闲_25 
           第2种解决方法是在L1/L2路由器上配置一条默认路由,并使用default-information originate命令使得IS-IS来宣告这条默认路由.以路由器Brussels为例,配置如下:
非常值得一看:集成IS-IS的路由协议_协议_26 
非常值得一看:集成IS-IS的路由协议_协议_27 
9.6.3 区域迁移
           在OSPF中,区域的迁移必须在中断网络的情况下尽情;而IS-IS可以在不中断网络的情况下进行区域的迁移,因为Cisco的路由器最多可以配置3个区域地址.
非常值得一看:集成IS-IS的路由协议_路由_28 
现假设要用GOSIP格式的NET地址代替原有NET地址格式,
非常值得一看:集成IS-IS的路由协议_休闲_29 
配置步骤是在不删除原有NET地址的基础上,增加新的GOSIP NET地址,以Rome为例,如下:
Rome(config)#router isis
Rome(config-router)#net 00.0001.0000.0c0a.2aa9.00
Rome(config-router)#net 47.0005.8000.ab7c.0000.ffe9.0001.0000.0c0a.2aa9.00
使用show isis database detail或show clns is-neighbors验证,如下:
非常值得一看:集成IS-IS的路由协议_路由_30 
增加了新的GOSIP NET地址以后,使用no net命令删除原有NET地址,迁移完成
9.6.4 路由汇总
       Zurich(config)#router isis
       Zurich(config-router)#net 01.0000.0c76.5b7c.00
       Zurich(config-router)#summary-address 172.16.0.0 255.255.248.0
 9.6.5 集成IS-IS的认证
               IS-IS只支持明文口令的验证,Cisco IOS支持3个级别的验证:邻居间,整个区域和整个IS-IS路由域.这3个级别的验证可以分开来使用也可以结合在一起使用,规则如下:
1.邻居间的验证,相互连接的路由器的接口上配置的口令必须相同
2.配置邻居间的验证,要分别为L1和L2的邻接各自配置单独的口令
 3.整个区域发验证,区域内所有的IS-IS路由器必须启用验证,并配置相同的口令
4.整个IS-IS路由域的验证,每个L1/L2路由器和L2路由器都必须启用验证,并配置相同口令
                   邻居间验证的配置,使用接口配置命令isis password <password> {level-1|level-2},L1和L2的口令可以相同,如果不跟{level-1|level-2}参数,默认为L1.在整个区域的验证,使用area-password <password>命令启用验证,如下是配置区域3的验证:
                     Bonn(config-router)#area-password Rhine
           要注意的是isis password命令指定的口令是包含在IS-IS Hello PDU中的;而area-password所指定的口令是包含在L1的LSP,CSNP和PSNP中的.因此,前者指定的口令只能用来验证邻接关系的建立;后者是验证L1的LSP的交换,如果口令不一样,仍然可以建立邻接关系,但是不会交换L1的LSP信息 IS-IS路由域的验证,使用命令domain-password <password>来指定,IS-IS路由域的验证只需要在L2或L1/L2路由器上配置
          IS-IS路由域的验证口令是出现在L2的LSP,CSNP和PSNP中的,是验证L2的LSP的交换,如果口令不一样,仍然可以建立邻接关系,但是不会交换L2的LSP信息
9.7 集成IS-IS协议的故障排除
         9.7.1 IS-IS邻居关系故障排除
非常值得一看:集成IS-IS的路由协议_休闲_31 
查看IS-IS邻居表使用show clns is-neighbors {detail}命令,在查看邻居表的时候,要靠拉
到诸如以下问题:
                1.路由器Level的配置是否正确
                2.邻居路由器是否都正常发送IS-IS Hello PDU,可以通过命令debug isis adj-packets来查
                3.邻居之间的isis hello-interval和isis hello-multiplier的设置是否相同
               4.如果启用了验证,注意3个验证级别的口令是否符合之前所说的几个规则
               5.是否存在堵塞IS-IS或CLNS的ACL
 9.7.2 IS-IS链路状态数据库故障排除
                 使用show isis database {level-1|level-2} {detail} {LSP ID}来查看IS-IS路由器的LSDB信息非常值得一看:集成IS-IS的路由协议_路由_32
            如果1个LSP的序列号明显高于其他LSP的序列号,很可能是由于区域不稳定或L2骨干路由器不稳定造成的;另外要注意的是LSP的Holdtime从来都不会很小,否则就有可能是网络不稳定造成的.如果怀疑网络不稳定,可以使用命令show isis spf-log显示本地路由器最近执行的所有SPF计算的日志信息,如下:
非常值得一看:集成IS-IS的路由协议_职场_33 
前几行显示的是周期性的LSP的刷新(每15分钟),而后几行显示了频繁的SPF计算,说明网络
发生了变化.为了进一步跟踪问题所在,可以使用3个调试命令:
1.debug isis spf-triggers:显示的是与触发SPF计算相关的事件信息
非常值得一看:集成IS-IS的路由协议_休闲_34 
2.debug isis spf-events:显示引起触发SPF计算的1个详细报告,如下:
非常值得一看:集成IS-IS的路由协议_协议_35 
3.debug isis spf-statistics:显示关于SPF计算它本身的统计信息,如下:
非常值得一看:集成IS-IS的路由协议_休闲_36 
       如果你怀疑IS-IS路由器的LSDB信息的同步发生了问题,可以检查LSP ID和校验和.使用下面2个命令进行调试:
1.debug isis update-packets:显示路由器发送和接收SNP和LSP的相关信息
2.debug isis snp-packets:显示路由器发送和接收的PSNP和CSNP的相关信息
9.7.3 运行在NBMA型网络上的集成IS-IS
非常值得一看:集成IS-IS的路由协议_路由_37 
非常值得一看:集成IS-IS的路由协议_IS-IS_38 
非常值得一看:集成IS-IS的路由协议_职场_39