轉載http://blog.sina.com.cn/s/blog_995092640101aw5w.html
深入理解EIGRP
摘要(Abstract):
EIGRP是Cisco發明的一個私有路由協議,由IGRP發展而來,但是算法做了很大的改動.EIGRP和IGRP,RIP一樣是一個採用D-V算法的動態路由協議,在收斂速度,佔用網絡帶寬和系統資源等方面有了很大的改進,且有收斂快,無環路由計算,可以應用於大規模網絡的優點.本文深入描述了EIGRP協議機制細節.
縮略語清單(List of abbreviations):
1 EIGRP協議簡介
EIGRP(Enhanced Inteior Gateway Routing Protocol),即增強型內部網關路由協議.它是Cisco發明的一種動態路由協議,由IGRP協議發展而來,號稱是增強型的IGRP,但實際上除了Metric計算方式和IGRP類似之外,其他方面已經幾乎看不到IGRP的影子.
EIGRP的算法做了很大的改動,雖然和IGRP,RIP一樣是一個採用D-V算法的動態路由協議,但是在收斂速度,佔用網絡帶寬和系統資源等方面有了很大的改進,具有收斂快,無環路由計算,可以應用於較大規模網絡的優點.
1.1EIGRP協議特性簡介
1.多進程機制.一臺路由器上可以運行多個EIGRP協議的進程.各個進程之間用as號來區分.不同進程之間互不干擾,路由信息可以互相引入.和OSPF的多進程不一樣,EIGRP的報文中攜帶有進程號,所以甚至可以在同一鏈路上運行EIGRP的多個進程.
2.使用Hello報文建立並維護鄰居關係.EIGRP的鄰居機制和大部分路由協議類似,鄰居建立後將互相交換路由信息.當網絡上某臺路由器失效時,其他路由器可以快速察覺並響應變化.
3.觸發更新和部分更新.僅在路由信息發生變化時,鄰居路由器之間才進行路由信息的交換,並且只交換髮生了變化的路由信息,這樣可以佔用較小的網絡帶寬.
4.適應較大範圍的網絡.EIGRP的路由度量距離(Metric)是根據網絡延時,帶寬,可靠性,負載等參數計算出來,是一個32bit的數.這樣EIGRP可以較爲準確地反映網絡鏈路的情況,Metric的取值範圍大也可以使EIGRP適應大範圍的網絡.EIGRP比RIP有了廣闊得多的適應範圍,但是一般來說也不應該越過幾十臺的規模,否則將引起效率問題.
5.快速收斂,無環路的DUAL計算.對收到的路由信息使用一種稱爲DUAL的算法進行處理,生成到達各個目標網絡的最短路由信息.EIGRP的路由計算僅會波及到必要的路由和必要的路由器,而不會擴散到全網.DUAL算法的機制可以保證生成的路由是沒有環路的,它的收斂時間也比較好,優於傳統的D-V協議.
6.路由聚合.使用路由聚合以後,對於聚合範圍內的多條路由信息只向外發送一條路由信息,這樣可以減少佔用的網絡帶寬,也減少了對處理器和內存資源的使用.EIGRP既支持自動聚合,又支持任意長度掩碼的手工聚合.
7.路由引入.可以引入靜態路由和其他路由協議(如RIP,OSPF)發現的路由.還可以引入其他EIGRP進程報告的路由.在引入IGRP和EIGRP的路由時,直接使用IGRP和EIGRP路由的度量距離metric.
8.路由策略.在接收,引入,發佈路由時,EIGRP支持使用路由策略對路由進行過濾.
9.多種網絡協議支持.支持IPv4,IPX,AppleTalk這三種網絡層協議.
10.支持不等價負載分擔.EIGRP是目前唯一支持不等價負載分擔的協議,即支持不同metric路由之間的負載平衡.
1.2EIGRP協議的運行機制簡介
EIGRP週期性的使用組播在各個接口上發送一種低開銷的hello報文.收到Hello報文的路由器會把這個路由器加入到自己的"鄰居表"中,於是這兩個路由器會開始進行路由信息交換.以後每次收到Hello報文,路由器則認爲路由器是"活着的",而且可以與之交換信息.當連續一段時間沒有收到對端路由器的Hello報文,那麼就會認爲對端路由器已經失效,將之從鄰居表中刪除,其通告所有路由都隨之變成不可達.
在兩臺已經建立了鄰居關係的路由器第一次交換路由時,它們將交換所有的路由信息:但是在這之後,只有當網絡結構或者路由發生了變化時纔會向外更新變化了的那一部分路由.EIGRP並不象RIP一樣,EIGRP沒有定期更新路由的機制.EIGRP將所有的收到的路由信息存放在"拓撲表"中,包括路由的目的地址,掩碼,下一跳,度量距離(metric)等信息.EIGRP按照DUAL算法從拓撲表中挑選出最佳的,沒有環路的路由,加入到路由表中.
DUAL算法(Diffusing Update Algorithm),散播更新算法,是EIGRP核心內容,也正是DUAL算法保證了EIGRP的路由計算是沒有環路的.DUAL算法使用一個有限狀態自動機(FSM)來描述EIGRP的路由計算過程,這個有限狀態機被稱爲"DUAL狀態機",有限狀態機的機制保證了DUAL算法可以收斂.在後面的描述中提到DUAL這個縮寫時,根據上下文,可能表示DUAL狀態機,也可能表示DUAL算法.
DUAL算法是一種D-V算法.D-V算法,即距離-矢量算法,它的基本思想是:要找一臺路由器到目標網絡的距離,那麼把它到鄰居的距離和鄰居到目標網絡的距離相加,得到經由某個鄰居到目標網絡的距離,然後對所有的鄰居進行計算並從中取最小值,就得到了路由器到目標網絡的最短距離.所有采用D-V算法的路由協議都必須考慮如何避免環路的生成.
所謂"距離",各個動態路由協議的定義是不一致的,例如RIP的定義是到目標網絡所經過的路由器的數目--"跳數".EIGRP針對每條網絡路徑,根據傳輸延時,鏈路帶寬,有效帶寬等參數計算出一個的綜合度量距離(metric),用它來衡量各條路由的優劣.在後文中,提到"距離"這個詞,往往指的是綜合度量距離metric.
就路由器A而言,對一個目標網絡,"可靠後繼"(Feasible Successor,簡稱FS)是指這樣的鄰居路由器B:通過B到達目標網絡有一條路徑,並且B到目標網絡的距離小於A到目標網絡的距離.
而"後繼"指的是某條路由當前正在使用的下一跳
例如在如下的網絡拓撲結構中:
假定:
B-N的距離是10,C-N的距離是100.
A到N的最短路徑是A-B-N,最短距離是30.
那麼對於目標N:
路由器A的可靠後繼有B,但C卻不是它的可靠後繼,
路由器B的可靠後繼有N,但A卻不是它的可靠後繼.
如果B是A的可靠後繼,那麼我們可以確信:路由器A通過路由器B到達目標網絡不會有環路.也就是說,可靠後繼是沒有環路的充分條件.
當網絡發生變化時,DUAL會首先檢測對目標網絡是否還存在可靠後繼:
1.如果存在可靠後繼,那麼使用可靠後繼中最優的一個作爲到達目標網絡的下一跳,沒有必要重新計算路由.
2.沒有可靠後繼,拓撲中也沒有關於此目的地址的路由項,這說明目標網絡已經不可達.
3.沒有可靠後繼,但是拓撲表中還存在到達此目的地址的路由項,即還有相鄰路由器宣稱它可以通往此目的地.這種情況下,相鄰路由器所報告的這條路由不能滿足可靠後繼條件,我們無法對這條路由作出沒有環路的保證.此時不可以採用這個相鄰路由器作爲通往目的地址的下一跳,(因爲不能確保沒有環路),而必須啓動DUAL進行路由重算,這也是一個重新確定可靠後繼的過程.當計算結束時,或者可以找到新的可靠後繼,找到新的可以確保無環路的路由;或者可以確信目標網絡已經不可達.
DUAL算法被稱爲一種散播算法,是因爲它採用一種"分佈的","擴散的"計算方式.具體說來,當一臺路由器對某條路由找不到可靠後繼,開始進行路由重算時,它會向所有鄰居路由器提出"查詢"(Query),這時我們稱這條路由進入了active狀態;等到所有的鄰居路由器都對查詢做出"應答"(Reply)後,這臺路由器纔會根據這些應答計算出新的可靠後繼和新的最佳路由,這時我們稱這條路由回到了passive狀態,這個過程稱之爲"收斂".
當鄰居路由器收到查詢時,它也會檢查自己的可靠後繼條件:若條件滿足,可靠後繼存在,那麼它將馬上對查詢做出應答;若條件不滿足,找不到可靠後繼,那麼它只好先將查詢擱置起來.然後它也會啓動路由重算的過程,會向它所有的鄰居發出查詢,直到它的所有鄰居應答後,它纔會收斂並計算出新的可靠後繼,這時它纔會對先前擱置的查詢做出應答.
可以看出,DUAL是一個不斷向外擴散的計算過程,看起來似乎會越來越多的路由器捲入到計算過程中.但是實際上,DUAL的機制可以保證計算不會被擴散到太遠,計算一般只會波及到必須的路由器;DUAL也可以保證這些發出查詢的路由器不會相互無休止地等待應答,它們都會在比較快的時間內收斂.計算的傳播過程也伴隨着路由信息的傳播,這使EIGRP可以很快的感受到網絡的變化並做出響應.
伴隨着DUAL計算,有許多報文在相鄰路由器之間傳送,這些報文攜帶着EIGRP的路由信息.EIGRP使用Raw IP在相鄰路由器之間傳送報文,因爲Raw IP是一種不可靠的傳輸,所以EIGRP必須建立自身的可靠傳輸體系.EIGRP使用的序號確認,超時重傳等機制確保報文的可靠送達.
注:TCP/UDP類型的套接字只能夠訪問傳輸層以上的數據,因爲當IP層把數據傳遞給傳輸層時,下層的數據包頭已經被丟掉了.而原始套接字卻可以訪問傳輸層以下的數據,所以Raw套接字可以實現上至應用層的數據操作,也可以實現下至鏈路層的數據操作.
只需要簡單瞭解的讀者看看這些就夠了,如果想深入瞭解EIGRP,請繼續向下看.
2 EIGRP的多進程
EIGRP是支持多進程的,在同一臺路由器上,可以運行多個EIGRP的進程,各個進程之間使用進程號(as-number)相區分.
EIGRP每個進程之間是完全獨立的,就像有幾個協議一樣:它們具有獨立的使能網段,獨立的協議配置,獨立的接口配置,獨立的鄰居表,獨立的拓撲表,獨立的報文傳送.進程的運行不會互相干擾,一個進程的運行狀態和其他進程無關.EIGRP甚至可以在同一接口,同一鏈路上運行多個進程.EIGRP的各個進程之間可以相互引入路由.
EIGRP報文頭中包含有as number,EIGRP進程將會丟棄接收到的其他進程(as number)的報文.EIGRP只在具有同一as number的路由器之間建立鄰居關係.
3 報文格式
3.1報文格式描述
EIGRP使用Raw IP來封裝報文,IP頭中協議字段爲88.
EIGRP的報文共分爲Hello,Query,Reply,Update,Request五種,但是其中Request報文目前並沒有使用.EIGRP沒有單獨的確認(ACK)報文,確認消息包含在其他報文中.每種報文又是由一個報文頭加上一個或多個TLV組成.
TLV指Type-Length-Value,指的是由類型,長度,值三部分組成的信息單位.EIGRP目前有8種TLV:Parameter TLV,Authentication TLV,Sequence TLV,Software Version TLV,Next Multicast seq TLV,IP Request TLV,IP Metric TLV,IP Exterior TLV.其中IP Request TLV只用於Request報文,目前並沒有使用.(其實還有一些IPX和AppleTalk網絡使用的TLV,這兩種網絡不常用,所以也不再敘述.)
3.2EIGRP報文頭
所有EIGRP的報文都有如下一個頭部:
字段說明:
Version:協議版本(目前爲2)
Opcod:報文類型
其中Update(1)報文用來更新路由,Request(2)報文目前不再使用,Query(3)報文和Reqly(4)報文用於查詢和應答,Hell0(5)報文用來維護鄰居關係.
報文的具體內容在後續的TLV的描述中會講到.Update(1),Query(3),Reply(4)三種報文的具體用法會在"DUAL算法和DUAL狀態機"詳細描述.
Checksum:校驗和
Flags:標誌(0x01表示INIT,0x02表示CR).INIT標誌表示發送給新鄰居的第一個初始化Update報文,這個報文將攜帶所有的路由信息,而以後的普通的Update報文將只攜帶變化了的路由信息,關於CR(Conditional Receive)標誌,將在"Sequence TLV"部分中講述.
Sequence Number:報文的序列號,用於確認機制,不需要確認的報文,如Hello報文,這個域爲0.
Ack Number:報文攜帶的確認信息.表示已經收到了此序列號的報文.
Autonomous-System Number:自治系統號,一般來說就是進程號.
3.3 EIGRP的TLV基本結構
根據報文的不同類型,在報文頭後面有一個或者多個TLV(Type-Length_value組).每個TLV的基本結構如下圖所示.
字段說明:
TLV Type:表示TLV的類型.其中的高字節爲0表示與網絡層協議無關的TLV類型;爲1表示IP網絡的TLV類型;2表示AppleTalk網絡;3表示IPX網絡.
TLV length:這個TLV的長度,由此來界定各個TLV.這個長度是指整個TLV的長度,包括TLV Length和TLV Length部分.
TLV Value:TLV的內容,具體依據不同的TLV不同.
3.4 Parameter TLV
Parameter TLV被攜帶在Hello報文中,用來指定建立鄰居所需要的一些參數.它的TLV Type爲0x0001,長度爲12字節.格式如下:
字段說明:
K1-K5:計算度量距離的係數K值.
Hold-Time:這個Hello報文的有效時間,若超出這段時間還沒有收到新的Hello報文,則認爲此路由器已經失效,鄰居關係終止.
3.5 Authentication TLV
Authentication TLV用來攜帶認證信息,它的TLV Type爲0x0002,它可能出現在任何報文中.按照Cisco的想法,對一份報文采用多種認證方式,但是目前只採用了MD5認證.
字段說明:
Auth Type:認證類型,目前只有MD5一種類型---0x02.
Auth Length:認證的長度,對MD5來說,認證長度爲0x10.
Auth Data:認證信息.對於MD5來說,又包括Auth KeyID(4字節),Auth Pad(12字節),Auth Digest(16字節)三部分.Auth KeyID默認爲0x00000001,可以在接口上配置;而Auth Pad沒有意義,永遠爲0;Auth Digest包含MD5認證的信息.
3.6 Sequense TLV
Sequense TLV可能出現在Hello報文中,它的TLV Type爲0x0003,它的作用讓某些鄰居路由器進入到CR(Conditional Receive)狀態.
字段說明:
Address Length:地址的長度,對於IPv4地址族,取4
Protocol Independent Address:網絡層地址,對於IPv4地址,它長4字節.
每一組Address Length和Protocols Independent Address,表示了一個鄰居路由器的IP地址,Sequense TLV可以攜帶多個IP地址的列表.凡是接收到這個TLV的鄰居路由器將檢查自己是否在這個列表中,如果不在這個列表中,則把自己置爲CR狀態.只有處於CR狀態的路由器,才能接收帶有CR標誌的報文.(EIGRP報文頭部分中關於Flags字段的說明).
讓我們通過一個例子來了解CR狀態的作用,某路由器R在一個接口上有A,B,C三個鄰居.它向這個接口發送了一個Update報文,然後收到了A,C的確認,但是因爲某種原因沒有收到B的確認,這樣無法知道B是否收到了這份Update報文.此時,路由器R既不想繼續等B的確認;也不希望B在沒有收到第一份Update報文的情況下接收第二份Update報文,因爲這種失序有可能引起混亂.於是,路由器R發了一個帶有Sequense TLV的Hello報文,裏面列出了B的IP地址,這樣A,C就會將自己置於CR狀態,B則會保持正常態.R發出的後續Update報文將在報文頭中打上CR標誌,這樣只有A,C纔會接收到這些報文,而B因爲不是CR狀態,將會忽略帶有CR標誌的報文,這樣就保證了B不會接收到失序的報文.路由器R將在稍後向B依次發送B所錯過的報文.
3.7 Software Version TLV
出現在Hello報文中,它的TLV Type爲0x0004,用來指定EIGRP協議軟件的版本.
字段說明
Sys Major和Sys Minor:系統的主版本號和從版本號.目前分別取1和0.
EIGRP Major和EIGRP Minor:EIGRP的主版本號和從版本號.目前分別取1和0.
3.8 Next Multicast seq TLV
Next Multicast Seq TLV可以出現在Hello報文中,它的TLV Type爲0x0005.它需要和與Sequense TLV配合使用,單獨的Next Multicast Seq TLV沒有意義.
在有Sequense TLV,但沒有Next Multicast Seq TLV時,表示處於CR狀態的鄰居路由器可以接收以後所有帶CR標誌的報文.
在有Sequense TLV和Next Multicast Seq TLV都有時,則Next Multicast Seq TLV指定了一個序列號,處於CR狀態的鄰居路由器只可以接收帶CR標誌,並且序列號爲這個指定序列號的報文.
字段說明:
Seq Number:下一個可以接收的多播報文的序列號.
3.9 IP Request TLV
Request TLV是專用於Request報文,它的TLV Type爲0x0101,表示向對端路由器請求關於某幾個IP網絡地址路由信息.但是現在的EIGRP協議版本沒有使用Request報文.
字段說明:
使用Mask Bit Count和IP Address表示一個網絡地址,這是一種"緊縮"的表示方式.如果表示10.0.0.0/255.0.0.0,那麼Mask Bit Count取8,IP Address長一個字節,置10;如果表示192.2.0.0/255.255.0.0,那麼Mask Bit Count取16,IP Address 長兩個字節,分別置192和2.
3.10 Metric TLV
IP Metric TLV可以出現在Query,Reply,Update報文中,它的TLV Type爲0x0102,用來表示到某個目的地址的EIGRP內部路由及其度量距離.(EIGRP內部路由是指由EIGRP發現,非引入的路由)
字段說明:
Next Hop Forwarding Address:路由的下一跳的IP地址.
灰色標記的部分表示計算一個綜合度量距離Metric的各個要素.
Delay,Bandwidth,MTU,Hop Count,Reliability,Load:依次是總延時,最小帶寬,MTU值,跳數,可信度,負載.
Mask Bit Count和IP Address:目標網絡的IP地址.用"緊縮"的方式(見IP Request TLV中的說明).一個IP Metric TLV中可以有多個目標網絡,表示多條路由信息,它們的下一跳和Metric相同.
3.11 IP Exterior TLV
IP Exterior TLV可以出現在Query,Reply,Update報文中,它的TLV Type爲0x0103,用來表示到某個目的地址的EIGRP外部路由及其度量距離.(EIGRP外部路由是指由EIGRP引入的路由)
字段說明:
Next Hop Forwarding Address:路由的下一跳的IP地址.
上方淺灰色的部分表示EIGRP外部路由信息.
Router ID:引入這條路由的路由器的IP地址
AS Number:引入這條路由的路由器所在的自治系統.
Administrator Tag:可以用來攜帶一組路由映射的標記.
External Protocol Metric:所引入路由在原協議中的Metric值
External Protocol:所引入路由的原協議號.(IGRP爲1;EIGRP爲2;靜態路由爲3;RIP爲4,OSPF爲6;BGP爲9;直連網段爲11)
Flags Field:標誌位(0x01表示EXTERNAL;0x02爲CD).EXTERNAL標誌表示外部路由;CD標誌表示Candidate Default路由.
下方深灰色標記的部分表示計算一個綜合度量距離Metric的各個要素.
Delay,Bandwidth,MTU,Hop Count,Reliability,Load;依次是總延時,最小帶寬,MTU值,跳數,可信度,負載.
Mask Bit Count和IP Address:緊縮格式的目標網絡IP地址,可以有多個,表示多條路由信息.
4 鄰居的發現和維護
首選需要指出的是,EIGRP只會在使能的接口上工作.即啓動EIGRP之後,需要使用Network命令打開相應的接口,這個接口所連網段的路由纔會被EIGRP發佈,同時EIGRP也會向這個接口發送報文並接收來自這個接口的報文.當一個接口被指定爲passive-interface.那麼,這個接口上將既不發送也不接收EIGRP報文(包括Hello報文),但是這個接口所連網段的路由仍然會被其他接口發佈.
鄰居是通過定期發送的Hello報文實現的,相鄰路由器之間通過Hello報文建立鄰居關係,在一段時間內沒有收到報文將清除鄰居關係,路由信息報文的連續發送失敗和一些配置命令也會導致鄰居關係的清除.
4.1 發送Hello報文
EIGRP定期將向開啓的各個接口發送Hello報文,默認每隔5秒鍾發送一次,發送間隔可以根據需要在接口模式下配置.發送採用一個定時器控制.發送使用組播地址224.0.0.10,所有運行EIGRP的路由器將加入這個多播組.
Hello報文不攜帶路由信息,只有as number,係數K值,保持有效時間(Hold-Time)等一些參數,這樣報文比較短小,佔用很少的帶寬資源.Hello報文是不需要確認的,也就是說Hello報文采用不可靠傳輸.
4.2 鄰居的發現
當一臺路由器接收到來自其他路由器的Hello報文時,而且這臺路由器還不在它的鄰居表中,那麼EIGRP將檢查Hello報文中攜帶的as number,係數K值是否與自己的一致,如果一致,將和這臺路由器建立鄰居關係,將其添加到自己的鄰居表中.接收到Hello報文也將刷新一個Hold Time定時器,這個定時器控制鄰居是否超時.
具體來說,鄰居建立的條件有如下:
1.自治系統號相同
2.係數常量相同(K1,K2,K3,K4,K5)
3.在同一個網段上(地址借用除外)
4.3 鄰居建立的握手過程
在收到對端路由器發送過來的Hello報文後,並滿足鄰居建立條件,EIGRP就會與其建立鄰居關係.但是,必須經過三次握手後,纔可以正常的發送和接收路由信息.
如下圖所示:
三次握手示意圖(1)的說明:
1.A發送一個帶INIT標記的UPDATE報文給B.
2.B收到鄰居A發送過來的帶INIT標誌的UPDATE報文後會接着發一個帶INIT標記的UPDATE報文給A,同時這個UPDATE報文中帶有ACK號,應答鄰居A的INIT標記報文.
3.A收到B的帶有INIT標誌的UPDATE報文(有ACK號)以後,會發送一個ACK報文給B.
這時,鄰居關係纔算真正建立起來,可以正常交換剩下的路由信息.
同時,還可以通過如下方式來完成三次握手(如下圖):
三次握手示意圖(2)的說明:
1.A與B同時(或者在沒有收到對方帶INIT標誌的報文前)向對方發送帶INIT標誌的UPDATE報文.
2.A和B在收到對方發送過來的帶INIT標誌的UPDATE報文後,分別向對方發送一個ACK報文,對收到的報文進行確認.
在三次握手過程中,可能會出現一端沒有準備好的情況(例如還沒有從這個路由器收到Hello報文),如下圖所示:
在一方沒有準備好的情況下的三次握手的具體說明:
1.A收到B的Hello報文,與B建立鄰居關係,立即發送一個INIT標誌設置爲1的UPDATE報文,想與B交換拓撲表.
2.但是,B沒有收到A的Hello報文,故無法與A建立鄰居關係,所以收到的帶有INIT標誌的UPDATE報文是來自於未知鄰居,丟棄這個UPDATE報文,不作處理.
3.A重發這個UPDATE報文(注意是超時重發),但是,B在沒有收到A的Hello報文與A建立鄰居關係之前,就不會處理這個UPDATE報文.
4.B收到A的Hello報文,與A建立鄰居關係,立即發送一個INIT標誌設置爲1的UPDATE報文,想與A交換拓撲表.
5.B是A的有效鄰居,所以A收到B的帶INIT標誌的UPDATE報文後,應答和處理這個報文,並且重發自己的初始化UPDATE報文.(超時重發)
6.B再收到A的帶INIT的UPDATE報文後,由於與A正常建立了鄰居關係,能夠正常應答和處理該UPDATE報文.
7.A與B正常交換剩餘的路由信息.
實際上,Cisco的設備在在鄰居建立的三次握手過程中,並不是嚴格按照以上步驟來進行的,如下圖所示:
此過程的說明如下:
1.A發送一個帶INIT標記的UPDATE報文給B.
2.B收到鄰居A發送來的帶INIT標誌的UPDATE報文後,直接發送一個ACK報文給A,對收到的報文進行確認.
3.A三次握手成功,可以正常接收B發送過來的路由信息.
(實際中一般不會出現這種情況,但是可以通過測試程序模擬)
4.4 鄰居的刪除
有下面這幾種情況會導致鄰居的刪除:
1.Hold Time定時器超時,說明在這段時間一直沒有接到這個鄰居的報文;
2.路由信息報文連續重發16次,一直沒有接到對方的確認報文.
3.鄰居對我方發出的查詢在SIA時限內沒有應答;
4.一些配置命令會導致鄰居的清除和重新建立,具體說來如下.
以下命令將清除相應接口上的所有鄰居:
passive-interface
ip authentication key-id eigrp (Csico上無次命令.ip authentication key-chain eigrp)
ip authentication key-string eigrp (Csico上無次命令)
ip authentication mode eigrp
offset-list(配置接口參數) (Csico上無次命令)
ip split-horizon eigrp
ip summary eigrp
以下命令將清除本進程下的所有鄰居:
metric weights
network
distribute-list
offset-list(全局)
auto-summary
5.接口失效時將刪除接口上所有的鄰居.
6.用戶還可以通過命令clear ip eigrp neighbor來手工刪除一個鄰居.
5 EIGRP報文的MD5認證
EIGRP可以配置MD5認證來保證報文的合法性和完整性.如果配置了MD5認證,EIGRP在發送報文時將使用MD5算法對報文生成摘要;在收到報文後,EIGRP將校驗MD5摘要,EIGRP將丟棄認證失敗的報文.
MD5認證是保證報文完整性,合法性的一種重要手段.一般說來,MD5認證按照如下方式進行.
1.雙方協商好一個密碼.
2.報文發送端將密碼填入到報文的某一個字段中,然後按照MD5算法對包含密碼的整個報文進行運算,得到MD5摘要,將生成的摘要填回到同一字段,覆蓋密碼.
3.報文接收端收到報文後,先將摘要字段保存起來,然後也將密碼填入到報文的這個字段中,再按照MD5算法計算,得到摘要.比較這個摘要與先前保存的摘要,如果一樣,就說明報文是合法的.
EIGRP的MD5認證的密碼和摘要是放在Authentication TLV的Auth Digest字段中.和一般報文的MD5認證相比,EIGRP有一點不同:EIGRP進行MD5計算時,只計算一部分的報文內容,報文的最後的20字節(相當於報文頭的長度)不參加計算.如圖
進行MD5認證時,EIGRP將16字節密碼填入到Auth Digest字段中,然後對灰色部分(不包含最後20字節)進行MD5計算,得出16字節的摘要,再將這16字節的摘要填回到Auth Digest字段中.得到經過認證的報文.(以上MD5驗證過程適用於密碼長度小於等於15的情況,密碼長度大於等於16的驗證過程還不詳.)
Cisco在接口上配置認證時給出的是Key-chain的名稱,然後在Key-chain模式下配置Key-id和Key-string.一個Key-chain下面可以配置多組Key-id和Key-string,對於每組Key-id和Key-string,還可以設置各自的有效時段.Cisco在發送認證報文時,使用在有效時段內並且Key-id最小的Key-String作爲密碼字符串;Cisco在接收認證報文時,將使用報文中Auth KeyID字段中指定的值作爲Key-id,查找相對應的Key-string作爲密碼字符串.
6 拓撲表的維護
拓撲表是EIGRP存放路由信息的重要數據結構,DUAL算法,組織報文都是以拓撲表做爲依據的.EIGRP從路由報文,路由聚合,路由引入等不同來源中提取路由信息,並根據這些路由信息進行對拓撲表進行維護.拓撲表的變化將觸發DUAL有限狀態機,以得到新的可靠後繼.
6.1 拓撲表的結構
拓撲表中包含了如下信息:
1.目標網絡地址
2.下一跳(鄰居路由器)的地址,所在接口
3.到目標網絡的最優度量距離(Feasible Distance)
4.鄰居路由器報告的它到目標網絡的度量距離(Report Distance)
5.EIGRP外部路由信息(包括外部路由的來源等)
對於一個目標網絡,拓撲表中可能會有多個下一跳的紀錄,即多條路由紀錄.
度量距離的計算,Feasible Distance和Report Distance的含義將在"FD,RD以及可靠後繼條件"中介紹.
6.2 EIGRP的Metric計算
任何動態路由協議都有自己的尺度來衡量路由的優劣,這就是多次提到的度量距離Metric.在EIGRP中的度量距離Metric是按照如下公式計算得到的:
其中:
K1-K5:係數K值,分別表示帶寬係數,有效帶寬係數,延時係數,可信度係數.默認情況下,K1=K3=1,K2=K4=K5=0.
bandwidth:帶寬衡量值,由路徑上的最小帶寬(Min BandWidth)計算得到.
bandwidth:(10000000/最小帶寬)*256......最小帶寬單位爲kbps
delay:延時衡量值,由路徑上的總延時(Sum of Delay)計算得到.
delay=總延時*256.......................總延時單位爲10微秒
load:鏈路負載,0-255.255表示最大負載.
reliability:可信度,值越大路由越可信.
可以看出在默認情況下:
下面是一個簡單的例子,用來說明Metric的計算:
假設:
A-B網絡的帶寬爲56(kbps),延時爲2000(10微秒)
B-N網絡的帶寬爲10000(kpbs),延時爲100(10微秒)
那麼:
A-B的Metric爲(10000000/56+2000)*256=46226285
B-N的Metric爲(10000000/10000+100)*256=281600
A-B-N的Metric爲(10000000/56+(2000+100))*256=46251885
注意,A-B-N的Metric並不等於A-B和B-N兩段路徑的Metric相加.即在這個算法中"整體"並不等於"部分"的算術相加,但是可以保證"整體"大於任一個"部分"."整體"大於任一個"部分"是D-V算法的基本數學前提.
對接口上的直連網絡,它們的可信度和負載默認是255和1,它們的延時和帶寬根據接口類型的不同分別有一個默認值.
接口上的帶寬和延時可以通過接口模式下的配置命令bandwidth和delay進行修改.
6.3 FD(Feasible Distance),RD(Report Distance)以及可靠後繼條件(Feasible Condition)
拓撲表中每條路由紀錄的都有可靠距離(Feasible Distance)和上報距離(Report Distance)兩項,簡稱FD和RD,分別表示到目標網絡的是優距離和鄰居路由器報告的距離.
繼續上小節中的例子:
很顯然,A到目標網絡N,只有A-B-N這樣一條路由.那麼,A到目標網絡的最短距離,即FD,爲A-B-N的Metric---46251885;而B向A報告的距離,即RD,爲B-N的Metric---281600.
讓我們使用FD和RD再簡單描述一下可靠後繼條件(Feasible Cndition--FC):對給定目標網絡,路由器A的可靠後繼是這樣的鄰居路由器,它向A報告的RD小於A的FD.(對於可靠後繼條件的詳細描述可以參見"可靠後繼條件")
滿足FC條件的鄰居路由器就是可靠後繼(Feasible Succssor).比如說,如果這時有一個路由器C和A也建立了鄰居關係,並且C向A通告:C到達目標網絡N的距離爲20000000.從A的角度,C報告的RD爲20000000,小於自己的FD 46251885,所以C是到目標網絡的可靠後繼.這也說明:通過C到達目標網絡的路徑也許不是最佳的,但是一定沒有環路.如果A-B之間的網絡發生故障,那麼A可以馬上採用C作爲到達目標網絡的下一跳.
如果C向A報告到目標網絡的距離爲50000000,大於A的FD 46251885,那麼C無法滿足可靠後繼條件,也就無法保證A經過C到達目標網絡會沒有環路.那麼,如果A-B發生故障,儘管此時拓撲表中關於還有C到N的路由項,A也不能採納,而是向各個鄰居路由器發出查詢,啓動路由重算的過程.當這個過程結束後,也許會使用C作爲下一跳通向目標網絡(A將相應的更新FD);也許會發現目標網絡已經不可達(這時A的FD爲無窮大).
6.4 拓撲表的變化將觸發狀態機
收到路由信息報文(Update,Query,Reply),接口上的直連網段發生變化,引入其他路由協議的路由,執行路由聚合,這些事件都會產生路由變化信息.路由變化信息將包括:目標網絡地址,下一跳,新的Metric(FD和RD),新的外部路由信息.
EIGRP會根據這些路由變化信息更新拓撲表,保持拓撲表和實際情況的同步.更新拓撲表完成後將觸發DUAL算法,以根據拓撲表的變化計算出新的最佳路由.下面的章節將繼續講述DUAL算法是如何計算得到最佳路由的.
7 DUAL算法和DUA狀態機
7.1 D-V算法和Metric計算
總體上來說,EIGRP採用的DUAL算法仍然是一種D-V算法.也就是說,對於某個目標網絡,路由器是根據鄰居上報的結果,再"加上"本路由器到各個鄰居的"距離",從中比較出最小值,得到本路由器到目標網絡的最短距離和最優路徑.這裏"加上"和"距離"被加上引號是因爲在EIGRP中,它們有特殊的涵義.
在EIGRP中,"距離"指的是綜合度量距離Metric,"加上"也並不代表算術相加.因爲從"EIGRP的Metric計算"中我們可以知道A-B-N的Metrice並不等於A-B的Metric簡單加上B-N Metric,而是根據Metric的各個分量重新計算的結果.這也是爲什麼報文中使用IP Metric TLV和IP Exterior TLV傳遞路由信息時必須傳遞延時,最小帶寬,負載等各個Metric分量,而不只是傳遞一個計算後的Metric值.
事實上,DUAL算法對如何計算Metric,如何衡量路由優劣沒有做出規定.DUAL算法也並不關心Metric是如何計算的,它只要求計算方式可以保證整體大於部分就可,即A-B-N的Metric一定會大於B-N的Metric.所以在後文對DUAL算法的描述中,爲了簡潔起見,我們常採用簡單相加的方式來計算度量距離Metric,這對敘述DUAL算法完全沒有影響.但是在具體描述EIGRP協議時,我們必須明確,Metric值不可以算術相加.
7.2 觸發更新,部分更新機制.
EIGRP的路由更新是通過Update報文實現的.Update報文有單播和多播兩種方式.
1.在兩臺路由器首次建立鄰居關係時,它們會向對方發出帶有"INIT"標誌的Update報文進行初始化(參見"EIGRP報文頭").初始化的Update報文中包含所有的路由信息,即整個數據庫.這個Update報文采用單播的方式傳送.
2.以後,每當路由器的路由發生變化時,路由器將以多播的方式向所有的鄰居路由器發送Update報文,報文中只包含更新的路由信息,即變化了的數據庫.
7.3 可靠後繼條件(FC)
前面已經描述了EIGRP使用的可靠後繼條件:鄰居報告的RD小於自己的FD.用反證法不難證明,這個條件是沒有路由環路的充分條件.
可靠後繼條件是DUAL的重要內容之一,但是事實上,DUAL算法提出的可靠後繼條件並不是唯一的.在參考資料"Loop-Free Routing Using Diffusing COmputaion"這篇論文中,作者J.JGarcia-Lunes_Aceves一共描述了三個可靠後繼條件:
1.DIC(Distance Increase Condition)
這個條件稱爲距離增加條件.也就是說如果在任何時候,如果路由器A發現鏈路的COST減少,或者鄰居上報到目標的距離減少,這時A可以隨意在當前所有鄰居中選擇具有最優路由的鄰居作爲下一跳,這時可以保證沒有環路發生.否則則不能保證.
DIC還有一個不那麼嚴格的版本.也就是說,如果A發現到鏈路或鄰居的Metric增加,只要A還能找到一個鄰居路由,經過個鄰居路由器到達目標網絡的距離最小,並且小於等於原來的最優距離(A到目標網絡在這段時間的最小值),那麼A仍然可以將這個鄰居作爲自己的下一跳路由器,這時可以保證沒有環路的發生.如果找不到這樣的鄰居路由器,那麼A就無法保證無環路條件.
這個條件的充分性是很顯然的,如果發生路由變化後,本路由器到目標網絡的最優距離和原來相比沒有增大,而一定不會有環路的發生.
DIC條件可簡單概括爲:新的最優距離小行等於原來的最優距離.(FD<=old_FD)
2.CSC(Current Successor Condition)
這個條件稱爲當前後繼條件.具體來說,假設路由器A原來的後繼是路由器B,如果當路由發生變化時,假設這段時間內B到目標網絡的最小值是S.如果路由器A可以找到這樣一臺路由器X,首先A經過X到目標網絡是最近的,並且X到目標網絡的距離小於等於S(原來的後繼B到目標網絡距離的最小值).那麼A就可以將X作爲自己的新的後繼,這個時候是可以保證沒有環路的.如果找不到這樣的路由器X,那麼就不能保證找到無環路的路由.
這個條件顯然也是充分的.新的後繼X到目標網絡比原來的後繼B更近,說明X到目標網絡是不可能繞回路由器A形成環路的,A到X是直連,所以綜合起來也不會形成環路.
CSC條件可以簡單概括爲:新的後繼到目標網絡的距離小於等於原來後繼到目標網絡的距離.(RD<=old_RD)
3.SNC(Source Node Condition)
SNC就是我們所敘述的條件,也是目前Cisco EIGRP所採用的.
這個條件稱爲源節點條件.也就是說,如果路由器A到目標網絡可以找到這樣一臺路由器X,首先A經過X到目標網絡是最近的,並且X到目標網絡的距離小於原來的最優距離(A到目標網絡在這段時間的最小值).
這個條件也是充分的,因爲新的後繼X到目標網絡的距離小於A到目標網絡的距離,那麼X就不可能是繞回A到目標網絡的,所以A經過X到目標網絡不會形成環路.
注意到這個條件是三個條件中唯一判斷"小於"的條件,DIC和CSC都是判斷"小於等於".這是因爲SNC在等於的情況下不能確保無環路的發生.
這個條件比前2個條件相比更加寬鬆一些,因爲它畢竟是RD和FD的比較,並不加上原來A到鄰居的距離.也正是因爲這樣的原因,這個條件更加具有實用性,被Cisco用來作爲EIGRP協議DUAL算法的基本判斷條件.實際上,前2個條件在前人的論文中都進行過闡述,J.J.Garcia-Lunes_Aceves的這篇論文着重闡述並證明了SNC.
SNC條件可以簡單的概括爲:新的後繼到目標網絡的距離小於原來的最優距離.(RD<old_FD)
7.4 可靠後繼條件中必須判斷最優後繼
在Cisco的很多資料中,一般都只強調了RD<FD這個條件,實際上,在論文中的描述三個條件時都強調了鄰居路由器必須先滿足到目標網絡最優這個條件.論文中的條件是更加嚴謹的,因爲路由優選是所有路由協議遵守的基本原則.
簡單說,在判斷路由器是否可以收斂時,只有同時滿足2個條件才能認爲滿足可靠後繼條件:1)有鄰居路由器RD<FD;2)經過這些鄰居路由器中有最優路徑.也就是說需要保證最優後繼一定在可靠後繼中.
如下圖:
在初始時,A選擇B到達目標網絡N,FD是4.如果僅根據RD<FD條件,B和C分別都是A的可靠後繼,D不是可靠後繼,在穩定的情況下這樣也不會有什麼問題.
此時:B到目標網絡的鏈路突然中斷,B會向A發出Query.A需要判斷是否可以收斂,假設A僅檢查RD<FD條件,那麼將會存在可靠後繼C,收斂.
但是:這時如果選擇C作爲下一跳,不符合路由協議的優選原則,畢竟經過C更加遠.如果選擇D作爲下一跳,則不清楚D到目標網絡是否會有路由環.(因爲D並不滿足RD<FD條件)
所以說:判斷是否可以收斂時,可靠後繼條件中必須保證先滿足最優後繼條件,在這種條件下此時應該認爲所有路由器都不滿足可靠後繼條件,此時A不能收斂,將發起查詢.
7.5 使用查詢應答機制進行DUAL計算.
實際上,無論使用三個可靠後繼條件中的哪一個,都只能保證路由無環路.DUAL算法就是一種利用這種無環路條件,結合了有限狀態機機制,計算得到網絡的最佳路由的算法.
DUAL算法被稱爲擴散更新算法,是因爲它採用了一種擴散更新機制.也就是說一個結點開始計算時,路由器就向外發出查詢(Query),計算可能會不斷向外擴展,然後通過收到應答(Reply)而結束計算.
擴散更新機制的實質就是通過這種查詢進行路由計算的擴散,然後通過應答實現計算結果的收斂.
7.5.1 被動態(Passive)和主動態(Active)
一條路由在穩定時稱爲"被動態(Passive)";發出查詢後這條路由就進入到了"主動態(Active)";收到所有答覆,路由重新找到了可靠後繼,計算收斂,那麼它又回到了"被動態".
7.5.2 DUAL算法的啓動
當路由器的數據庫因爲某種原因發生了變化,那麼路由器將針對變化了的路由進行可靠後繼條件(FC)的檢查,如果還存在可靠後繼,那麼使用可靠後繼中最好的一個做爲目標網絡的下一跳;如果沒有可靠後繼,那麼則向所有的鄰居發出查詢(Query),並等待所有鄰居的應答(Reply).
7.5.3 查詢(Query)
查詢是通過組播方式向所有的鄰居發送Query報文,報文中使用IP Metric TLV和IP Exterior TLV來描述各條需要查詢的路由信息,內部路由使用IP Metric TLV,外部路由使用IP Exterior TLV,這些TLV中的Metric是啓動查詢時刻的FD值.
7.5.4 應答(Reply)
應答指通過單播方式的向發起查詢的路由器發送Reply報文,報文中使用IP Metric TLV和IP Exterior TLV來描述應答的路由信息.
路由器接到查詢後並不是馬上應答,它會首先根據查詢報文更新自己的數據庫.
更新數據庫後,如果被查詢的路由處於Passive態,那麼EIGRP將檢查這條路由的FC條件:FC條件滿足,選擇出最優的可靠後繼,並馬上對查詢者發送Reply報文;FC條件不滿足,將查詢擱置起來,同時路由也進入到Active狀態,並向所有的鄰居路由器發出查詢.直到路由收斂,纔會對擱置的查詢進行應答,向查詢者發送Reply報文.
更新數據庫後,如果被查詢的路由正處於Active態,那麼將檢查查詢者是否爲這條路由目前正在使用的後繼:若查詢者不是後繼,那麼直接按照數據庫中的FD向查詢者發送Reply報文;若查詢者是後繼,那麼擱置查詢,等待這條路由收斂,回到Passive態時,再對查詢者發送Reply報文.
7.5.5 收斂
路由器的某條路由在發起查詢後,必須等待所有鄰居路由器的Reply報文,在此期間此路由的FD值保持不變.當收到了一份Reply報文,EIGRP會按照Reply報文中的路由信息更新數據庫.當收到了所有鄰居的Reply報文後,DUAL將從數據庫中找到最佳的後繼,將它作爲到目標網絡的下一跳,並觸發對路由表的修改.(在某些情況下,收到所有的Reply後,DUAL將重新檢查FC條件,若FC條件不滿足,仍然無法保證找到無環路的路由,此時DUAL將對這條路由再次發起查詢,重新開始計算.這種情況將在下面"DUAL狀態機描述"中說明.)
讓我們看一下簡單的例子.爲了簡潔,例子中的Metric計算採用簡單算術相加的方式.
如下面的網絡拓撲結構:
已知:
B-C的Metric爲30;B-A的Metric爲10;C-A的Metric爲15;A-N的Metric爲6.
那麼對於目標網絡N:
A-N的最短路徑就是A-N,Metric爲6,N是A的直連網段,不存在可靠後繼;
B-N的最短路徑是B-A-N,Metric爲16,A是B的可靠後繼(6<16),C不是B的可靠後繼(21>16);
C-N的最短路徑是C-A-N,Metric爲21,Aj是C的可靠後繼(6<21),B也是C的可靠後繼(16<21);
假定一:在某個時刻:C-A之間的鏈路中斷,即C-A的Metric變成不可達.
那麼:
1.C發現自己還有可靠後繼B,B是C唯一的(當然也是最優的)可靠後繼,C直接使用B作爲到達目標網絡的下一跳,C更新了自己的路由表.
2.B,A沒有收到任何影響.
假定二:在某個時刻,B-A之間的鏈路中斷,即B-A的Metric變成不可達.
那麼:
1.B發現失去了唯一的可靠後繼A,B找不到可靠後繼了,B進入Active態,向C發出了Query.
2.C收到了B的Query,發現自己還有可靠後繼A,C沒有進入到Avtive狀態,C馬上向B發送Reply,告訴B這條路由.
3.B收到C的Reply,也就是收到全部的Reply,B收斂,回到Passive態.B從當前的數據庫中找到了最優項(即C)作爲下一跳並更新路由表,B也將C確定爲新的可靠後繼.
假設三:在某個時刻,A-N之間的鏈路中斷,即A-N的Metric變成不可達.
那麼
1.首先,對於目標網絡N,A沒有可靠後繼,A在數據庫中將N標記爲不可達,進入到Active狀態,向C,B發出Query,Query中說明自己對N已經不可達.
2.C收到A的Query,發現自己還有可靠後繼B,於是將路由改爲C-B-N,Metric爲46(16+30),然後按照46的向A發送Reply.A收到了C的Reply,知道C-N有一條Metric爲46的路由,但是A沒有使用這條路由,也沒有改變自己的FD,A還在等B的Reply.
3.B收到了A的Query,發現自己沒有可靠後繼了,於是B擱置A的查詢,在數據庫中將目標網絡標爲不可達,然後進入到Active狀態,按照不可達向C,A發出Query.
4.A收到了B的Query,因爲A處於Active狀態並且B不是A的後繼,所以A馬上向B發送Reply,說明到目標網絡N不可達.但是B還在等待C的Reply.
5.C收到了自己的後繼發來的Query,發現自己沒有其他可靠後繼了(A,B都用Query報文通告到目標網絡不可達),於是C擱置B的查詢,然後將N標記爲不可達,進入到Active狀態,並向A,B發出了Query報文.
6.B,A都收到了C發來的Query,因爲B和A都處於Active狀態,並且C不是他們的後繼,所以它們馬上向C發送Reply,表示到N不可達.特別對於A,A曾經收到過C的一份Reply報文,說C到N有一條Metric爲46的路由,這份Query報文使A的數據庫中進行了更新,將"C-N(46)"改成了"C-N(不可達)".
7.C收到了A,B的Reply,這時所有的鄰居都應答了.C收斂,回到了Passive狀態,根據目前C的數據庫,C知道到N已經不可達(因爲沒有鄰居還可以通向N).於是C更新路由表,將到N的路由刪除.最後,因爲C還擱置了B的查詢,所以C向B發出了"N不可達"的Reply.
8.B收到了C的Reply,這時B的所有鄰居也都應答了.B收斂,回到了Passive狀態,根據目前B的數據庫,B知道到N已經不可達(因爲沒有鄰居還可以通向N).於是B更新路由表,將到N的路由刪除.最後,因爲B還擱置了A的查詢,所以B向A發送了"N不可達"的Reply.
9.A終於等到所有的鄰居應答了,A收斂,回到了Passive狀態.同樣的,A知道到N已經不可達,於是A更新路由表,將到N的路由刪除.
注1:以上是沒有采用"水平分割"時的情況,如果採用"水平分割",情況會少許簡單一些.(具體可以參考"水平分割")
注2:當DUAL計算收斂(完成後),更新路由表時,EIGRP會使用Update報文來向各個鄰居路由器通告路由更新信息.在這個例子中,因爲收到Update報文不會再對數據庫進行修改,所以DUAL算法不會被再次觸發.
7.6 DUAL狀態機描述.
上面的敘述只是對DUAL算法的一個大體描述,散播計算的具體過程要更加複雜.下面我們通過DUAL狀態機對散播計算的過程進行詳細的,完整的描述.
7.6.1 DUAL狀態機的狀態
對於某一條路由,DUAL狀態機一共有5種狀態,其中1種是被動態(Passive),另外4種是不同的主動態(Active).下面是這五種狀態的說明:
Passive:路由處於穩定狀態下,沒有進入查詢,或者再查詢後收到了所有鄰居的應答而收斂.
ACT0:本路由器是查詢的最初發起者,並且再發起查詢後,至少經歷的一次"距離增加",但沒有收到過後繼發來的查詢.
ACT1:本路由器是查詢的最初發起者,並且再發起查詢後,沒有經歷過的"距離增加",也沒有收到過後繼發來的查詢.
ACT2:情況一,本路由器因爲收到了後繼的查詢而發起查詢(原ACT3),進入了主動態,在發起查詢後,至少經歷過一次"距離增加";情況二,本路由器是查詢的最初發起者,發起查詢後,又收到了後繼發來的查詢(原ACT1).
ACT3:本路由器因爲收到了後繼的查詢而發起查詢,進入了主動態,在發起查詢後,沒有經歷過"距離增加".
所謂"距離增加"是指收到後繼發出的Update報文,後繼上報的Metric(即RD)比以前增加了,顯然本路由到目標網絡的Metric也將隨之增加.這種情況下,有可能本路由器將找到其他更優的路徑,從而改換後繼;也有可能後繼上報的路由已經不可靠,發生了環路.
可以看出ACT0和ACT2兩種狀態,是經歷了"距離增加"的.在這種情況下,等收到了所有鄰居應答時,不可以直接從數據庫中挑出最佳,而必須再進行一次FC條件測試.條件滿足,收斂,找到最佳後繼;條件失敗,重新發起查詢.
7.6.2 DUAL狀態機的狀態轉換
下面將就DUAL狀態機狀態轉換圖的各個狀態轉換過程做一個詳細的說明:
7.7 Stuck In Active(SIA)功能
在正常情況下,按照DUAL算法和DUAL狀態機,一條路由進入到Active狀態後,能夠在較快的時間內收斂,回到Passive狀態,但是,因爲某種原因,某條路由可能會長時間滯留在Active狀態,沒有收斂,這種情況我們稱之爲Stuck In Active,簡稱SIA.
引起SIA的可能原因有:
1.網絡不暢通,路由器可以收到Hello報文,但是較大的Query,Reply報文傳輸總是失敗.
2.某些路由器處理速度慢,吞吐量小或者內存不夠,在大量路由發生變化時成爲了瓶頸,來不及處理或來不及發出報文.
3.報文錯誤.可能是因爲某臺路由器實現EIGRP協議及DUAL算法時存在錯誤,也可能是存在惡意的錯誤報文.
EIGRP提供了SIA時限的機制.也就是說,一條路由在進入到Active狀態後,如果在規定時間內沒有收斂(默認的時限是3分鐘),那麼EIGRP將強制它收斂.即不再等待剩下的沒有應答的鄰居,而是按照目前已經收到的應答來計算路由,那些沒有應答的鄰居將被從鄰居表中清除.(當然,可以通過Hello報文來再次建立鄰居關係)
7.8 DUAL算法的性能.
J.J.Garcia-Lunes_Aceves在論文中將DUAL算法和L-S算法(Link State Routing鏈接-狀態路由算法),傳統D-V算法在性能上進行了綜合比較,比較中考慮了節點失效,節點恢復,鏈路失效,鏈路恢復這四種網絡中常見的動盪,考察了這4種情況下三種算法收斂速度,消息數目待方面的性能.
他的分析結果顯示,L-S算法在計算量上遠遠超過其他2種算法,這是L-S算法的原理決定的.在其他方面,DUAL一般都優於傳統D-V算法.在節點恢復,鏈路恢復時,DUAL算法和L-S算法的差距不大,但是在節點失效,鏈路失效這2種情況時,DUAL要遜於L-S算法.實際上,L-S算法在各種情況下的表現基本一致,在各種失效的情況下具有優勢.
綜合來看,DUAL算法達到的指標超過傳統D-V算法,稍遜於L-S算法.
在實際應用中,DUAL算法在大規模的網絡中性能比L-S算法要有明顯差距,這主要是因爲DUAL算法需要在一個較大範圍內進行查詢擴散並依次向回收斂;而L-S算法在完成路由信息擴散之後,各節點分別在本地計算路由,在大規模網絡中更加具有優勢.
8 報文發送和可靠傳輸
EIGRP使用Raw IP發送報文,IP頭的協議字段爲88.由於IP協議是不能夠保證可靠傳輸的,故EIGRP需要建立自己的可靠傳輸機制.
並非所有EIGRP報文都要保證可靠傳輸,Hello報文就不需要,而Query,Reply,和Update報文則必需要保證可靠傳輸.EIGRP使用了序號確認和超時和重傳機制保證報文傳輸的可靠性.同時爲了充分利用多播以保證發送效率,EIGRP還採用了流控,鏈路帶寬限制等技術.這些使得EIGRP的報文發送過程變的十分複雜.
8.1 單播報文和多播報文
EIGRP發送的報文即有單播報文也有多播報文,EIGRP使用多播報文以儘量減少報文數據,在不能使用多播的情況下使用單播報文.
EIGRP發送的單播報文有:
1.Reply報文.當收到一個Query報文後,EIGRP要向查詢者發送一個Reply應答報文.這個應答報文采用單播發送.
2.初始化的Update報文.兩臺路由器剛建立起鄰居關係,便要互相交換路由信息,這些交換的路由信息是通過單播發送Update報文來實現的.
3.重傳報文.當一臺路由器向鄰居發送多播Update或者Query報文而未收到鄰居的確認信息時,EIGRP會向未確認的鄰居發送重傳報文,和重傳報文總是採用單播發送.
4.Ack信息:Ack信息可以攜帶在其他單播報文中發送,也可以單獨使用單播發送.
EIGRP發送的多播報文包括:
1.Hello報文.EIGRP在使能的各個接口上使用多播地址向外週期性發送Hello報文.
2.Update報文.除了初始化的Update報文以外,其他路由信息變化時的Update報文都是採用多播的方式發送的.
3.Query報文.Query報文總是採用多播方式來發送.
對於多播報文,發送後不會進行重傳,多播報文的序號確認和可靠重傳被分解成各個單播報文進行.也就是說,EIGRP在發送完多播報文後,將分別等待各個鄰居的確認,分別給超時的鄰居進行重傳,重傳總是採用單播的方式進行.爲了保證重傳過程的效率,以及保證每一個鄰居都可以按照正確的順序接收報文,EIGRP採用了"流控"和"選擇接收(CR)"等處理方式,具體可以參見"流控"和"Sequense TLV"等章節的說明.
8.2 報文發送策略過濾
在生成EIGRP報文的過程中,EIGRP可能會對路由信息進行過濾或改變:
1.EIGRP可以根據distribute-list的配置對發送報文進行過濾,可以禁止某些路由的發送.
2.EIGRP可以根據offset-list out的設置改變向外發佈路由的Metric值,可以給某些路由的Metric中的延時分量加上一個偏移量.
3.EIGRP如果在接口上採用了"水平分割(Horizon Split)",將會按照水平分割的要求過濾一些路由信息.(詳見"水平分割")
4.EIGRP如果在接口上配置了路由聚合(包括自動聚合和手工聚合),那麼將只發送生成的那條聚合路由,其他在聚合範圍內的路由不會再被髮送.(詳見"路由聚合")
8.3 序號確認
EIGRP中,只有可靠傳輸的報文需要對方在接收報文後確認,不可靠傳輸則不需要.
採用可靠傳輸的報文,在EIGRP報文頭中的Sequense Number字段中將填入一個順序遞增的序列號,不可靠傳輸的Sequense Number字段爲0(參見"EIGRP報文頭"部分).當對端收到報文後,會對該序號進行確認,以通知發送方接收方已經收到報文,不需要再進行重傳.確認時將被確認的序號填寫在EIGRP報文頭中的ACK Number字段中.
EIGRP沒有單獨的確認報文類型,確認信息是攜帶在其它報文類型中(所有的報文類型都可以攜帶ACK信息).當報文不攜帶確認信息時,ACK Number字段爲0.
如果Ack報文采用Hello報文類型單獨發送,這種Hello報文被稱爲Ack報文.Ack報文是一種特殊的Hello報文,它與前面所述的建立並維護鄰居關係的Hello報文是有一些區別的:
8.4 超時重傳
可靠傳輸的報文在發送出去一段時間後,如果沒有得到鄰居的應答,那麼就會重傳該報文.重傳16次後如果還沒有應答,就將該鄰居復位.
報文發送後到重傳該報文之間的這段時間稱爲超時重傳時限(Retransmit Time Out,RTO),RTO的計算參照TCP的方法確定(參見RFC793).按照<<EGIRP網絡設計>>一書中的描述,具體來說是這樣的.
1.每次發送報文成功,則根據報文的往返時間來計算RTO,計算方法如下(單位毫秒):
RTT(Round Trip Time往返時間):從發出報文到收到ACK所需要的時間.
SRTT(Smoothed Round Trip Time平滑往返時間,對往返時間的平均估算),每收到一次ACK報文:
SRTT(new)=0.8*SRTT(old)+0.2*RTT
那麼:
RTO(Initial)=6*max(SRTT,PacingInterval)
即一般來說,RTO爲SRTT的6倍.
2.在每一次因爲RTO超時而重發報文後,重傳時間將越來越長,下一次的重傳時間爲:
RTO(New)=RTO(Old)*1.5
RTO(Final)=min(5000,Max(200,RTO(Computed)))
即每次RTO乘以1.5,但是最小200毫秒,最大5秒.
8.5 水平分割(Horizon Split)
水平分割(Horizon Split)是在很多D-V算法的路由協議中都有的一個概念,指的是:"從某個接口上收到的路由信息不再向這個接口發送".
在前面"使用查詢應答機制進行DUAL計算"的例子中,如果所有的路由器的所有接口都配置了水平分割,那麼當A-N鏈路中斷時:
A-N的Metric變爲不可達,並且沒有可靠後繼,A進入Active狀態,向B,C發送Query.
B沒有可靠後繼,進入Active狀態,向A,C發送Query.這時水平分割發生作用,向A發送的Query報文不會發出,B只向C發送了Query,並且只會等待C的應答.(如果水平分割不發生作用,B向A發出了Query,A也會馬上應答,在結果上沒有區別)
可以看出,水平分割可以�t" style="margin-bottom:5px;border:0px;list-style:none;line-height:21px;font-family:simsun;font-size:14px;"> 如果Ack報文采用Hello報文類型單獨發送,這種Hello報文被稱爲Ack報文.Ack報文是一種特殊的Hello報文,它與前面所述的建立並維護鄰居關係的Hello報文是有一些區別的:
8.4 超時重傳
可靠傳輸的報文在發送出去一段時間後,如果沒有得到鄰居的應答,那麼就會重傳該報文.重傳16次後如果還沒有應答,就將該鄰居復位.
報文發送後到重傳該報文之間的這段時間稱爲超時重傳時限(Retransmit Time Out,RTO),RTO的計算參照TCP的方法確定(參見RFC793).按照<<EGIRP網絡設計>>一書中的描述,具體來說是這樣的.
1.每次發送報文成功,則根據報文的往返時間來計算RTO,計算方法如下(單位毫秒):
RTT(Round Trip Time往返時間):從發出報文到收到ACK所需要的時間.
SRTT(Smoothed Round Trip Time平滑往返時間,對往返時間的平均估算),每收到一次ACK報文:
SRTT(new)=0.8*SRTT(old)+0.2*RTT
那麼:
RTO(Initial)=6*max(SRTT,PacingInterval)
即一般來說,RTO爲SRTT的6倍.
2.在每一次因爲RTO超時而重發報文後,重傳時間將越來越長,下一次的重傳時間爲:
RTO(New)=RTO(Old)*1.5
RTO(Final)=min(5000,Max(200,RTO(Computed)))
即每次RTO乘以1.5,但是最小200毫秒,最大5秒.
8.5 水平分割(Horizon Split)
水平分割(Horizon Split)是在很多D-V算法的路由協議中都有的一個概念,指的是:"從某個接口上收到的路由信息不再向這個接口發送".
在前面"使用查詢應答機制進行DUAL計算"的例子中,如果所有的路由器的所有接口都配置了水平分割,那麼當A-N鏈路中斷時:
A-N的Metric變爲不可達,並且沒有可靠後繼,A進入Active狀態,向B,C發送Query.
B沒有可靠後繼,進入Active狀態,向A,C發送Query.這時水平分割發生作用,向A發送的Query報文不會發出,B只向C發送了Query,並且只會等待C的應答.(如果水平分割不發生作用,B向A發出了Query,A也會馬上應答,在結果上沒有區別)
可以看出,水平分割可以減少報文人,減少對網絡帶寬的,減少等待收斂的時間.
水平分割可以減小產生路由環的可能性,但是在某些NBMA網絡上可能會造成路由信息的丟失,這種情況下應該在接口上禁用水平分割.
8.6 流控(Flow Control)