路由資訊協議

路由資訊協議（Routing Information Protocol，縮寫：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個定時器：

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

## 防止網路環路

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

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

## 相似協定

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