1. IS-IS报文结构
与OSPF一样,运行IS-IS路由选择协议的路由器也是通过收集其他路由器泛洪的链路状态信息来构建自己的链路状态数据库。在OSPF中,OSPF路由器通告链路状态信息是通过LSA(Link State Advertisment),在IS-IS中,与LSA具有同样功能的包含链路状态信息的报文称为LSP(Link State Packets,链路状态数据包)。LSP包含了由IS-IS路由器产生的描述其周围环境的路由选择信息。
在IS-IS中,路由协议使用的三大类报文:Hello报文、链路状态数据包(LSP)和序列号数据包(SNP),Hello报文用来建立和维持IS-IS路由器之间的邻接关系;LSP用来承载和泛洪路由器的链路状态信息,并且LSP(确切的说应该是链路状态数据库)是路由器进行SPF计算的依据;SNP用来进行链路状态数据库的同步,并且用来对LSP进行请求和确认。
下面所示为IS-IS中所使用的PDU数据包类型,使用这些数据包,IS-IS可以完成从邻接关系的建立、链路状态信息的扩散和链路状态数据库的同步的操作。每种PDU都有一个特定的类型号,在IS-IS的PDU报文头中,有一个PDU类型字段,此字段中所包含的信息就是PDU的类型号,路由器就是通过类型号来识别所收到的PDU报文类型。
Hello数据包分为三种类型:
? L1 LAN IS-IS Hello PDU(类型号15)
? L2 LAN IS-IS Hello PDU(类型号16)
? 点到点IS-IS Hello PDU(类型号17)
链路状态数据包LSP分为两种类型:
? L1 LSP(类型号18)
? L2 LSP(类型号20)
序列号数据包SNP分为四种类型:
? L1完全序列号数据包(CSNP,Complete SNP)(类型号24)
? L2完全序列号数据包(CSNP)(类型号25)
? L1部分序列号数据包(PSNP,Partial SNP)(类型号26)
? L2部分序列号数据包(PSNP)(类型号27)
a) IS-IS PDU报头格式
在所有IS-IS PDU起始的8个字节都是该数据包的头部字段,并且对于所有的PDU数据包类型(包括Hello报文、LSP和SNP)都是公用的、相同的。
下图所示为IS-IS PDU数据包起始的8个字节:
Figure . IS-IS header fields
?
Intradomain Routing Protocol Discriminator
:域内路由选择协议鉴别符。这是ISO 9577分配给IS-IS的一个固定的值,用于标识网络层PDU的类型,对于IS-IS PDU,该字段的值永远都为0x83。
?
Length Indicator
:长度标识符。标识该固定头部字段的长度。
?
Version/Protocol ID Extension
:版本/协议ID扩展。当前始终为1。
?
ID Length
:ID长度。用于表示源ID(SysID)的长度。值为0表示长度为6字节;值为255表示长度为0,即为空;1~8的整数,表示SysID具有相同长度的字节数。
?
PDU Type
:PDU类型。这是一个5bit的字段,用于标识IS-IS数据包的类型。值为15表示L1 LAN IIH;值为16表示L2 LAN IIH;值为18表示L1 LSP;值为20表示L2 LSP;值为24表示L1 CSNP;值为25表示L2 CSNP;值为26表示L1 PSNP;值为27表示L2 CSNP。
?
Version
:版本。当前为1。
?
Reserved
:保留位。没有使用的bit位,始终为0。
?
Maximum Area Addresses
:最多区域地址。表示我们可以为一个路由器配置多少个不同的区域前缀。值为0表示最多支持3个区域地址数,默认情况下值为0。
?
Additional Header Fields
:附加报头字段。至此字段之前的8个字节对于所有的IS-IS PDU都是相同的。附加报头字段将根据不同的PDU类型而不同。
?
TLV Fields
:TLV字段。用于承载IS-IS TLV。
如下图采集到PDU报头。
b) IS-IS Hello PDU格式
对于L1 LAN IIH PDU和L2 LAN IIH PDU,它们有着相同的报文格式和功能:
Figure 3-5. IS-IS LAN Hello (PDU Types 15, 16).
?
Reserved
:保留的6bit位。当前没有使用,始终为0。
?
Circuit Type
:电路类型。01表示L1路由器,10表示L2路由器,11表示L1/2路由器。
?
Source ID
:源ID。发送该PDU的路由器的SysID。
?
Holding Time
:保持时间。用来通知它的邻居路由器在认为这台路由器失效之前应该等该的时间。如果在保持时间内收到邻居发送的Hello PDU,将认为邻居依然处于存活状态。这个保持时间就相当于OSPF中的dead interval(死亡间隔)。在IS-IS中,默认情况下保持时间是发送Hello PDU间隔的3倍,但是在配置保持时间时,是通过指定一个Hello报文乘数(hello-multiplier)进行配置的。例如,如果Hello PDU的间隔为10s,Hello报文乘数为3,那么保持时间就是30s(10s x 3)。
?
PDU Length
:PDU长度。整个PDU报文的长度。包括固定报头和TLV字段。
?
Priority
:优先级。接口的DIS优先级,用来在广播LAN中选举DIS。优先级数值越高,路由器成为DIS的可能性越大。
?
LAN ID
:局域网ID。由DIS的SysID与1字节的伪节点ID组成,LAN ID用来区分同一台DIS上的不同LAN。
如下图采集到的报文格式。
下图所示为点到点IIH PDU的报文格式:
从点到点IIH PDU的格式可以看出,大部分字段与L1/L2 LAN IIH PDU的报文格式相同。但是在点到点IIH PDU中没有“Priority”字段,因为在点到点网络上不需要选举DIS。而且使用“Local Circuit ID”代替了LAN IIH PDU中的“LAN ID”字段。
Local Circuit ID(本地电路ID)由发送Hello PDU的路由器分配给这条电路的标识,并且在路由器的接口上是唯一的。在点到点链路的另一端,Hello报文中的本地电路ID可能或也可能不为同样的值。
Figure 3-4. Point-to-Point Hello Packet (PDU Type 17).
c) IS-IS LSP PDU格式
LSP PDU分为L1 LSP和L2 LSP。L1 LSP和L2 LSP各自承载了IS-IS不同层次的路由选择信息,但是它们有着相同的报文格式。
Figure. LSP format
每个LSP都包含着这些重要的信息:LSP ID、LSP序列号、LSP校验和、剩余时间、区域关联状态、超载状态以及区域划分。
?
PDU Length
:PDU长度。整个PDU报文的长度。包括固定报头和TLV字段。
?
Remaining Lifetime
:剩余时间。此LSP到期前的生存时间。当生存时间为0时,LSP将被从链路状态数据库中清除。
?
LSP ID
:LSP标识符。用来标识不同的LSP和生成LSP的源路由器。LSP ID包括三个部分:SysID、伪节点标识符(Pseudonode ID)和LSP编号。
?
Sequence Number
:序列号。LSP序列号主要用于使路由器能够识别一个LSP的新旧版本,这也与OSPF的LSA中携带的序列号是相同的作用。
?
Checksum
:校验和。校验和主要用于检查被破坏的LSP或者还没有从网络中清除的过期LSP。当一台路由器收到一个LSP,在将该LSP放入到本地链路数据库和将其再泛洪给其他邻接路由器之前,会重新计算LSP的校验和,如果校验和与LSP中携带的校验和不一致,则说明此LSP传输过程中已经被破坏。
?
P
:Partition,分区。表示区域划分或者分段区域的修复位。当P位被设置为1时,表明始发路由器支持自动修复区域的分段情况。
?
ATT
:Attached,区域关联。L1/L2路由器在其生成的L1 LSP中设置该字段以通知同一区域中的L1路由器自己与其他区域相连。通常来说就是L2骨干区域相连。当L1区域中的路由器收到L1/2路由器发送的ATT位被置位的L1 LSP后,它将创建一条指向L1/2路由器的默认路由,以便数据可以被路由到其他区域。虽然ATT位同时在L1 LSP和L2 LSP中进行了定义,但是它只会在L1 LSP中被置位,并且只有L1/2路由器会设置这个字段。
?
OL
:Overload,超载。表示路由器的资源状态。如果该bit被置位,就表示路由器发生了超载。超载是指路由器没有足够的系统资源(CPU资源和内存资源)用来处理路由选择交换信息。被设置了超载位的LSP不会在网络中进行泛洪,并且当其他路由器收到设置了超载位的LSP后,在计算路径信息时不会考虑此LSP,因此最终计算出来的到达目的地的路径将绕过超载的路由器。设置超载位还可以使数据的传输路径绕过某个特定的路由器。
?
IS Type
:中间系统类型。该字段表示了此LSP是来自L1路由器还是L2路由器。这也表示了收到此LSP的路由器将把这个LSP放到L1链路状态数据库还是L2链路状态数据库。01表示L1,11表示L2,00与10未使用。
下图是采集到报文。
d) IS-IS SNP PDU格式
SNP PDU分为CSNP和PSNP。其中CSNP包含L1 CSNP和L2 CSNP;PSNP包含L1 PSNP和L2 PSNP。CSNP与PSNP都包含了路由器本地链路状态数据库中LSP的摘要信息。其中CSNP包含的是所有LSP的摘要信息,PSNP包含的是部分LSP的摘要信息。下图所示为CSNP的报文格式。
Level 1/2 Complete Sequence Numbers PDU
?
PDU Length
:
PDU
长度。整个
PDU
报文的长度。包括固定报头和
TLV
字段。
?
Source ID
:源
ID
。发送该
PDU
的路由器的
SysID
。
?
Start LSP ID
:起始
LSP ID
。表示
TLV
字段中描述的
LSP
范围的第一个
LSP ID
。
?
End LSP ID
:结束
LSP ID
。表示
TLV
字段中描述的
LSP
范围的最后一个
LSP ID
。
如下图所示,是采集到的报文。
下图所示为PSNP的报文格式。
Level 1/2 Partial Sequence Numbers PDU
通过上图可以看出,PSNP报文的格式与CSNP的相似,只不过没有Start LSP ID和End LSP ID两个字段。由于PSNP携带的只是部分LSP的摘要信息,所以不需要起始和结束字段。
如下图是采集到的报文。
e) IS-IS TLV
根据不同的IS-IS PDU类型和特定的网络环境,紧跟在各种类型IS-IS PDU之后的是TLV(Type/Length/Value)字段,PDU报头与TLV字段构成了一个完整的IS-IS PDU。在ISO10589和RFC1195这二种当前IS-IS标准中,使用代码(code)这个词,而不是类型(type),但由于TLV用于其他协议标准中,故TLV比CLV在网络文献中使用的多,在这里我们也使用TVL代替CLV。在IS-IS PDU所使用的各种TLV中,既有ISO 10589中定义的,也有RFC 1195中定义的。ISO中定义的TLV用于CLNP网络环境,但是其中的大多数也用于IP网络环境。RFC中定义的TLV只用于IP环境。对于一个IS-IS PDU,后面既可以携带支持CLNP协议的TLV,又可以携带支持IP协议的TLV。如果一个路由器不能识别一个TLV,那么将忽略它。
Encoding of Variable Length Fields
如上图中所示,TLV中包括Type、Length和Value三个字段:
?
Code
(
Type
):表示TLV的类型,不同的TLV使用不同的类型号来区别,Type长度为1字节。
?
Length
:表示TLV中Value字段的长度,长度为1字节,所以这意味着Value字段长度的最大值为255字节。
?
Value
:表示实际承载的值,长度是可变的,最大为255字节。
下表中列出了IS-IS中所使用的各种TLV,以及这种TLV由哪种标准进行定义:
类型
|
TLV
|
ISO 10589
|
RFC 1195
|
1
|
区域地址
|
X
|
|
2
|
中间系统邻居(LSP)
|
X
|
|
3
|
终端系统邻居
|
X
|
|
4
|
区域分段指定L2中间系统
|
X
|
|
5
|
前缀邻居
|
X
|
|
6
|
中间系统邻居(Hello)
|
X
|
|
8
|
填充
|
X
|
|
9
|
LSP条目
|
X
|
|
10
|
验证信息
|
X
|
|
14
|
LSP缓存
|
X
|
|
128
|
IP内部可达性信息
|
|
X
|
129
|
支持的协议
|
|
X
|
130
|
IP外部可达性信息
|
|
X
|
131
|
域间路由选择协议信息
|
|
X
|
132
|
IP接口地址
|
|
X
|
133
|
验证信息
|
|
X
|
对于TLV 4,它用于之前我们介绍的区域修复功能;TLV 133是IETF为IP验证而定义的TLV,但是大多数实现中都使用TLV 10来支持验证。
使用TLV的最大优点就是增强了协议的扩展性,当需要扩展协议的功能时,只需要定义新的TLV就可以。下表中列出了部分IETF为增强IS-IS协议的功能所定义的一些新的TLV。
类型
|
TLV
|
RFC
|
作用
|
12
|
可选的校验和
|
3358
|
为SNP增加校验和
|
22
|
扩展的IS可达性
|
3784
|
增加流量工程特性,替代TLV 2
|
134
|
流量工程路由器ID
|
3784
|
增加流量工程特性
|
135
|
扩展的IP可达性
|
3784
|
增加流量工程特性和扩展度量,替代TLV 128和TLV 130
|
137
|
动态主机名
|
2763
|
增加节点标识能力,使用主机名代替SysID的显示
|
211
|
温和重启动
|
3847
|
增加温和重启动(Graceful Restart)的特性
|
每种IS-IS PDU都使用特定的TLV,但是有一些TLV也被多种类型的IS-IS PDU所共享,下表中列出了各种IS-IS PDU所使用的TLV:
TLV 类型 |
L1 LAN IIH
|
L2 LAN IIH
|
点到点
IIH
|
L1 LSP
|
L2 LSP
|
L1 CSNP
|
L2 CSNP
|
L1 PSNP
|
L2 PSNP
|
1
|
X
|
X
|
X
|
X
|
X
|
|
|
|
|
2
|
|
|
|
X
|
X
|
|
|
|
|
3
|
|
|
|
X
|
|
|
|
|
|
4
|
|
|
|
|
X
|
|
|
|
|
5
|
|
|
|
|
X
|
|
|
|
|
6
|
X
|
X
|
|
|
|
|
|
|
|
8
|
X
|
X
|
X
|
|
|
|
|
|
|
9
|
|
|
|
|
|
X
|
X
|
X
|
X
|
10
|
X
|
X
|
X
|
X
|
X
|
X
|
X
|
X
|
X
|
128
|
|
|
|
X
|
X
|
|
|
|
|
129
|
X
|
X
|
X
|
X
|
X
|
|
|
|
|
130
|
|
|
|
X
|
X
|
|
|
|
|
131
|
|
|
|
|
X
|
|
|
|
|
132
|
X
|
X
|
X
|
X
|
X
|
|
|
|
|
从上表可以看出,唯一一个被所有IS-IS都使用的是TLV 10,验证信息。下面我们将对这些TLV中一些常用的和重要的TLV进行介绍,关于其他的TLV和扩展的TLV可以参见相应的标准文档。
1.
区域地址
TLV
(
TLV 1
)
区域地址TLV列出了始发路由器上配置的区域地址。它只出现在非伪节点LSP中。当一台路由器配置了多个区域前缀时,此TLV将携带多个区域地址。
? 类型——1
? 长度——1字节
? 值——nx(1字节的地址长度+可变的区域地址)
如下图所示:从采集到数据的代码中可以看到其值为十六进制01,如红框中所示。
2.
中间系统邻居
TLV
(
LSP
)(
TLV 2
)
中间系统邻居TLV(LSP)用于LSP PDU中,它列出了始发路由器的IS-IS邻居(包括伪节点)和到达每个邻居的链路的度量值。
? 类型——2
? 长度——1字节
? 值——1字节
3.
终端系统邻居
TLV
(
TLV 3
)
终端系统邻居TLV只用于L1 LSP中,它列出邻接的L1路由器和ES。例如通过ES-IS协议发现运行CLNP协议的工作站。
? 类型——3
? 长度——1字节
? 值——可变
4.
中间系统邻居
TLV
(
Hello
)(
TLV 6
)
中间系统邻居TLV用于Hello PDU中,它列出了本地路由器所有邻居的SysID。与OSPF中Hello报文中的邻居列表一样,当IS-IS路由器收到其他路由器的Hello PDU后,便将其SysID加入到自己发送的Hello PDU中。在点到点Hello PDU中不使用此TLV,因为在点到点链路中不需要选举DIS。在L1 LAN IIH中只列出L1邻居,同样在L2 LAN IIH中也只列出L2邻居。
? 类型——6
? 长度——1字节
? 值——可变
5.
填充
TLV
(
TLV 8
)
填充TLV用于所有Hello PDU中。为了建立邻接关系,IS-IS协议与OSPF协议一样都需要双方具有同样的接口MTU(Maximum Transmission Unit,最大传输单元)。这种保持两个邻接的路由器具有同样的MTU的机制是必需的。这样就不会产生由于双方的MTU值不匹配而导致一方不能接收另一方发送的报文。OSPF与IS-IS使用了不同的机制来检查MTU不匹配的情况。在OSPF中,通过在DBD报文中嵌入接口MTU字段使路由器检查MTU是否匹配。在IS-IS中,路由器将Hello PDU的大小填充至接口MTU的大小。由于一个TLV的长度最长为255字节,所以通常会使用多个填充TLV。
? 类型——8
? 长度——1字节
? 值——可变
6.
LSP
条目
TLV
(
TLV 9
)
LSP条目TLV只用于CSNP和PSNP报文中。它列出了每个LSP的LSP ID、剩余时间、序列号和校验和。这些字段可以唯一的标识出一个LSP的实例。
? 类型——9
? 长度——1字节
? 值——可变
7.
验证信息
TLV
(
TLV 10
)
验证信息TLV是唯一一个用于所有IS-IS PDU的TLV。验证信息TLV只有在配置了验证时才会使用。路由器通过将密码或者密文插入到IS-IS的PDU中实现路由选择信息交互的安全性。
? 类型——10
? 长度——1字节
? 值——可变
8.
IP
内部可达性信息
TLV
(
TLV 128
)
IP内部可达性信息TLV用于LSP PDU中。它列出了与始发LSP的路由器相直连的IP地址及掩码信息。每个IP前缀都被分配了一个度量值,这个度量值表示该IP前缀对应的链路度量值。该TLV不会出现在伪节点LSP中。
9.
支持的协议
TLV
(
TLV 129
)
支持的协议TLV用来标识始发路由器所支持的第三层网络层协议,例如仅支持CLNP、仅支持IP或同时支持CLNP和IP。
10.
IP
外部可达性信息
TLV
(
TLV 130
)
与IP内部可达性信息TLV一样,这类TLV也只用于LSP PDU中。它列出了IS-IS路由选择域外部的IP地址和掩码信息。这类路由信息通常都是通过路由重分发引入到IS-IS路由域中的外部路由信息。
11.
域间路由选择协议信息
TLV
(
TLV 131
)
域间路由选择协议(IRDP)信息TLV只用于L2 LSP中。IETF定义此TLV用于支持在IS-IS路由域边界上与其他域间路由选择协议的交互,用来透传来自外部路由选择协议的信息。
12.
IP
接口地址
TLV
(
TLV 132
)
IP接口地址TLV用于列出始发IS-IS PDU的接口的地址(IP地址)。
13.
扩展的
IS
可达性
TLV
(
TLV 22
)
IETF后来定义扩展的IS可达性TLV用来代替类型2的中间系统邻居TLV(LSP)。不使用IS-IS扩展度量(使用窄度量)时,只有6bit(0~63)可以用来表示度量值;当使用IS-IS扩展度量(或称作宽度量)时,这个TLV就用来代替类型2的TLV。扩展的IS可达性TLV使用24bit表示度量值,扩大了度量的取值范围。
14.
扩展的
IP
可达性
TLV
(
TLV 135
)
与扩展的IS可达性TLV一样,IETF定义扩展的IP可达性TLV用来代替类型128(IP内部可达性TLV)和类型130(IP外部可达性TLV)的TLV。当使用IS-IS扩展度量(宽度量)时,这个TLV就用来代替类型128和类型130的TLV。扩展的IP可达性TLV使用32bit表示度量值。