2009年1月23日 星期五

[TCP/IP Illustrated] Dynamic Routing Protocols

Dynamic Routing

相鄰的 router 之間互相交換網段資訊、連線資訊 ... 等資訊,稱為 dynamic routing,而在 router 上處理這一類工作的 process,就稱為 routing daemon。

routing protocol  還可以根據是否在同一個 AS(Autonomous System) 中來分類,分別是:
  • IGP (Interior Gateway Protocol)
    包含 RIP(Routing Information Protocol)、EIGRP、OSPF(Open Shortest Path First Protocol)、IS-IS ... 等等。

  • EGP (Exterior Gateway Protocol)
    包含 EGP、BGP(Border Gateway Protocol) ... 等等。




Routing Information Protocol

RIP message 是包在 UDP datagram 中傳遞的,以下是傳遞 RIP 訊息的 UDP datagram 格式:


接著是 RIP message 本身的格式:


其中 RIP message 有幾個部份需要注意的:
  • command
    1 = request
    2 = reply

  • version
    是版本不同而不同,RIP = 1,RIPv2 = 2。

  • address family
    此欄位的值永遠為 2,而其他框起來的部份(共 20 bytes)則共同組成一個 IP address 與 metric 資訊。

一個 RIP 訊息最多就僅能帶 25 個 IP address 與 metric 資訊。

運作方式

RIP 所使用的是 UDP port 520,運作的流程如下:
  1. Initialization
    首先會偵測 router 上的介面是否啟用,接著會從啟用的介面送出 request 封包,請求其他 router 將其完整的 routing table 資訊送過來。
    而 request 封包中的 command = 1,address family = 0,metric = 16。

  2. Request received
    router 接收到 request 的封包後,回傳 routing table 資訊給請求者;或是根據封包中所請求的位址給予相對應的 routing 資訊。

  3. Response received
    請求者收到回應,更新 routing table。

  4. Regular routing updates
    接著 router 每 30 秒會將自己的 routing table 資訊送給相鄰的 router。

  5. Triggered updates
    當設定有改變時,就可以發送訊息給鄰近的 router 進行修改。

每個 router 都有其 timeout 的預設值,以三分鐘為例,就表示有 6 次 router advertisement message 沒有收到,因此此時會將 metric 設定為 16,表示此 router 已經不存在,將其刪除。

但沒辦法避免的,使用 RIP 的確會發生 routing table 更新延遲而發生網路不夠穩定的情況。

Metric 的意義

metric 在 RIP 是用來紀錄封包傳遞時,會經過的 router 次數(hop count),而直接連接網路介面的 hop count 為 1,以下用圖來說明:
若是 R1 要到 N2,metric = 1
若是 R1 要到 N3,metric = 2
若是 R2 要到 N2,metric = 1
若是 R2 要到 N1,metric = 2

RIP 的問題所在

從上面運作的原理,其實就可以大概推測出一些問題的端倪了,大概有以下幾點:
  1. hop count 最大是 15,這到 internet 上就不是那麼適用了。

  2. RIP 無法處理 subnet 的定址資訊。

  3. 不論是 router 故障或是從故障中復原,要讓網路上的其他 router 知道以更新 routing table,需要花過多的時間。




RIP version 2

基本上 RIPv2 並沒有改變原先 RIP 運作的模式,而是將原本在 RIP message 中沒有用到的欄位拿來使用而已,以下是 RIPv2 message 的格式:
不同於 RIP 的欄位說明如下:
  • routing domain
    辨識此封包屬於哪個 routing daemon(儲存 process number) 之用,因此表示可以同時有多個 routing daemon 同時處理 RIPv2 的封包。

  • route tag
    用來支援 EGP 之用,儲存 AS(Autonomous System) number。

  • subnet mask
    對應上面的 IP address,以支援 subnet 的處理。

另外要提的是,RIPv2 還支援了簡單的認證功能,只要 address family 設定為 0xFFFFF,且 route tag 的值為 2,往下的 16 個 bits 就是儲存明文密碼的地方。

不僅如此,RIPv2 還支援 multicast,如此一來就不用使用 broadcast 來減少網路流量了!



OSPF (Open Shortest Path First)

相較於 RIP,OSPF 是較新的 routing protocol,克服了 RIP 的許多限制,其中 OSPF Ver.2 定義在 RFC 1247 中。

RIP 屬於距離向量(distance-vector)協定,而 OSPF 屬於鏈路狀態(link-state)協定;差別在於 link-state protocol 中,router 之間不互相交換距離(這裡指的是 hop count)資訊,而是主動偵測周遭 router 的連線狀態(包含實際的距離、頻寬 ... 等資訊),接著將蒐集到的資訊傳送給同一個 AS 中的所有 router,每個 router 蒐集來自各方的資訊後,再將這些資訊組合而成 routing table。

其中最重要的是,當網路上有 router 發生問題而無法提供正常服務時,比起 RIP,使用 OSPF 可以大幅降低收斂(亦即重新發送訊息以組合成可以正常提供服務的 routing table)的時間。

之前提到 RIP 是使用 UDP port 520,而 OSPF 則是直接使用 IP 協定。

由於 OSPF 屬於 link-state protocol,因此也較 RIP 多了以下的優點:
  1. 可以針對不同的路徑計算出 IP type-of-service,因此在 routing table 中可以針對同一個目的地有多個選擇。

  2. 每個網路介面都會給予一個值,其計算的基準在於 throughput、round-trip time、可靠度 .... 等等。每個 IP type-of-service 都可以賦予一個值。

  3. 當到目的地的封包有多條路徑可以選擇,且每條路徑成本相同時,OSPF 會自動將流量分散從不同的路徑傳遞,以求達到負載平衡的效果。

  4. 點對點之間的連線網路介面不需要 IP address。

  5. router 之間訊息的傳輸使用 multicast 而非 broadcast,減少整體的網路流量。

而現在 routing protocol 幾乎都改用 OSPF 囉!



BGP (Border Gateway Protocol)

BGP 是 EGP 的一種,用來在 internet 中讓 AS 之間交換 routing 資訊之用,目前 BGP Ver. 4 的詳細規則可以查詢 RFC 1771

不同 AS 之間會透過 BGP 傳遞包含 AS 的完整 routing 路徑表資訊,藉由組合這些 routing 資訊來形成一個完整的 internet routing 資訊,並避免掉可能發生的 routing loop。

不同於 RIP(UDP port 520) 與 OSPF(IP),BGP 系統間的溝通是透過 TCP 協定來交換 routing table 的資訊;此外,BGP 還會定期送出 keepalive 的訊息,用來確定周遭的 AS 是否可以正常提供 routing 的服務,以便當 AS 有問題時,可以縮短收斂的時間。

而 BGP 的設計上,還可以讓 AS 的管理員自訂設定規則,亦即 BGP 可以允許轉換為 policy-based routing,因此也讓管理者有更大的空間可以發揮與利用。



CIDR (Classless Interdomain Routing)

CIDR 應該是不能算是 protocol,而是一種技術(或是功能)。

怎麼說呢? 這是由於 B class 的網段過於龐大,256 * 256 台主機,如果不切割網段會造成可怕的 broadcast storm,因此解決方式就是切成 C class。

但是切成 C class 卻衍生出了另一個問題:每個 network 之間都必須要有 router

這可是相當麻煩且耗費成本的事情阿,而且 routing table 的數量也會一下子暴增很多;因此 CIDR 就是用來解決這個問題所衍生出來的技術。

而若是僅按照 Class A B C 去切割網路,其實問題是相當多的,例如:
  1. 浪費 IP address
    使用 A class、B class 的組織不見得用的到這麼多 IP;使用 C class 的組織有可能 IP 數量不夠用;多切割一個網段就必須要多浪費兩個 IP(Network ID & Broadcast)。

  2. 無法符合實際需求
    大部分組織可能會遇到 C class 不夠用,B class 卻太多的情況,僅切成 class A B C 並不符合實際的需求。

CIDR 使用 7~32 可變換長度的 Network ID 來取代原本 Class A B C 長度為的 8 16 24 的 Network ID,因此 host 範圍可以從 32 ~ 約 50000 個!

從上面的敘述可以瞭解到,其實 CIDR 的功能就是「將多個小網段組成一個較大的網段」,如此一來 router 所維護的 routing table entry 就可以大大地減少,也因此可以提昇 router 運作的效能。



參考資料

沒有留言:

張貼留言