1. 定義
中間系統到中間系統IS-IS屬於內部網關協議IGP,用於自治系統內部。IS-IS也是一種鏈路狀態協議,使用最短路徑優先SPF算法進行路由計算。
2. ISIS基本概念
2.1 IS-IS的拓撲結構
為了支持大規模的路由網絡,IS-IS在自治系統內采用骨干區域和非骨干區域兩級的分層部署。一般來說,將level-1路由器部署在非骨干區域,level-2路由器和level-1-2路由器部署在骨干區域。每一個非骨干區域都通過level-1-2路由器與骨干區域相連。
如下圖所示為一個運行IS-IS協議的網絡,它與OSPF的多區域網絡拓撲結構非常相似。整個骨干區域不僅包括area1中的所有路由器,還包括其他區域的level-1-2路由器。

下圖是IS-IS的另外一種拓撲結構圖。在這個拓撲中,level-2級別的路由器沒有在同一個區域,而是分別屬於不同的區域。此時所有物理連續的level-1-2和level-2路由器就構成了IS-IS的骨干區域。

2.2 IS-IS於OSPF的不同點:
1.在IS-IS中,每個路由器都只屬於一個區域;而在OSPF中,一個路由器的不同接口可以屬於不同區域。
2.在IS-IS中,單個區域沒有骨干與非骨干區域的概念;在OSPF中,area0被定義為骨干區域。
3.在IS-IS中,level-1和level-2級別的路由都采用SPF算法,分別生成最短路徑樹SPT;在OSPF中,只有在同一個區域內才使用SPF算法,區域間的路由需要通過骨干區域來轉發。
2.3 IS-IS路由器的分類
1.level-1路由器
level-1路由器負責區域內路由,它只與屬於同一個區域的level-1和level-1-2路由器形成鄰居關系,屬於不同區域的level-1路由器不能形成鄰居關系。
level-1路由器只負責維護level-1的鏈路狀態數據庫LSDB,該LSDB包含本區域的路由信息,到本區域外的報文轉發給最近的level-1-2路由器。
2.level-2路由器
level-2路由器負責區域間的路由,它可以與同一或者不同區域的level-2路由器或者其他區域的level-1-2路由器形成鄰居關系。level-2路由器維護一個level-2的LSDB,該LSDB包含區域間的路由信息。
所有level-2級別(即形成level-2鄰居關系)的路由器組成路由域的骨干網,負責在不同區域間通信。路由域中level-2級別的路由器必須是物理連接的,以保證骨干網的連續性。只有level-2級別的路由器才能直接與區域外的路由器交換數據報文或路由信息。
3.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.4 IS-IS的網絡類型
IS-IS只支持兩種網絡類型,根據物理鏈路不同分為:
1.廣播鏈路:如Ethernet,token-ring等。
2.點到點鏈路:如PPP,HDLC等。
對於NBMA網絡,需對其配置三層子接口,並注意三層子接口類型應為P2P。
IS-IS不能在點到多點P2MP上運行。
2.5 DIS和偽節點
在廣播網絡中,IS-IS需要在所有的路由器中選舉一個路由器作為DIS。DIS用來創建和更新偽節點,並負責生成偽節點的鏈路狀態數據單元LSP,用來描述這個網絡上有哪些網絡設備。
偽節點是用來模擬廣播網絡的一個虛擬節點,並非真實的路由器。在IS-IS中,偽節點用DIS的system ID和一個字節的Circuit ID(非0值)標識

使用偽節點可以簡化網絡拓撲,是路由器產生的LSP長度較小。另外,當網絡發生變化時,需要產生的LSP數量也會較少,減少SPF的資源消耗。
level-1和level-2的DIS是分別選舉的,用戶可以為不同級別的DIS選舉設置不同的優先級。DIS優先級最大的被選舉為DIS。如果優先級數值最大的路由器有多台,則其中MAC地址最大的路由器會被選中。不同界別的IDS可以是同一台路由器,也可以是不同的路由器。
2.6 IS-IS協議中的DIS和OSPF協議中的DR的區別:
1.在IS-IS廣播網絡中,優先級為0的路由器也參與DIS的選舉,而在OSPF中優先級為0的路由器不參加DR選舉。
2.在IS-IS廣播網絡中,當有新的路由器加入,並符合成為DIS的條件時,這個路由器會被選中為新的DIS,原有的偽節點被刪除。此更改會引起一組新的LSP泛洪。而在OSPF中,當一台新的路由器加入后,即使它的DR優先級最大,也不會立即成為該網段中的DR。
3.在IS-IS廣播網絡中,同一網段上的同一級別的路由器之間都會形成鄰接關系,包括所有的非DIS路由器之間也會形成鄰接關系。而在OSPF中,路由器只與DR和BDR建立鄰接關系。
3. IS-IS的地址結構
網絡服務訪問點NSAP是OSI協議中用於定位資源的地址。NSAP的地址結構如下圖,它由IDP和DSP組成。IDP和DSP的長度是可變的,NSAP總長最多是20個字節,最少是8個字節。
IDP相當於IP地址中的主網絡號。它是由ISO規定,並由AFI和IDI兩部分組成。AFI表示地址分配機構和地址格式,IDI用來標識域。
DSP相當於IP地址中的子網號和主機地址。它由high order DSP,system ID 和SEL三部分組成。high order DSP用來分割區域,system ID用來區分主機,SEL用來指示服務類型。

3.1 area address
IDP和DSP中的high order DSP一起,既能標識路由域,也能標識路由域中的區域,因此,它們一起被稱之為區域地址,相當於OSPF中的區域編號。同一level-1區域內的素有路由器必須具有相同的區域地址,level-2區域內的路由器可以具有不同的區域地址。
一般情況下,一個路由器只需要配置一個區域地址,且同一區域中所有節點的區域地址都要相同。為了支持區域的平滑合並,分割及轉換,在設備的實現中,一個IS-IS進程下最多可配置3個區域地址。
3.2 system ID
system ID
用來在區域內唯一標識主機或路由器。在設備的實現中,它的長度固定為48bit(6字節)。
在實際應用中,一般使用router id與system is進行對應。假設一台路由器使用接口loopback0的IP地址為192.168.1.1作為route id,則它在IS-IS中使用的system ID可通過如下方法轉換得到:
1.將IP地址192.168.1.1的每個十進制數都擴展為3位,不足3位的在前面補0,得到192.168.001.001
2.將擴展后的地址分為3部分,每部分由4位數字組成,得到1921.6800.1001。重新組合的就是system ID。
使用systemID的指定可以有不同的辦法,但要保證能夠唯一標識主機或路由器。
SEL
SEL的作用類似IP中的“協議標識符”,不同的傳輸協議對應不同的SEL。在IP上SEL均為00.
網絡實體名稱NET(network entity title)
指的是設備本身的網絡層信息,可以看作是一類特殊的NSAP(SEL=00)。NET的長度與NSAP的相同,最多為20個字節,最少為8個字節。在路由器上配置IS-IS時,只需要考慮NET即可,NSAP可不必去關注。
例如有NET為:ab.cdef.1234.5678.9abc.00,其中area address為ab.cdef,system ID為1234.5678.9abc,SEL為00。
4. IS-IS的報文類型
IS-IS報文有以下幾種類型:HELLO PDU(protocol data unit),LSP和SNP
1.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.
2.LSP
鏈路狀態報文LSP用於交換鏈路狀態信息。LSP分為兩種:level-1 LSP和level-2 LSP。level-1 LSP由level-1 IS-IS傳送,level-2 LSP由level-2 IS-IS傳送,level-1-2 LSP則可傳送以上兩種LSP。
3.SNP
序列號報文SNP通過描述全部或部分數據庫中的LSP來同步各LSDB,從而維護LSDB的完整與同步。
5. IS-IS基本原理
IS-IS是一種鏈路狀態路由協議,每一台路由器會生成一個LSP,它包含了路由器所有使能IS-IS協議接口的鏈路狀態信息。通過跟相鄰設備建立IS-IS鄰接關系,互相更新本地設備的LSDB,可以使得LSDB與整個IS-IS網絡的其他設備的LSDB實現同步。然后根據LSDB運用SPF算法計算出IS-IS路由。如果此IS-IS路由是到目的地址的最優路由,則此路由會下發到IP路由表中,並指導報文的轉發。
5.1 IS-IS鄰居關系的建立
兩台運行IS-IS的路由器在交互協議報文實現路由功能之前必須首先建立鄰居關系。在不同類型的網絡上,IS-IS的鄰居建立方式並不相同。
1.廣播鏈路鄰居關系的建立
下圖以level-2路由器為例,描述了廣播鏈路中建立鄰居關系的過程。level-1路由器之間建立鄰居與此相同

a.routeA廣播發送level-2 LAN IIH,此報文中無鄰居標識。
b.routeB收到此報文后,將自己和routeA的鄰居關系標識為inittal。然后,routeB再向routerA回復level-2 LAN IIH,此報文中標識RouterA與RouterB的鄰居。
c.routerA收到此報文后,將自己與routerB的鄰居關系標識為UP。然后routerA再向routerB發送一個標識routerB為routerA鄰居的level-2 LAN IIH。
d.routerB收到此報文后,將自己與routerA的鄰居狀態標識為UP。這樣,兩個路由器成功建立鄰居關系。
因為是廣播網絡,需要選舉DIS,所以在鄰居關系建立后,路由器會等待兩個hello報文間隔,再進行DIS選舉。hello報文中包含priority字段,priority值最大的將被選舉為廣播網中的DIS。若優先級相同,接口MAC地址較大的被選舉為DIS。
2.P2P鏈路鄰居關系的建立
在P2P鏈路上,鄰居關系的建立不同於廣播鏈路。分為兩次握手機制和三次握手機制。
兩次握手機制
只要路由器收到對端發來的hello報文,就單方面宣布鄰居為up狀態,建立鄰居關系。
三次握手機制
此方式通過三次發送P2P的IS-IS hello PDU最終建立起鄰居關系,類似廣播鄰居關系的建立。
兩次握手機制存在明顯的缺陷。當路由器間存在兩條及以上的鏈路時,如果某條鏈路上到達對端的單項狀態為DOWN,而另一條鏈路同方向的狀態為UP,路由器之間還是能建立起鄰接關系。SPF在計算時會使用狀態為UP的鏈路上的參數,這就導致沒有檢測到故障的路由器在轉發報文時仍然試圖通過狀態為down的鏈路。三次握手機制解決了上述不可靠點到點鏈路中存在的問題。在這種方式下,路由器只有在知道鄰居路由器也接收到它的報文時,才宣布鄰居路由器處於UP狀態,從而建立鄰居關系。
3.IS-IS按如下原則建立鄰居關系:
只有同一層次的相鄰路由器才有可能成為鄰居。
對於level-1路由器來說,區域號必須一致。
鏈路兩端IS-IS接口的網絡類型必須一致。
鏈路兩端IS-IS接口的地址必須處於同一網段。
由於IS-IS是直接運行在數據鏈路層上的協議,並且最早設計師給CLNP使用的,IS-IS鄰居關系的形成與IP地址無關。但在實際的實現中,由於只在IP上運行IS-IS,所以是要檢測對方的IP地址的。如果接口配置了從IP,那么只要雙方有某個IP在同一網段,就能建立鄰居,不一定要主IP相同。
5.2 IS-IS的LSP交互過程
LSP產生的原因
IS-IS路由域內的所有路由器都會產生LSP,以下事件會觸發一個新的LSP
鄰居up或down
IS-IS相關接口up或down
引入的IP路由發生變化
區域間的IP路由發生變化
接口被賦了新的metric值
周期性更新
5.2.1 收到鄰居新的LSP的處理過程
1.將接受的新的LSP合入到之間的LSDB數據庫中,並標記為flooding。
2.發送新的LSP到除了收到該LSP的接口之外的接口。
3.鄰居再擴散到其他鄰居。
5.2.2 LSP的泛洪
LSP報文的泛洪是指當一個路由器向相鄰路由器通告自己的LSP后,相鄰路由器再將同樣的LSP報文傳送到除發送該LSP的路由器外的其他鄰居,並這樣逐級將LSP傳送到整個層次內所有路由器的一種方式。通過這種泛洪,整個層次內的每一個路由器就都可以擁有相同的LSP信息,並保持LSDB同步。
每一個LSP都擁有一個標識自己的4字節的序列號。在路由器啟動時所發送的第一個LSP報文中的序列號為1,以后當需要生成新的LSP時,新LSP的序列號在前一個LSP序列號的基礎上加1.更高的序列號意味着更新的LSP。
5.2.3 廣播鏈路中新加入路由器與DIS同步LSDB數據庫的過程

1.如圖所示,新加入的路由器RouterC首先發送hello報文,與該廣播域中的路由器建立鄰居關系。
2.建立鄰居關系之后,routerC等待LSP刷新定時器超時,然后將自己的LSP發往組播地址(level-1:01-80-C2-00-00-14; level-2:01-80-C2-00-00-15)。這樣網絡上所有的鄰居都收到該LSP
3.該網段中的DIS會把收到routerC的LSP加入到LSDB中,並等待CSNP報文定時器超時並發送CSNP報文,進行該網絡內的LSDB同步。
4.routerC收到DIS發送來的CSNP報文,對比自己的LSDB數據庫,然后向DIS發送PSNP報文請求自己沒有的LSP
5.DIS收到該PSNP報文請求后向routerC發送對應的LSP進行LSDB的同步。
在上述過程中DIS的LSDB更新過程如下:
1.DIS接收到LSP,在數據庫中搜索對應的記錄。若沒有該LSP,則將其加入數據庫,並廣播新數據庫內容。
2.若收到的LSP序列號大於本地LSP的序列號,就替換為新報文,並廣播新數據庫內容,若收到的LSP序列號小於本地LSP的序列號,就向入端接口發送本地LSP報文。
3.若兩個序列號相等,則比較remaining lifetime。若收到的LSP的remaining lifetime小於本地LSP的remaining lifetime,就替換為新報文,並廣播新數據庫內容;若收到的LSP的remaining lifetime大於本地LSP的remaining lifetime,就向入端接口發送本地LSP報文。
4.若兩個序列號和remaining lifetime都相等,則比較checksum。若收到的LSP的checksum大於本地LSP的checksum,就替換為信報文,並廣播新數據庫內容;若收到的LSP的checksum小於本地LSP的checksum,就向入端接口發送本地LSP報文。
5.若兩個序列號,remaining lifetime和checksum都相等,則不轉發該報文。
5.2.4 P2P鏈路上LSDB數據庫的同步過程

1.routerA先與routerB建立鄰居關系
2.建立鄰居關系之后,routerA和routerB會先發送CSNP給對端設備。如果對端的LSDB與CSNP沒有同步,則發送PSNP請求索取響應的LSP。
3.如圖所示,假定routerB想routerA索取相應的LSP。routerA發送routerB請求的LSP的同時啟動LSP重傳定時器,並等待routerB發送的PSNP作為收到LSP的確認。
4.如果在接口LSP重傳定時器超時后,routerA還沒有收到routerB發送的PSNP報文作為應答,則重新發送該LSP直至收到PSNP報文。
在P2P鏈路中設備的LSDB更新過程如下:
1.若收到的LSP比本地的序列號更小,則直接給對方發送本地的LSP,然后等待對方給自己一個PSNP報文作為確認;若收到的LSP比本地的序列號更大,則將這個新的LSP存入自己的LSDB,再通過一個PSNP報文來確認收到此LSP,最后再將這個新的LSP發送給除了發送該LSP的鄰居以外的鄰居。
2.若收到的LSP序列號和本地相同,則比較remaining lifetime,若收到的LSP的remaining lifetime 小於本地LSP的lifetime,則將收到的LSP存入LSDB中並發送PSNP報文來確認收到此LSP,然后將該LSP發送給除了發送該LSP的鄰居以外的鄰居;若收到的LSP的remaining lifetime大於本地LSP的remaining lifetime,則直接給對方發送本地的LSP,然后等待對方給自己一個PSNP報文作為確認。
3.若收到的LSP和本地LSOP的序列號相同且remaining lifetime都不為0,則比較checksum,若收到LSP的checksum大於本地LSP的checksum,則將收到的LSP存入LSDB中並發送PSNP報文來確認收到此LSP,燃料后將該LSP發送給除了發送該LSP的鄰居以外的鄰居;若收到的LSP的checksum小於本地LSP的checksum,則直接給對方發送本地的LSP,然后等待對方給自己一個PSNP報文作為確認。
4.若收到的LSP和本地LSP的序列號,remaining lifetime 和checksum相同,則不轉發該報文
