路由信息协议

**路由資訊協定**（英語：**R**outing **I**nformation **P**rotocol，縮寫：**RIP**）是一種內部網路關協定（IGP），為最早出現的距離向量路由協定。屬於網路層，其主要應用於規模較小的、可靠性要求較低的網路，可以通過不斷的交換資訊讓路由器動態的適應網路連接的變化，這些資訊包括每個路由器可以到達哪些網路，這些網路有多遠等。

雖然 RIP 仍然經常的被使用，但是由於收斂慢和支援的廣播網路規模有限等缺點，許多人認為它將會而且正在被諸如 OSPF 和 IS-IS 這樣的路由協定所取代。當然，我們也看到 EIGRP，一種和 RIP 屬於同一基本協定類但更具適應性的路由協定，也有被使用。

## 歷史

RIP 所使用的路由演算法是 Bellman-Ford 演算法。這種演算法最早被用於一個電腦網路是在 1969 年，當時是作為 ARPANET 的初始路由演算法。

RIP 是由「閘道器資訊協定」（Xerox Parc 的用於網際網路工作的 PARC 通用封包協定簇的一部分）發展過來的，可以說閘道器資訊協定是 RIP 的最早的版本。後來的一個版本才被命名為「路由資訊協定」，是 Xerox 網路服務協定簇的一部分。

## 運作原理

每隔 30 秒會與相鄰的路由器交換子訊息，以動態的建立路由表。

## RIP 封包格式

```
0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| command (1)   | version (1)   |      must be zero (2)         |
+---------------+---------------+-------------------------------+
| address family identifier (2) |      must be zero (2)         |
+-------------------------------+-------------------------------+
|                         IP address (4)                        |
+---------------------------------------------------------------+
|                        must be zero (4)                       |
+---------------------------------------------------------------+
|                        must be zero (4)                       |
+---------------------------------------------------------------+
|                          metric (4)                           |
+---------------------------------------------------------------+
```

RIP 規定度量值取 0~15 之間的整數，大於或等於 16 的跳數被定義為無窮大。

## 版本

目前 RIP 共有三個版本，RIPv1、RIPv2、RIPng。

### RIPv1

RIPv1 使用分類路由，定義在《RFC 1058》中。在它的路由更新（Routing Updates）中並不帶有子網路的資訊，因此它無法支援可變長度子網路遮罩。這個限制造成在 RIPv1 的網路中，在同級網路下無法使用不同的子網路遮罩。換句話說，在同一個網路下所有的子網路數目都是相同的。另外，RIPv1 的協定報文中沒有驗證欄位，所以 RIPv1 不支援驗證。

RIPv1 是一個基於 UDP 的路由協定，並且 RIPv1 的封包不能超過 512 位元組（RIP 報文頭部占用 4 個位元組，而每個路由條目占用 20 個八位組位元組。因此，RIP 訊息最大為 4+(25\*20)=504 個位元組，再加上 8 個位元組的 UDP 頭部，所以 RIP 資料報的大小 (不含 IP 包的頭部) 最大可達 512 個位元組。）。

### RIPv2

RIPv2 在 RIPv1 的基礎上改進如下幾點：

* 支援外部路由標記（Route Tag），可以在路由策略中根據 Tag 對路由進行靈活的控制。實際上不同 RIP 行程間相互引入路由也可以使用 Tag。
* 報文中攜帶遮罩資訊，支援路由聚合和 CIDR。
* 支援指定下一跳，在廣播網上可以選擇到目的網段最佳下一跳位址。
* 支援以組播方式傳送更新報文，只有執行 RIPv2 的裝置才能收到協定報文，減少資源消耗。
* 支援對協定報文進行驗證，增強安全性。

### RIPng

RIPng（Routing Information Protocol next generation）在 RFC 2080 中被定義，主要是針對 IPv6 做一些延伸的規範。與 RIPv2 相比下其最主要的差異是：

* RIPv2 支援 RIP 更新認證，RIPng 則不支援，因為 IPv6 路由器理應會使用 IPsec 來進行身分驗證；
* RIPv2 容許給路由器附上任何標籤， RIPng 則不容許；
* RIPv2 在每個路由表項中都儲存下一跳的資訊，RIPng 是對一組路由表項指定下一跳資訊；
* RIPv2 使用 UDP 埠 520 和多播位址 224.0.0.9 通信，RIPng 則使用 UDP 埠 521 和多播位址 FF02::9 通信

## RIP 協定定時器

RIP 在更新和維護路由資訊時主要使用以下 4 個定時器：

1. 更新定時器：當此逾時器逾時時，立即傳送路由更新報文，預設每 30s 傳送一次。
2. 老化定時器：RIP 裝置如果在老化時間內沒有收到鄰居發來的路由更新報文，則認為該路由不可達。當學到一條路由並添加到 RIP 路由表中時，老化定時器啟動，如果老化定時器逾時，裝置仍沒有收到鄰居發來的更新報文，則把該路由的度量值置為 16，並啟動垃圾收集定時器。
3. 垃圾收集定時器：如果在垃圾收集時間內仍沒有收到原來不可達到路由的更新，該路由將被從 RIP 路由表徹底刪除。
4. 抑制定時器：當 RIP 裝置收到對端的路由更新，其度量值為 16。則對應路由進入抑制狀態，並啟動抑制定時器，預設值為 180s。這時，為了防止路由震盪，在抑制定時器逾時之前，即使再收到對端路由度量值小於 16 的更新，也不接受。當抑制逾時器逾時後，就重新接受對端傳送的路由更新報文。

## 防止網路環路

由於路由器可能收到它自己傳送的路由資訊而造成網路環路，為了提高 RIP 協定效能而使用以下措施：

* 水平分割：水平分割指的是 RIP 從某個介面學到的路由，不會從該介面再發回給鄰居裝置。在影格中繼和 X.25 等 NBMA 網路中，水平分割功能預設為禁止狀態。
* 毒性逆轉：毒性逆轉指的是 RIP 從某個介面學到路由後，將該路由的開銷設定為 16（即指明該路由不可達），並從原介面發回鄰居裝置。
* 滯留計時器 (Hold-down timer): 一但抑制計時器被觸發後，那麼將會引起該路由進入長達 180 秒（即 6 個路由更新周期）的抑制狀態階段。在抑制計時器超時前，路由器不再接收關於這條路由的更新資訊。
* 觸發更新：觸發更新是指路由資訊發生變化時，立即向鄰居裝置傳送觸發更新報文，通知變化的路由資訊。（觸發更新不會觸發接收路由器重設自己的更新定時器）

## 相似協定

一個比 RIP 更強大，且同樣基於距離向量路由協定的協定，是思科專有的 IGRP。思科在其現時發行的軟體中已再沒有對 IGRP 提供支援，而且由 EIGRP──一隻徹底地重新設計的路由通訊協定所取代。不過它與 IGRP 的關係就只有命名上的相似，亦純粹是因為 EIGRP 依然是基於距離向量路由協定的緣故。

## 參見

* 王，王達。第 11 章 RIP 路由配置与管理。华为路由器学习指南。人民郵電出版社. 2017.
* RFC 1058, "Routing Information Protocol"
* RFC 2453, "RIP Version 2"
* RFC 2080, "RIPng for IPv6"