| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Routing Information protocol 顧名思義是給封包路由所用的﹐它通常是用於router和router之間的資料交換。 不過﹐在我們討論這個協定之前﹐先讓我們重溫一下router的功用。因為IP Routing可以說是internetworking的最重要和最複雜的概念﹐了解清晰一點絕對是有利無害的。 重溫router 在前面的“網路概論”裡面﹐我們已經接觸過bridge和router了。我們知道Bridge是工作於Data Link層級的﹐也就是說﹐它在決定是否轉送封包的時候﹐是以目的地硬體位址為依據﹐而這些硬體地址是不能改變的。只要封包前往的區段不是在相同的來源區段﹐就會進行轉送。但router則工作於Network層級﹐這帶給我們一個非常有用的方便﹕就是可以通過人手來指定網路位址﹐因為這些地址不同硬體地址﹐是可以改變的。在一個連接1000台主機的網路裡面﹐bridge可能要追蹤1000個節點才能做出決定﹐但使用router﹐只需追蹤十來個或更少的地址(或網路地址)就可以了。 而真正令到router更具擴充性的原因是﹐bridge需要檢測網路上每一個封包﹐以決定是否需要轉送﹔而router只需要在意直接傳給自己的封包﹐因為發送端在封包送出之前﹐已經決定好封包是否需要轉送了(前面討論ARP的文章已經為你解釋了這個動作)。 由此可見﹐router的確比bridge高效得多。而且﹐bridge會轉送所有的廣播封包﹐而router則有條件地和有選擇性的對廣播封包進行轉遞﹐同時﹐也會丟棄不明地址的封包﹐這樣可以大大減少網路的交通流量。 路由表格 其實在每一台機器上面﹐有著各自的一個Routing Table記錄著一些路由資訊的﹐如果您在您的Windows98下面輸入﹕
您就可以看到機器目前所使用的路由表格了。上面記錄了有哪些網路、它們的netmask、和通往該網路的router地址、以及使用的網路界面、還有一個Metric號碼(這個讓我們待會再說)。如果您看不懂哪些網路號碼和IP號碼﹐在下建議你回卷到前面的IP地址章節裡面復習一下﹐否則您會越看越糊塗。而且﹐我也不打算重複解釋這些號碼的含義了。 我們從第一行可以知道該機器的Default Gateway為192.168.0.17﹐因為這行的網路和mask都全部為0﹐也就概指所有網路了﹐也就是說﹐凡是有封包要傳給路由表格所不包括的網路﹐其封包就會傳給Default Gateway了。另外﹐我們在第三行看到機器所屬的網路和其gateway指向自己本身﹐(您可以用winipcfg來查看機器本身的IP來印證一下)。這裡我們使用gateway這個詞﹐其實指的就是router﹐如果要了解這兩者的差別﹐前面的“網路概論”也已經說過了。 上面只是一個非常簡單的路由表格而已﹐如果機器所連的網路越多、安裝的界面越多﹐路由表格也越複雜。如果您的機器有撥接連線﹐當您成功連上ISP之後﹐您再跑一次 route PRINT﹐你就會發現多了通往ISP網路的路由設定了﹐而且﹐Default Gateway也使用了ISP那邊的IP。原因是使用撥接連線﹐內定是會使用Remote Default Gateway的﹐除非您網路本身連得上internet﹐否則您就無法和外面的世界溝通了。不過﹐如果網路本身連得上internet﹐還打去ISP幹啥呢﹖ 建立起自己的router﹗ 讓我們先看看router是怎麼工作的﹕
在路由表格中尋找與此地址相符的最長遮罩預定值 從路由表格中取得下一站的地址 將封包傳給下一站 if 對比不成功 看上去﹐不分層級的路由比分層級的路由簡單得多。而事實上卻是相反的﹐這需要您在 router 上進行更複雜的設定。 如果您的機器有兩片網卡被設定為不同的網路﹐然後它們各連接另外一台或多台機器﹐那麼您自己也可以親身的驗證一下router的工作哦﹗很簡單﹐只要您在那台機器上面安裝一個NT或Linux﹐確定兩張網卡都設定好﹐並且同時工作﹐然後在NT上面的網路設定之TCP/IP協定內容裡﹐將“路由”之“啟用IP轉送”打勾夠就可以了﹔在Linux上面呢﹐只要你確定IP Forwording被成功的編進Kernel以及被設定為啟動狀態﹐也就可以了。 下面先讓我們看看兩個網路之間的路由設定是怎樣的﹕ ![]() 由上圖我們可以看到192.168.0.0這個網路的所有機器﹐其gateway都指向192.168.0.254這個IP﹐也就是router上面連接到這個網路的界面。同樣﹐192.168.1.0這個網路﹐其gateway則是192.168.1.254。 通常﹐一個router可以同時連接好幾個網路﹐只要界面設定好就沒問題了。同時﹐許多網路也有超過一個router和其它的網路連接﹐那麼各主機的路由表格就要一一設定好通往各網路的gateway了。如果您還記得“網路概論”裡介紹的bridge和router之間的分別的話﹐您應該知道router還可以連接不同形態的網路呢﹕ ![]() 由上圖我們可以看到﹕當有一個封包從網路A經過網路B送到網路C的時候﹐其Software Address(即IP地址)永遠不變﹐但Hardware Address(即MAC地址)卻隨著所經網路而有所不同。如果您對上一章所說的ARP協定沒忘記的話﹐應該知道為什麼會如此。要維護這個router的路由資料﹐相信是一個很簡單的事情。 如果這兩個網路往外也只連接不多的網路﹐各router上面的路由資料也不會很複雜﹐這樣的情況之下﹐我們可以使用靜態路由﹐也就是以手動方式為每台機器設定事先計算好的路由。靜態路由的主要好處是它的可預測性﹐而且對router或網路連線做成的負擔不多﹐所佔頻寬較少。 當我們在internet上面routing的時候﹐所經過的router當然會多很多啦﹐下面讓我們看看一個簡化了的internet路由圖示﹕ ![]() 正如您可能想像的﹐在internet的環境中﹐要保存一份完整的路由表格殊非輕易﹐而且您也不可能盡知道所有網路的路由路徑。那麼我們把這些路由資料的更新交給了router本身去管理了﹐這樣﹐router和router之間就需要一些協定來交換信息了。 事實上﹐供router使用的協定﹐也有很多種﹐且也分為Exterior Gateway Protocol 和 Interior Gateway Protocol兩大類。在Internet上面負責大型網路之間的路由使用的是Exterior協定﹐最常使用的是BGP(Border Gateway Protocol)協定。相對的﹐在比較少的網路之間﹐使用的會是Interior協定﹐其中最普遍的是RIP協定。 路由資料交換 在眾多的路由協定中﹐RIP可以說是最簡單和最原始的協定了﹐它是一種所謂的距離向量(distance-vector)協定。使用RIP的路由器﹐凡是它知道如何路由的目的地﹐都會被羅列出來﹐同時也列出到達各目的地的距離。至於距離的遠近﹐則使用一個metric數值來表示﹐數值越高距離越遠。這個metric值通常是以hop數的多寡來定﹐但其它協定或許還會參考一些複雜的網路成本計算﹐諸如﹕網路負載、頻寬、延遲、等等其它相關因素。當路由器發現有多條路徑可以到達目的地的時候﹐就會參考這個metric值了﹐其中最低數字的往往被當成是最佳路徑。 正如我們知道﹐路由協定是供路由器和路由器之間交換路由資料用的。當路由器上面的路由資訊改變的時候﹐就會向其相鄰的路由器送出更新信息。用RIP協定的路由器﹐通常會每隔30秒就會更新一次其路由表格﹐如果其路由資訊是從別的路由器“學”來的話﹐就會自動的將metric增加一個數值﹔當這個數值達到“無窮”值的時候(通常會被設定為16)﹐就表示這條路徑為“unreachable”﹐同時也會將之從路由表中刪除。 下面讓我們以一個小型路由網路的例子來更好的看看RIP是怎樣進行路由表格更新的﹐(我強烈建議您將這圖畫出來﹐以備後面討論時參考所需)﹕ ![]() 當路由器剛設定好並連接上網路的時候﹐各自都有一個“初始路由表”﹐裡面只包含與其直接相連的網路的路由信息﹕
上表中﹐NetID就是router所知道如何到達的網路﹐而“M”值我們暫時將之看成metric數值﹐“G”指的是通往該網路的下一個要經的router名字。這時﹐我們看到﹕M都為1﹐而G都指向router自己。 好了﹐各router經過一輪資料交換之後﹐然後將從相鄰router“學”來的路由加入到自己的路由表格中﹐並且metric值也相應的增加“1”。這時﹐我們看到各router的路由表將會變成這樣﹕
或許您初初比較這兩個表的時候﹐會無所適從﹐但其實也不是很難的﹐我們先找到相鄰的router之路由表﹐然後比較本身的路由表﹐看看有沒有新的NetID﹐有則加到自己的路由表中﹐並且“M”增加“1”﹐而“G”則跟隨所“學”的router之名字。如果有相同的NetID﹐則相加metric值﹐如果得出來的值比自己還低﹐則抄過來﹐M也加1﹔如果比自己的值高﹐則保留自己的。 我們以router1來看看﹕與之相鄰的router分別是﹕router2和router4。它們的路由表分別是﹕
而router1自己的路由表則是這樣的﹕
和router2比較﹕可以發現NetID 2和4是新的﹐那麼router1將之抄過來﹐M加1成了2﹐然後G指向router2成了2。其中NetID1相同﹐將router2的metric值加1﹐等於2﹐比自己的高﹐保留自己的。 和router4比較﹕可以發現NetID 7新的﹐那麼router1將之抄過來﹐M加1成了2﹐然後G指向router4成了4。其中NetID3相同﹐將router4的metric值加1﹐比自己的高﹐保留自己的好了。 那麼經過整理之後﹐就得出﹕
好了﹐到了自己動手練習的時候了﹐看看您能不能為各router算一算﹐會否最終得出下面的路由表﹖
如果您第一次未能算出正確的答案也不要緊啦﹐想當初老師要我們算的時候﹐全班也沒一個算對啦~~~ ^_^ 或許您的智商要比我們高些吧﹖如果您夠細心的話﹐或許能夠看出﹕G下面的名字﹐永遠只有相鄰的router﹐而M下面的數值﹐則取決於所“學”的次數。如果有超過一條路徑到達同一個目的地﹐而且metric值也一樣﹐在實際應用中﹐router只會聽取最先獲得的路由信息。 不過﹐在非RIP協定中﹐它們也有各自的規矩﹐這裡也不再詳細討論了﹔而且﹐每種協定都有其優缺點﹐這裡也不作論述了。有興趣的朋友大可自己多找些資料回來研究。 另外﹐您可以在Windows系統下面使用一個叫 tracert 的命令來追蹤路由路徑。如果您在internet上面跟陌生人聊天﹐他忽然告訴您﹕哦﹗我知道您住哪裡了﹗您或許覺得好神奇﹐但只要你知道對方的IP地址﹐使用上面這個命令﹐您最終可以得到對方所連接的router名稱。如果這個router的名稱資料齊全的話(如﹕TaiPei-R01-P11.BR.HiNet.NET )﹐也不難估到對方的位置啦。在Linux上面﹐這個命令則叫做﹕traceroute﹐您自己可以試試哦~~~
© 2000 Netman 網中人Last Updated: March 28, 2000 |