R IP協定


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下面輸入﹕

C:\>route PRINT

Active Routes:

  Network Address          Netmask  Gateway Address        Interface  Metric
          0.0.0.0          0.0.0.0     192.168.0.17     192.168.0.15       1
        127.0.0.0        255.0.0.0        127.0.0.1        127.0.0.1       1
      192.168.0.0    255.255.255.0     192.168.0.15     192.168.0.15       1
     192.168.0.15  255.255.255.255        127.0.0.1        127.0.0.1       1
    192.168.0.255  255.255.255.255     192.168.0.15     192.168.0.15       1
        224.0.0.0        224.0.0.0     192.168.0.15     192.168.0.15       1
  255.255.255.255  255.255.255.255     192.168.0.15     192.168.0.15       1

您就可以看到機器目前所使用的路由表格了。上面記錄了有哪些網路、它們的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是怎麼工作的﹕

分層級IP的路由
指定一個IP地址﹕
if 我有這個目的地的路由
從路由表中取得下一站的地址
將封包傳給下一站
else
決定目的地網路號碼
if 我有這個網路的界面
決定我的界面上這個網路的子網路遮罩
else
從這個網路的層級決定它的子網路遮罩
endif
利用遮罩套在目的地位址上﹐取得子網路
if 我有這個子網路的界面
將封包直接送往目的地
else if 我的路由表格包含這個子網路的記錄
從路由表格中取得下一站的地址
將封包傳給下一站
else if 我的路由表格中有一筆預設路由
從路由表格中取得下一站的地址
將封包傳給下一站
else
宣佈這個目的地無效
endif
endif

不分層級IP的路由
指定一個IP地址﹕
在路由表格中尋找與此地址相符的最長遮罩預定值
從路由表格中取得下一站的地址
將封包傳給下一站
if 對比不成功 宣佈這個目的的無法達到 endif

看上去﹐不分層級的路由比分層級的路由簡單得多。而事實上卻是相反的﹐這需要您在 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是怎樣進行路由表格更新的﹐(我強烈建議您將這圖畫出來﹐以備後面討論時參考所需)﹕

當路由器剛設定好並連接上網路的時候﹐各自都有一個“初始路由表”﹐裡面只包含與其直接相連的網路的路由信息﹕

Router 1   Router 2   Router 3   Router 4   Router 5   Router 6
Net ID M,G Net ID M,G Net ID M,G Net ID M,G Net ID M,G Net ID M,G
1
3
1,1
1,1
1
2
4
1,2
1,2
1,2
2
5
6
1,3
1,3
1,3
3
7
1,4
1,4
4
5
7
8
1,5
1,5
1,5
1,5
6
8
1,6
1,6

上表中﹐NetID就是router所知道如何到達的網路﹐而“M”值我們暫時將之看成metric數值﹐“G”指的是通往該網路的下一個要經的router名字。這時﹐我們看到﹕M都為1﹐而G都指向router自己。

好了﹐各router經過一輪資料交換之後﹐然後將從相鄰router“學”來的路由加入到自己的路由表格中﹐並且metric值也相應的增加“1”。這時﹐我們看到各router的路由表將會變成這樣﹕

Router 1   Router 2   Router 3   Router 4   Router 5   Router 6
Net ID M,G Net ID M,G Net ID M,G Net ID M,G Net ID M,G Net ID M,G
1
2
3
4
7
1,1
2,2
1,1
2,2
2,4
1
2
3
4
5
6
7
8
1,2
1,2
2,1
1,2
2,3
2,3
2,5
2,5
1
2
4
5
6
7
8
2,2
1,3
2,2
1,3
1,3
2,5
2,5
1
3
4
5
7
8
2,1
1,4
2,5
2,5
1,4
2,5
1
2
3
4
5
6
7
8
2,2
2,2
2,4
1,5
1,5
2,3
1,5
1,5
2
4
5
6
7
8
2,3
2,5
2,3
1,6
2,5
1,6

或許您初初比較這兩個表的時候﹐會無所適從﹐但其實也不是很難的﹐我們先找到相鄰的router之路由表﹐然後比較本身的路由表﹐看看有沒有新的NetID﹐有則加到自己的路由表中﹐並且“M”增加“1”﹐而“G”則跟隨所“學”的router之名字。如果有相同的NetID﹐則相加metric值﹐如果得出來的值比自己還低﹐則抄過來﹐M也加1﹔如果比自己的值高﹐則保留自己的。

我們以router1來看看﹕與之相鄰的router分別是﹕router2和router4。它們的路由表分別是﹕

Router 2   Router 4
Net ID M,G Net ID M,G
1
2
4
1,2
1,2
1,2
3
7
1,4
1,4

而router1自己的路由表則是這樣的﹕

Router 1
Net ID M,G
1
3
1,1
1,1

和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 1
Net ID M,G
1
2
3
4
7
1,1
2,2
1,1
2,2
2,4

好了﹐到了自己動手練習的時候了﹐看看您能不能為各router算一算﹐會否最終得出下面的路由表﹖

Router 1   Router 2   Router 3   Router 4   Router 5   Router 6
Net ID M,G Net ID M,G Net ID M,G Net ID M,G Net ID M,G Net ID M,G
1
2
3
4
5
6
7
8
1,1
2,2
1,1
2,2
3,2
3,2
2,4
3,2
1
2
3
4
5
6
7
8
1,2
1,2
2,1
1,2
2,3
2,3
2,5
2,5
1
2
3
4
5
6
7
8
2,2
1,3
2,2
3,2
1,3
1,3
2,5
2,5
1
2
3
4
5
6
7
8
2,1
3,1
1,4
2,5
2,5
3,5
1,4
2,5
1
2
3
4
5
6
7
8
2,2
2,2
2,4
1,5
1,5
2,3
1,5
1,5
1
2
3
4
5
6
7
8
3,3
2,3
3,5
2,5
2,3
1,6
2,5
1,6

如果您第一次未能算出正確的答案也不要緊啦﹐想當初老師要我們算的時候﹐全班也沒一個算對啦~~~ ^_^ 或許您的智商要比我們高些吧﹖如果您夠細心的話﹐或許能夠看出﹕G下面的名字﹐永遠只有相鄰的router﹐而M下面的數值﹐則取決於所“學”的次數。如果有超過一條路徑到達同一個目的地﹐而且metric值也一樣﹐在實際應用中﹐router只會聽取最先獲得的路由信息。

不過﹐在非RIP協定中﹐它們也有各自的規矩﹐這裡也不再詳細討論了﹔而且﹐每種協定都有其優缺點﹐這裡也不作論述了。有興趣的朋友大可自己多找些資料回來研究。

另外﹐您可以在Windows系統下面使用一個叫 tracert 的命令來追蹤路由路徑。如果您在internet上面跟陌生人聊天﹐他忽然告訴您﹕哦﹗我知道您住哪裡了﹗您或許覺得好神奇﹐但只要你知道對方的IP地址﹐使用上面這個命令﹐您最終可以得到對方所連接的router名稱。如果這個router的名稱資料齊全的話(如﹕TaiPei-R01-P11.BR.HiNet.NET )﹐也不難估到對方的位置啦。在Linux上面﹐這個命令則叫做﹕traceroute﹐您自己可以試試哦~~~

 

 


www.study-area.org © 2001 Netman 網中人
Last Updated: March 28, 2000