网络层核心:路由和路由生成算法
一、路由和路由算法簡(jiǎn)介:
路由就是通過(guò)互連的網(wǎng)絡(luò)把信息從源地址傳送到目的地址的活動(dòng)。路由發(fā)生在OSI網(wǎng)絡(luò)參考模型的第三層即網(wǎng)絡(luò)層。
路由引導(dǎo)封包轉(zhuǎn)送,經(jīng)過(guò)一些中間的節(jié)點(diǎn)后,到達(dá)目的地。把該功能做成硬件的話稱為路由器。路由通常根據(jù)路由表來(lái)引導(dǎo)封包轉(zhuǎn)送。因此為了有效率的轉(zhuǎn)送封包,建立存儲(chǔ)在路由器內(nèi)存的路由表是非常重要的。路由與橋接的不同在于,路由假設(shè)地址相似的結(jié)點(diǎn)距離相近。這使得路由表中的一項(xiàng)紀(jì)錄可以表示到一組地址的路徑。
二、路由的基本原理:
1、路由的內(nèi)涵:
? ? ? 路由包含兩個(gè)基本動(dòng)作:確定最佳路徑和通過(guò)網(wǎng)絡(luò)傳輸信息。
? ?(1)路徑選擇:metric是路由算法用已確定到達(dá)目的地最佳路徑的計(jì)量標(biāo)準(zhǔn),如路徑長(zhǎng)度。路由算法根據(jù)許多信息來(lái)填充路? ??由表,目的/下一跳地址對(duì)告知路由器到達(dá)目的的最佳方式是把分組發(fā)送給代表 “下一跳” 的路由器,當(dāng)路由器收到一個(gè)分 ? ? ? ? ? ? ? ? ? 組,他就檢查其目標(biāo)地址,嘗試將此地址與其 “下一跳” 相聯(lián)系。
? ?(2)交換:交換算法相對(duì)比較簡(jiǎn)單,對(duì)于大多數(shù)路由協(xié)議而言是相同,多數(shù)情況下,某主機(jī)向另一個(gè)主機(jī)發(fā)送數(shù)據(jù),通過(guò)某 ? ? ? ? ? ? ?些方法獲得路由器地址后,源主機(jī)發(fā)送指向該路由器的物理地址的數(shù)據(jù)包,其協(xié)議地址指向目的主機(jī)。
2、路由算法的基本類型:
? ?(1)靜態(tài)與動(dòng)態(tài):靜態(tài)算法嚴(yán)格意義很難算得上是算法,只不過(guò)是開始路由器前由網(wǎng)管建立的表映射。此算法容易設(shè)計(jì),在 ? ? ? ? ? ? ?網(wǎng)絡(luò)通信可預(yù)測(cè)及簡(jiǎn)單的網(wǎng)絡(luò)中工作的很好,但不能適應(yīng)網(wǎng)絡(luò)狀態(tài)變化。?動(dòng)態(tài)路由算法可以適當(dāng)?shù)囊造o態(tài)算法作為補(bǔ)充, ? ? ? ? ? ? ? ?可適應(yīng)網(wǎng)絡(luò)狀態(tài)變化但開銷大、復(fù)雜。
? ?(2)單路徑與多路徑。
? ?(3)平坦與分層.。
? ?(4)主機(jī)智能與路由器智能。
? ?(5)域內(nèi)與域間。
? ?(6)鏈接狀態(tài)與距離向量。
三、幾種常見的路由算法:
1、最短路徑優(yōu)先算法------Dijstra算法:
迪杰斯特拉(Dijkstra)算法是典型最短路徑算法,用于計(jì)算一個(gè)節(jié)點(diǎn)到其他節(jié)點(diǎn)的最短路徑。?
它的主要特點(diǎn)是以起始點(diǎn)為中心向外層層擴(kuò)展(廣度優(yōu)先搜索思想),直到擴(kuò)展到終點(diǎn)為止。
基本思想
???? 通過(guò)Dijkstra計(jì)算圖G中的最短路徑時(shí),需要指定起點(diǎn)s(即從頂點(diǎn)s開始計(jì)算)。
???? 此外,引進(jìn)兩個(gè)集合S和U。S的作用是記錄已求出最短路徑的頂點(diǎn)(以及相應(yīng)的最短路徑長(zhǎng)度),而U則是記錄還未求出最短路徑的頂點(diǎn)(以及該頂點(diǎn)到起點(diǎn)s的距離)。
???? 初始時(shí),S中只有起點(diǎn)s;U中是除s之外的頂點(diǎn),并且U中頂點(diǎn)的路徑是"起點(diǎn)s到該頂點(diǎn)的路徑"。然后,從U中找出路徑最短的頂點(diǎn),并將其加入到S中;接著,更新U中的頂點(diǎn)和頂點(diǎn)對(duì)應(yīng)的路徑。 然后,再?gòu)腢中找出路徑最短的頂點(diǎn),并將其加入到S中;接著,更新U中的頂點(diǎn)和頂點(diǎn)對(duì)應(yīng)的路徑。 ... 重復(fù)該操作,直到遍歷完所有頂點(diǎn)。
操作步驟
(1)?初始時(shí),S只包含起點(diǎn)s;U包含除s外的其他頂點(diǎn),且U中頂點(diǎn)的距離為"起點(diǎn)s到該頂點(diǎn)的距離"[例如,U中頂點(diǎn)v的距離為(s,v)的長(zhǎng)度,然后s和v不相鄰,則v的距離為∞]。
(2)?從U中選出"距離最短的頂點(diǎn)k",并將頂點(diǎn)k加入到S中;同時(shí),從U中移除頂點(diǎn)k。
(3)?更新U中各個(gè)頂點(diǎn)到起點(diǎn)s的距離。之所以更新U中頂點(diǎn)的距離,是由于上一步中確定了k是求出最短路徑的頂點(diǎn),從而可以利用k來(lái)更新其它頂點(diǎn)的距離;例如,(s,v)的距離可能大于(s,k)+(k,v)的距離。
(4)?重復(fù)步驟(2)和(3),直到遍歷完所有頂點(diǎn)。
單純的看上面的理論可能比較難以理解,下面通過(guò)實(shí)例來(lái)對(duì)該算法進(jìn)行說(shuō)明。
迪杰斯特拉算法圖解
以上圖G4為例,來(lái)對(duì)迪杰斯特拉進(jìn)行算法演示(以第4個(gè)頂點(diǎn)D為起點(diǎn))。
初始狀態(tài):S是已計(jì)算出最短路徑的頂點(diǎn)集合,U是未計(jì)算除最短路徑的頂點(diǎn)的集合!?
第1步:將頂點(diǎn)D加入到S中。?
????此時(shí),S={D(0)}, U={A(∞),B(∞),C(3),E(4),F(∞),G(∞)}。 ????注:C(3)表示C到起點(diǎn)D的距離是3。
第2步:將頂點(diǎn)C加入到S中。?
????上一步操作之后,U中頂點(diǎn)C到起點(diǎn)D的距離最短;因此,將C加入到S中,同時(shí)更新U中頂點(diǎn)的距離。以頂點(diǎn)F為例,之前F到D的距離為∞;但是將C加入到S之后,F到D的距離為9=(F,C)+(C,D)。?
????此時(shí),S={D(0),C(3)}, U={A(∞),B(23),E(4),F(9),G(∞)}。
第3步:將頂點(diǎn)E加入到S中。?
????上一步操作之后,U中頂點(diǎn)E到起點(diǎn)D的距離最短;因此,將E加入到S中,同時(shí)更新U中頂點(diǎn)的距離。還是以頂點(diǎn)F為例,之前F到D的距離為9;但是將E加入到S之后,F到D的距離為6=(F,E)+(E,D)。?
????此時(shí),S={D(0),C(3),E(4)}, U={A(∞),B(23),F(6),G(12)}。
第4步:將頂點(diǎn)F加入到S中。?
????此時(shí),S={D(0),C(3),E(4),F(6)}, U={A(22),B(13),G(12)}。
第5步:將頂點(diǎn)G加入到S中。?
????此時(shí),S={D(0),C(3),E(4),F(6),G(12)}, U={A(22),B(13)}。
第6步:將頂點(diǎn)B加入到S中。?
????此時(shí),S={D(0),C(3),E(4),F(6),G(12),B(13)}, U={A(22)}。
第7步:將頂點(diǎn)A加入到S中。?
????此時(shí),S={D(0),C(3),E(4),F(6),G(12),B(13),A(22)}。
此時(shí),起點(diǎn)D到各個(gè)頂點(diǎn)的最短距離就計(jì)算出來(lái)了:A(22) B(13) C(3) D(0) E(4) F(6) G(12)。
(Dijkstra算法(一)之 C語(yǔ)言詳解)
2、擴(kuò)散算法(Flooding)
另一種靜態(tài)算法是擴(kuò)散法 (flooding), 它把收到的每一個(gè)分組,從除了分組到來(lái)的線路外的所有輸出線路上發(fā)出。顯然擴(kuò)散要產(chǎn)生大量的重
復(fù)分組,事實(shí)上有可能是無(wú)窮多個(gè)分組,除非采用一些措施抑制這種過(guò)程。一種措施是讓每個(gè)分組頭包含站點(diǎn)計(jì)數(shù)器,每經(jīng)過(guò)一個(gè)站點(diǎn),計(jì)數(shù)器
減1,當(dāng)計(jì)數(shù)器值為0時(shí),就扔掉分組。理想的情況是計(jì)數(shù)器設(shè)置初值為從源端到目的端的路徑長(zhǎng)度。如果發(fā)送者不知道路徑的長(zhǎng)度,它可以按
最糟糕的情況,即子網(wǎng)的直徑來(lái)設(shè)置初值。
另一種方法是記錄下分組擴(kuò)散的路徑,防止它第二次再擴(kuò)散到已擴(kuò)散的路徑中。達(dá)到這一目的的一種方法是讓源端路徑器在所接收的來(lái)自
主機(jī)的每一個(gè)分組中設(shè)置一個(gè)序號(hào),每個(gè)路徑器對(duì)應(yīng)于每個(gè)源端路由器有一張表,用來(lái)指明已見到的是源端生成的哪個(gè)序號(hào),如果進(jìn)入的分組
已在表中,則不再擴(kuò)散。?
為了防止該表無(wú)限制地增長(zhǎng),每個(gè)表應(yīng)加一個(gè)計(jì)數(shù)器k作為參數(shù),表示直到k的序號(hào)都已看見。 當(dāng)一個(gè)分組進(jìn)入時(shí),就能容易查出此分組是否為
復(fù)制品;如果是,則扔掉此分組。而且, 低于k的表項(xiàng)都不再需要,因?yàn)閗已有效地綜合了各種因素。
擴(kuò)散法的一個(gè)稍為實(shí)際的變種是選擇性擴(kuò)散法(selective flooding)。在這種算法中,路由器并不將每一進(jìn)來(lái)的分組從每一條輸出線路上發(fā)出
,而是僅發(fā)送到與正確方向接近的那些線路上。不太可能將一個(gè)應(yīng)該向西傳送的分組傳送到向東的線路上去,除非拓?fù)浣Y(jié)構(gòu)極為奇特。
擴(kuò)散法在很多應(yīng)用中都未實(shí)際采用,但它還是有一些用處的。例如,在軍事應(yīng)用中,大批的路由器隨時(shí)都可能被炸毀得所剩無(wú)幾,所以非常希
望采用具有很結(jié)實(shí)的擴(kuò)散方式。在分布式數(shù)據(jù)庫(kù)應(yīng)用中,有時(shí)需要并行地更新所有數(shù)據(jù)庫(kù),在這種情況下,擴(kuò)散就非常有用。第三種可能的用途
是把它作為一種尺度來(lái)衡量其他路由選擇算法。擴(kuò)散總是選擇最短路徑,因?yàn)樗⑿械剡x擇每一條可能的路徑。所以,沒有其他算法能產(chǎn)生一個(gè)
更短的延遲(如果我們忽略掉擴(kuò)散過(guò)程本身產(chǎn)生的開銷)。
3、距離向量路由算法(Distance Vector Routing):
距離矢量路由算法(Distance?Vector?Routing,DV)是ARPANET網(wǎng)絡(luò)上最早使用的路由算法,也稱Bellman-Ford路由算法和Ford-Fulkerson算法,主要在RIP(Route?Information?Protocol)協(xié)議中使用。Cisco的IGRP和EIGRP路由協(xié)議也是采用DV這種路由算法的。?
????“距離矢量路由算法”的基本思想如下:每個(gè)路由器維護(hù)一個(gè)距離矢量(通常是以延時(shí)是作變量的)表,然后通過(guò)相鄰路由器之間的距離矢量通告進(jìn)行距離矢量表的更新。每個(gè)距離矢量表項(xiàng)包括兩部分:到達(dá)目的結(jié)點(diǎn)的最佳輸出線路,和到達(dá)目的結(jié)點(diǎn)所需時(shí)間或距離,通信子網(wǎng)中的其它每個(gè)路由器在
表中占據(jù)一個(gè)表項(xiàng),并作為該表項(xiàng)的索引。每隔一段時(shí)間,路由器會(huì)向所有鄰居結(jié)點(diǎn)發(fā)送它到每個(gè)目的結(jié)點(diǎn)的距離表,同時(shí)它也接收每個(gè)鄰居結(jié)點(diǎn)發(fā)來(lái)的距離表。這樣以此類推,經(jīng)過(guò)一段時(shí)間后便可將網(wǎng)絡(luò)中各路由器所獲得的距離矢量信息在各路由器上統(tǒng)一起來(lái),這樣各路由器只需要查看這個(gè)距
離矢量表就可以為不同來(lái)源分組找到一條最佳的路由。?
??? ? 鏈路狀態(tài)路由協(xié)議是目前使用最廣的一類域內(nèi)路由協(xié)議。它采用一種“拼圖”的設(shè)計(jì)策略,即每個(gè)路由器將它到其周圍鄰居的鏈路狀態(tài)向全網(wǎng)的其他路由器進(jìn)行廣播。這樣,一個(gè)路由器收到從網(wǎng)絡(luò)中其他路由器發(fā)送過(guò)來(lái)的路由信息后,它對(duì)這些鏈路狀態(tài)進(jìn)行拼裝,最終生成一個(gè)全網(wǎng)的拓?fù)湟晥D,
近而可以通過(guò)最短路徑算法來(lái)計(jì)算它到別的路由器的最短路徑。運(yùn)行鏈路狀態(tài)路由協(xié)議的路由器,?每臺(tái)路由器公在其接口的狀態(tài)發(fā)生變化時(shí),才將變化后的狀態(tài)發(fā)送給其他所有路由器,每臺(tái)路由器都使用收到的信息重新計(jì)算前往每個(gè)網(wǎng)絡(luò)的最佳路徑,然后將這些信息存儲(chǔ)到自己的路由選擇表中。?
鏈路狀態(tài)路由算法背后的思想非常簡(jiǎn)單,可以用5個(gè)基本步驟加以描述。?
1、發(fā)現(xiàn)他的鄰接點(diǎn),并知道其網(wǎng)絡(luò)的地址。?
2、測(cè)量到各鄰接點(diǎn)的延遲或開銷。?
3、構(gòu)造一個(gè)分組,分組中包含所有他剛剛收到的信息。
4、將這個(gè)分組發(fā)送給其他的路由器。?
5、計(jì)算出到每一個(gè)其他路由器的最短路徑。例如,每個(gè)路由器運(yùn)行Dijkstra算法就可以找從它到每一個(gè)其他路由器的最短路徑。
4、鏈路狀態(tài)路由算法(Link State Routing):
鏈路狀態(tài)算法以圖論作為理論基礎(chǔ),用圖來(lái)表示網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu),并利用圖論中的最短路徑算法來(lái)計(jì)算網(wǎng)絡(luò)間的最佳
路由,因此鏈路狀態(tài)算法又被稱作最短路徑優(yōu)先算法SPF。
鏈路狀態(tài)選路算法的工作原理如下 (1)在參與鏈路狀態(tài)選路的路由器集合中,每個(gè)路由器都需要通過(guò)某種機(jī)制來(lái)了解自己所連接的鏈路及其狀態(tài)。 (2)各路由器都能夠?qū)⑵渌B接的鏈路的狀態(tài)信息通知給網(wǎng)絡(luò)中的所有其他路由器,這些鏈路信息包括鏈路狀態(tài)、費(fèi)用以及鏈路兩端的路由器等。 (3)鏈路狀態(tài)信息的通過(guò)鏈路狀態(tài)分組(LSP)來(lái)向整個(gè)網(wǎng)絡(luò)發(fā)布。一個(gè)LSP通常包含源路由器的標(biāo)識(shí)符、相鄰路由器的標(biāo)識(shí)符,以及而知之間鏈路的費(fèi)用。每一個(gè)LSP都將被 網(wǎng)絡(luò)中的所有的路由器接收,并用于建立網(wǎng)絡(luò)整體的統(tǒng)一拓?fù)鋽?shù)據(jù)庫(kù)。由于網(wǎng)絡(luò)中所有的路由器都發(fā)送LSP,經(jīng)過(guò)一段時(shí)間以后,每一個(gè)路由器都保持了一張完整的網(wǎng)絡(luò)拓?fù)鋱D, 再在這個(gè)拓?fù)鋱D上,利用最短通路算法(例如Dijkstra算法等),路由器就可以計(jì)算出從任何源點(diǎn)到任何目的地的最佳通路。 這樣,每一個(gè)路由器都能夠利用通路最短的原則建立一個(gè)以本路由器為根、分支到所有其他路由器的生成樹,依據(jù)這個(gè)生成樹就可以很容易地計(jì)算出本路由器的路由表
四、路由表查看:
使用下面的 route 命令可以查看 Linux 內(nèi)核路由表。
# route
Destination ?Gateway ? ? ?Genmask ? ? ? ? ?Flags Metric Ref Use Iface
192.168.0.0 ? * ? ? ? ? ? ? ? ? 255.255.255.0 ?U ? ? ? ?0 ? ? ? ? 0 ? ? 0 ? ?eth0
169.254.0.0 ? * ? ? ? ? ? ? ? ? 255.255.0.0 ? ? ?U ? ? ? ?0 ? ? ? ? 0 ? ? 0 ? ?eth0
default ? ? ? ?192.168.0.1 ? 0.0.0.0 ? ? ? ? ? ? ?UG ? ? 0 ? ? ? ? 0 ? ? 0 ? ?eth0
route 命令的輸出項(xiàng)說(shuō)明
輸出項(xiàng) ? ? ? ? ? ? 說(shuō)明?
Destination ? ? ?目標(biāo)網(wǎng)段或者主機(jī)?
Gateway ? ? ? ? ?網(wǎng)關(guān)地址,”*” 表示目標(biāo)是本主機(jī)所屬的網(wǎng)絡(luò),不需要路由 ? ?
Genmask ? ? ? ? 網(wǎng)絡(luò)掩碼?
Flags ? ? ? ? ? ? ? 標(biāo)記
一些可能的標(biāo)記如下:
?U — 路由是活動(dòng)的
?H — 目標(biāo)是一個(gè)主機(jī)
?N?— 目標(biāo)時(shí)某個(gè)網(wǎng)段
?G — 路由指向網(wǎng)關(guān)?
?R — 恢復(fù)動(dòng)態(tài)路由產(chǎn)生的表項(xiàng)?
?D — 由路由的后臺(tái)程序動(dòng)態(tài)地安裝?
?M — 由路由的后臺(tái)程序修改
?! — 拒絕路由?
Metric 路由距離,到達(dá)指定網(wǎng)絡(luò)所需的中轉(zhuǎn)數(shù)(linux 內(nèi)核中沒有使用)。?
Ref 路由項(xiàng)引用次數(shù)(linux 內(nèi)核中沒有使用)。
Use 此路由項(xiàng)被路由軟件查找的次數(shù) 。
Iface 該路由表項(xiàng)對(duì)應(yīng)的輸出接口 。
總結(jié)
以上是生活随笔為你收集整理的网络层核心:路由和路由生成算法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: anaconda下载
- 下一篇: 【Unity3D插件】VOXL插件分享《