天天看點

《分布式系統:概念與設計》一3.3.5 路由

路由是除了區域網路以外,例如以太網(區域網路在所有相連的主機間兩兩都有直接連接配接),其他網絡都需要的功能。在大型網絡中,采用的是自适應路由,即網絡兩點間通信的最佳路由會周期性地重新評估, 圖3-7 廣域網中的路由評估時會考慮到當時的網絡流量以及故障情況(如路由器故障或網絡斷鍊)。

《分布式系統:概念與設計》一3.3.5 路由

如圖3-7所示,在網絡中将資料包傳遞到目的位址是處于連接配接點的路由器的共同責任。除非源主機和目的主機都在同一個區域網路中,否則資料包都必須經過一個或多個路由結點,輾轉多次才能到達。而決定資料包傳輸到目的位址的路由是由路由算法負責的——它由每個結點的一個網絡層程式實作。

路由算法包括兩個部分:

1)它必須決定每個資料包穿梭于網絡時所應經過的路徑。在電路交換網絡層(如x.25)和幀中繼網絡(如atm)中,一旦建立虛電路或連接配接,路由也就确定了。98在包交換網絡層(如ip)中,資料包的路由是單獨決定的。如果希望不降低網絡性能,算法必須特别簡單有效。

2)它必須通過監控流量和檢測配置變化或故障來動态地更新網絡的知識。在這種活動中,時間并不是至關重要的,可以使用速度較慢但計算量較大的技術。

這兩個活動分布在整個網絡中。路由是一段一段決定的,它用本地擁有的資訊決定每個進入的資料包下一步的方向。本地擁有的路由資訊依靠一個分發鍊路狀态資訊(它們的負載和故障狀态)的算法定期更新。

一個簡單的路由算法 我們在這裡描述的是“距離向量”算法。這将為3.4.3節中讨論鍊路-狀态算法提供基礎,而鍊路-狀态算法從1979以來就成為網際網路上主要的路由算法。網絡中的路由是在圖中尋找路徑問題的一個執行個體。bellman的最短路徑算法[bellman 1957]早在計算機網絡出現之前就發表了,它為距離向量法提供了基礎。bellman的方法已被ford和fulkerson[1962]改寫成一個适合大型網絡實作的分布式算法,而基于他們的工作成果的協定常常被稱為“bellman-ford”協定。

圖3-8給出了圖3-7的網絡中每個路由器中儲存的路由表,其中假設網絡中沒有出故障的鍊路和路由器。路由表的每行為發送給定目的位址的資料包提供了路由資訊。鍊路域為發送到指定目的地的資料包指明了下一段鍊路。開銷域計算向量距離,99或到達目的地的跳數。對于具有相似帶寬的鍊路的存儲轉發網絡,這張表對一個資料包傳輸到目的地所需的時間給出了合理估計。存儲在路由表中的開銷資訊并不是路由算法的第1部分所采取的包路由動作中使用的,而是在算法的第2部分建立和維護路由表時使用。

《分布式系統:概念與設計》一3.3.5 路由

路由表中為每個可能的目的地單獨設定一項,給出了資料包到達目的地而要采取的下一跳(hop)。當資料包到達一個路由器時,就會抽取目的位址并在本地路由表中查找該位址。路由表中的表項給出了指引資料包發送到目的要經過的下一個鍊路。

例如,一個目的地為c的資料包從路由器a開始發送,路由器在路由表中檢查有關c的項。路由表表明資料包應該從a沿标号為1的鍊路路由。資料包到達b後,按照前述的過程,在b的路由表中查詢,發現需要經過标号為2的鍊路路由到c。當資料包到達c時,路由表中的相關項顯示“本地”,而不是一個鍊路号。這表明應該将資料包發送到本地主機上去。

現在讓我們來考慮一下怎樣建立路由表,以及在網絡發生故障時怎樣維護路由表,即上面所說的路由算法的第2部分是怎樣完成的。因為每個路由表隻為每個路由指定一跳,是以路由資訊的建構或修正就可以按分布的方式進行。每個路由器使用路由器資訊協定(router information protocol,rip)通過發送自己路由表資訊的概要和鄰接結點互相交換網絡資訊。下面簡要描述一下路由器所完成的rip動作:

1)周期性地并且隻要本地路由表發生改變,就将自己的路由表(以概要的方式)發給鄰接的所有可通路的路由器。也就是說,在每個沒有故障的鍊路上發出一個包含路由表副本的rip資料包。

2)當從鄰接路由器收到這樣的表時,如果接收到的表中給出了到達一個新目的地的路由,或對于已有的一個目的地更好(開銷更低)的路由,則用新的路由更新本地的路由表。如果路由表是從鍊路n接收到的,并且表中給出的從鍊路n開始到達某地的開銷和本地路由表中的不相同,則用新的開銷替換本地表中已有的開銷。這樣做的原因是,新表是從和相關的目的地更近的路由器傳來的,是以對經過該路由器的路由而言更加有權威性。

圖3-9給出的僞代碼程式将更準确地描述這個算法,其中tr是從另一個路由器接收到的表,tl是本地路由表。ford和fulkerson[1962]已經證明,無論何時網絡發生變化,上面描述的步驟都能充分確定路由表收斂到到達每個目的地的最佳路由。即使網絡沒有發生變化,也會以頻率t來傳播路由表,以確定其穩定性,例如,要在丢失rip資料包的情況下保證穩定性。網際網路采用的t值是30s。

《分布式系統:概念與設計》一3.3.5 路由

為了處理故障,每個路由器都監控着自己的鍊路并做以下的工作:

當檢測到一條有故障的鍊路n時,将本地表中指向故障鍊路的所有項的開銷都設為無窮大(∝),并執行send動作。

這樣,一個斷開的鍊路資訊被表示成通往相關目的地的開銷值是無窮大。當這一資訊傳播到鄰接路由器時,它們的路由表也将根據receive動作進行更新(注意:∝+1=∝),然後繼續傳播直到有路由到相關目的地的結點。最終,具有可用路由的結點将會傳播其路由表,它的可用路由也将替代所有結點上的故障路由。

向量-距離算法可以用多種方法進行改進。開銷,也被稱為度量,可以根據鍊路的實際帶寬來計算;可以修改算法,以增加資訊收斂的速度,并避免那些在達到收斂前可能出現的不希望出現的中間狀态,例如循環。具有這些改進的路由資訊協定是第一個在網際網路中使用的路由協定,也就是衆所周知的rip-1,其具體描述見rfc 1058[hedrick 1988]。但收斂速度過慢所帶來的問題并沒有得到很好的解決,當網絡處于中間狀态時就會出現路由低效和資料包丢失的問題。

後來,路由算法的發展趨于在每個網絡結點中增加對于網絡的資訊容量。這一類算法中最重要的一族是鍊路-狀态算法。它們的基本思想是分布并更新在每個結點中一個表示網絡所有部分或重要部分的資料庫。每個結點負責計算在自己的資料庫中所顯示的到達目的地的最佳路由。這種計算可利用多種算法完成,有些算法避免了bellman-ford算法中存在的問題,如收斂的時間慢和出現的不希望中間狀态。101路由算法的設計是一個相當重要的主題,我們這裡的讨論是非常有限的。我們将在3.4.3節重新讨論這個主題,在那裡将描述rip-1算法的操作,rip-1算法是最早用于ip路由的算法之一,目前在網際網路的許多地方還在使用它。對于網際網路中更深入的路由問題,請參閱huitema[2000],如想全面地了解路由算法,請參閱tanenbaum[2003]。

繼續閱讀