image.png

RIP 概述

Routing Information Protocol(路由信息协议)是一种较为简单的内部网关协议 IGP(Interior Gateway Protocol)。是一种基于距离矢量(Distance-Vector)算法的协议,它通过 UDP 报文进行路由信息的交换,使用的端口号为 520。使用跳数(Hop Count)来衡量到达目的地址的距离(度量值)。缺省情况下,路由器到与它直接相连网络的跳数为 0,每经过一个网络跳数增加 1。也就是说,为限制收敛时间,度量值取为 0~15 之间的整数,大于或等于 16 的跳数则认为目的网络或主机不可达。RIP 的数据包不能超过 512 字节,在一个 RIP 报文中,最多可以有 25 个路由表项
RIP 包括 RIPv1 和 RIPv2 两个版本,RIPv2对 RIPv1 进行了扩充,使其更具有优势。由于 RIP 的实现较为简单,在配置和维护管理方面也远比 OSPF 和 ISIS 容易,因此 RIP 主要应用于规模较小的网络中,比如校园网以及结构较简单的地区性网络。对于更为复杂的环境和大型网络,一般不使用 RIP。

1. RIPv1/RIPv2 的区别

RIPv1 的协议报文中没有携带掩码信息,它只能识别 A、B、C 类这样的自然网段的路由

RIPv1 RIPv2
有类别路由协议(Classful Routing Protocol) 无分类路由协议(Classless Routing Protocol)
采用广播方式发布协议报文 采用组播(224.0.0.9)或广播方式发布协议报文
报文中不携带掩码信息 报文中携带掩码信息
不支持支持路由聚合 支持路由聚合
不支持 CIDR 和 VLSM 支持 CIDR 和 VLSM
不支持不连续子网 支持指定下一跳
不支持验证 支持简单验证和 MD5 验证

2. 路由收敛(定时器)

通过改变 RIP 定时器的值,可以影响 RIP 的收敛速度。
RIP - 图2
RIP 的四个定时器:

  1. 更新定时器(Update timer):默认每 30s 周期性触发更新报文;
  2. 老化定时器(Age timer):如果设备没有在某条路由的老化时间内收到邻居发来的路由更新报文,则认为该路由不可达,Age timer 缺省为 180s;
  3. 垃圾超时定时器(Garbage-Collect timer):在某条路由失效(Age timer 超时或收到某条路由的不可达消息)后,该路由表项并不立即从路由表中删除,而是将这条路由放入 Garbage 队列。Garbage-Collect timer 会监视Garbage 队列,删除超时的路由。如果在此期间收到了任何关于该路由的更新报文,则会重新将这条路由放回到 Age 队列。设置 Garbage-Collect timer 的目的是为了防止路由振荡。Garbage-Collect timer 的缺省为 120s;
  4. 抑制定时器(Hold-Down timer):当设备收到对端的路由更新,其 Cost = 16,对应路由进入抑制 Hold-Down 状态,并启动抑制定时器。为了防止路由震荡,在抑制定时器超时之前,即使再收到对端路由 Cost < 16的更新,也不接收。只有满足更新报文携带的 Cost 值 ≤ 前一个报文的 Cost 值或抑制定时器超时,路由设备进入垃圾收集状态,该路由才会重新生效。

RIP 的更新信息发布是由 Update 定时器控制的,默认为每 30s 发送一次。每一条路由表项对应两个定时器,老化定时器和垃圾超时定时器。当学到一条路由并装载到路由表中时,启动老化定时器。启动老化定时器的 180s 内,如果没有收到邻居发来的更新报文,则把该路由的度量值置为 16,并启动垃圾超时定时器。启动垃圾超时定时器的 120 秒内,如果仍然没有收到更新报文,垃圾超时定时器超时后在路由中删除该路由表项。缺省情况下,RIP 不使能抑制定时器,如果手动使能,抑制定时器会在从邻居收到 Cost 值大于 16 的路由之后启动。

3. 防环机制

RIP 作为距离矢量路由协议,只是简单的将自己路由表所有的路由周期性通告出去,同时将收到的有效路由加载到路由表中,并通过累加的度量值来体现到达目标网络的距离,由此运行距离矢量路由协议的路由设备并不了解整个网络的拓扑结构,这些特点使得网络中容易出现路由环路。

3.1 水平分割

水平分割在不同网络中实现有所区别,分为按照接口和按照邻居进行水平分割。水平分割防环就是从某个接口学到的路由不会从该接口再发回给邻居路由设备。这样不但减少了带宽消耗,还可以防止路由环路。
广播网、P2MP 和 P2P 网络中的水平分割(按照接口进行水平分割)
RIP - 图3

  1. RouterA 会向 RouterB 发送到网络 10.0.0.0/8 的路由信息,如果没有配置水平分割,RouterB 会将从 RouterA 学习到的这条路由再发送回给 RouterA。这样,RouterA 可以学习到两条到达 10.0.0.0/8 网络的路由,一条是跳数为 0 的直连路由,一条是下一跳指向RouterB 且跳数为 2 的路由。在 RouterA 的 RIP 路由表中只有直连路由才是活跃的。
  2. 当 RouterA 到网络 10.0.0.0 的路由变成不可达,并且 RouterB 还没有收到路由不可达的信息时,RouterB 会继续向 RouterA 发送 10.0.0.0/8 可达的路由信息。即,RouterA 会接收到错误的路由信息,认为可以通过 RouterB 到达10.0.0.0/8网络;而 RouterB 仍旧认为可以通过 RouterA 到达 10.0.0.0/8 网络,从而形成路由环路。
  3. 配置水平分割后,RouterB 将不会再把到网络 10.0.0.0/8 的路由发回给 RouterA,避免了路由环路的产生。

NBMA 网络中的水平分割(按照邻居进行水平分割)
RIP - 图4
配置水平分割后,RouterB 会将从 RouterA 学习到的 10.0.0.0/8 路由发送给 RouterC,但是不会再发送回给 RouterA

3.2 毒性逆转

毒性逆转(Poison Reverse)就是从某个接口学到路由后,从原接口发回邻居路由设备,但将该路由的开销设置为 16(即指明该路由不可达)。利用这种方式,可以清除对方路由表中的无用路由,也可以防止产生路由环路的发生。
RIP - 图5

  1. RouterA 会向 RouterB 发送 10.0.0.0/8 路由信息,如果没有配置毒性逆转,RouterB 会将从 RouterA 学习到的这条路由再发送回给 RouterA。这样,RouterA 可以学习到两条到达 10.0.0.0/8 网络的路由,一条是跳数为 0 的直连路由;一条是下一跳指向 RouterB 且跳数为 2 的路由。
  2. 当 RouterA 到网络 10.0.0.0/8 的路由变成不可达,并且 RouterB 还没有收到路由不可达的信息时,RouterB 会继续向 RouterA 发送 10.0.0.0/8 可达的路由信息。即,RouterA 会接收到错误的路由信息,认为可以通过 RouterB 到达 10.0.0.0/8 网络;而 RouterB 仍旧认为可以通过 RouterA 到达 10.0.0.0/8 网络,由此导致了路由环路。
  3. 配置毒性逆转后,RouterB 在接收到从 RouterA 发来的路由后,向 RouterA 发送一个这条路由不可达的消息(即将该路由的开销设置为 16 跳,16 跳即意味着该路由不可达),这样 RouterA 就不会再从 RouterB 学到这条可达路由,因此就可以避免上述环路的发生。

    3.3 触发更新

    触发更新就是路由信息发生变化时,立即向邻居设备发送触发更新报文,通知变化的路由信息。触发更新可以缩短网络收敛时间,在路由表项变化时立即向其他设备广播该信息,而不必等待定时更新。触发更新还存在另外一种方式,当下一跳不可用之后(如因为链路故障)需要及时通告给其他设备,此时要把该路由的 Cost 设置为 16 然后发布出去,此更新也叫做 “路由毒杀”
    RIP - 图6

  4. 网络 10.0.0.0/8 不可达时,RouterA 最先得到这一信息。通常,更新路由信息会定时发送给相邻 Router(RIP 协议每隔 30 秒发送一次)。

  5. 如果在 RouterB 等待更新周期到来的时候,RouterC 的更新报文传到了 RouterB,RouterB 就会从 RouterC 学到的去往网络10.0.0.0的错误路由。这样 RouterB 和 RouterC 上去往网络 10.0.0.0/8 的路由都指向对方从而形成路由环路。
  6. 如果 RouterA 发现网络故障之后,不再等待更新周期到来,就立即发送路由更新信息给 RouterB,使 RouterB 的路由表及时更新,则可以避免产生上述问题。

    3.4 路由聚合

    路由聚合是把同一个自然网段内的不同子网的路由聚合成一个网段的路由向外(其它网段)发送,通过聚合可以提高网络的扩展性和转发效率,缩减路由表。RIPv1 的协议报文中没有携带掩码信息,所以 RIPv1 发布的就是自然掩码的路由,不支持聚合。RIPv2 支持路由聚合,因为 RIPv2 报文携带掩码位,所以支持子网划分。
    路由聚合有两种方式:
  • 基于 RIP 进程的有类聚合:也叫自动聚合,聚合后的路由使用自然掩码的路由形式发布。但在配置水平分割或毒性反转的情况下,有类聚合将失效(这是因为水平分割或毒性反转将抑制一些路由的发布,配置了有类聚合时一条聚合路由可能是聚合了从不同的接口上学到的路由,这样在向外发布时就会产生冲突)。
  • 基于接口的聚合:在接口上手工指定聚合路由向外发布。

    4. RIP 报文格式

    4.1 RIPv1 Message Format

    1. 0 7 15 23 31
    2. +---------------------------------------------------------------+
    3. | Command | Version | Must be zero |
    4. +---------------------------------------------------------------+
    5. | Address family identifier | Must be zero |
    6. +---------------------------------------------------------------+
    7. | IP address |
    8. +---------------------------------------------------------------+
    9. | Must be zero |
    10. +---------------------------------------------------------------+
    11. | Must be zero |
    12. +---------------------------------------------------------------+
    13. | Metric |
    14. +---------------------------------------------------------------+
    | 字段名 | 长度 | 含义 | | —- | —- | —- | | Command | 8比特 | 标识报文的类型:

1:Request报文,向邻居请求全部或部分路由信息;
2:Response报文,发送自己全部或部分路由信息,一个Response报文中最多包含25个路由表项。 | | Version | 8比特 | RIP的版本号:

1:RIP-1
2:RIP-2 | | Must be zero | 16/32比特 | 必须为零字段。 | | Address family identifier | 16比特 | 地址族标识,其值为2时表示IP协议。对于Request报文,此字段值为0。 | | IP Address | 32比特 | 该路由的目的IP地址,可以是自然网段的地址,也可以是子网地址或主机地址。 | | Metric | 32比特 | 路由的开销值。对于Request报文,此字段值为16。 |

4.2 RIPv2 Message Format

  1. 0 7 15 23 31
  2. +---------------------------------------------------------------+
  3. | Command | Version | Must be zero |
  4. +---------------------------------------------------------------+
  5. | Address family identifier | Route Tag |
  6. +---------------------------------------------------------------+
  7. | IP Address |
  8. +---------------------------------------------------------------+
  9. | Subnet Mask |
  10. +---------------------------------------------------------------+
  11. | Next Hop |
  12. +---------------------------------------------------------------+
  13. | Metric |
  14. +---------------------------------------------------------------+
字段名 长度 含义
Command 8比特 标识报文的类型:
1:Request报文,向邻居请求全部或部分路由信息;
2:Reponse报文,发送自己全部或部分路由信息,一个Response报文中最多包含25个路由表项。
Version 8比特 RIP的版本号:

1:RIP-1
2:RIP-2 | | Must be zero | 16比特 | 必须为零字段。 | | Address Family Identifier | 16比特 | 地址族标识,其值为2时表示IP协议。对于Request报文,此字段值为0。 | | Route Tag | 16比特 | 外部路由标记。 | | IP Address | 32比特 | 该路由的目的IP地址,可以是自然网段的地址,也可以是子网地址或主机地址。 | | Subnet Mask | 32比特 | 目的地址的掩码。 | | Next Hop | 32比特 | 提供一个更好的下一跳地址。如果为0.0.0.0,则表示发布此路由的路由器地址就是最优下一跳地址。 | | Metric | 32比特 | 路由的开销值。对于Request报文,此字段为16。 |

4.3 RIPv2 Authentication Message Format

  1. 0 7 15 23 31
  2. +---------------------------------------------------------------+
  3. | Command | Version | Unused |
  4. +---------------------------------------------------------------+
  5. | oxFFFF | Authentication Type |
  6. +---------------------------------------------------------------+
  7. | |
  8. + +
  9. | Authentication |
  10. + +
  11. | |
  12. + +
  13. | |
  14. +---------------------------------------------------------------+
字段名 长度 含义
Command 8比特 标识报文的类型:
1:Request报文,向邻居请求全部或部分路由信息;
2:Reponse报文,发送自己全部或部分路由信息,一个Response报文中最多包含25个路由表项。
Version 8比特 RIP的版本号:

1:RIP-1
2:RIP-2 | | Unused | 16比特 | 保留未使用。 | | 0xFFFF | 16比特 | 验证项标识,表示整个路由报文需要验证。 | | Authentication Type | 16比特 | 验证类型:
2:明文验证;
3:MD5验证。 | | Authentication | 16字节 | 验证口令,当使用明文验证时该字段才会包含密码信息。 |

4.4 Reference Standards

标准 描述
RFC 1058 Routing Information Protocol
RFC 1721 RIP Version 2 Protocol Analysis
RFC 1722 RIP Version 2 Protocol Applicability Statement
RFC 1723 RIP Version 2 Carrying Additional Information
RFC 1724 RIP Version 2 MIB Extension
RFC 2082 RIP-2 MD5 Authentication
RFC 2453 RIP Version 2

4.5 Protocol Stack Structure

  1. +-------------------------------------+
  2. | RIP |
  3. +-------------------------------------+
  4. | UDP Header (Port = 520) |
  5. +-------------------------------------+
  6. | IPv4 Header |
  7. +-------------------------------------+
  8. | L2 |
  9. +-------------------------------------+
  10. | L1 |
  11. +-------------------------------------+

RIPng 概述

RIPng(RIP next generation,下一代 RIP 协议)是对原来的 IPv4 网络中 RIPv2 协议在 IPv6 网络上的扩展。为了在 IPv6 网络中应用,RIPng 对原有的 RIP 协议进行了部分修改。

1. RIPng/RIP 的区别

大多数 RIP 的概念都可以应用于 RIPng。

类型 RIPng RIP
端口号 RIPng 采用 521 端口 RIP 采用 520 端口
组播地址 采用组播 FF02::9 在链路本地范围内发布协议报文 采用组播(224.0.0.9)或广播发布协议报文
源地址 使用链路本地地址 FE80::/10 作为源地址发送路由信息更新报文 采用接口 IP 地址作为源地址发送路由信息更新报文
前缀长度 目的地址使用 128bit 的前缀长度(掩码长度) 目的目的地址采用自然网段或子网网段的前缀长度
下一跳地址 采用 128bit 的 IPv6 地址 采用 32bit 的 IPv4 地址
认证 调用 IPSec Sa 认证 采用简单密钥和 MD5 认证

2. 认证

RIPng 认证利用 IPSec(Internet Protocol Security)提供的一整套安全保护机制对 RIPng 协议报文的发送和接收进行认证处理,可以保证经过运营商网络的数据流不被修改,能够防止中间人攻击、保证用户传输的数据报文的机密性和完整性。认证不通过的报文将会被丢弃,保护 TCP/IP 通信免遭窃听和篡改,防止伪造的 RIPng 协议报文对设备进行非法攻击。目前只能采用 IPSec 的手工 SA 方向进行认证或加密。

3. RIPng 报文格式

RIPng 报文由头部(Header)和多个路由表项 RTEs(Route Table Entry)组成。在同一个报文中,RTE 的最大数目根据接口的 MTU 值来确定。
RIPng 有两类 RTE:

  • 下一跳 RTE:定义了下一跳的 IPv6 地址。通常为 0xFF。位于一组具有相同下一跳 “IPv6 前缀 RTE” 的最前面;
  • IPv6 前缀 RTE:描述了 RIPng 路由表中的目的 IPv6 地址及开销。位于某个 “下一跳 RTE” 的后面,同一个 “下一跳 RTE” 的后面可以有多个不同的 “IPv6 前缀 RTE”。

    3.1 RIPng Message Format

  1. 0 7 15 23 31
  2. +---------------------------------------------------------------+
  3. | Command | Version | Must be zero |
  4. +---------------------------------------------------------------+
  5. | |
  6. + +
  7. | |
  8. + +
  9. | Route table entry 1 (20 octers) |
  10. + +
  11. | |
  12. + +
  13. | |
  14. +---------------------------------------------------------------+
  15. | ... |
  16. +---------------------------------------------------------------+
  17. | |
  18. + +
  19. | |
  20. + +
  21. | Route table entry N (20 octers) |
  22. + +
  23. | |
  24. + +
  25. | |
  26. +---------------------------------------------------------------+
字段名 长度 含义
Command 8比特 标识报文的类型:

1:Request报文,向邻居请求全部或部分路由信息
2:Reponse报文,发送自己全部或部分路由信息。路由条目与链路MTU有关。 | | Version | 8比特 | RIPng的版本号:其值为1。 | | Must be zero | 16比特 | 必须为零字段。 | | Route table entry | 20字节 | 路由表项。 |

3.2 Next Jump RTE Message Format

  1. 0 7 15 23 31
  2. +---------------------------------------------------------------+
  3. | |
  4. + +
  5. | |
  6. + +
  7. | IPv6 next hop address (16 octers) |
  8. + +
  9. | |
  10. +---------------------------------------------------------------+
  11. | Must be zero | Must be zero | 0xFF |
  12. +---------------------------------------------------------------+

3.3 IPv6 Prefix RTE Message Format

  1. 0 7 15 23 31
  2. +---------------------------------------------------------------+
  3. | |
  4. + +
  5. | |
  6. + +
  7. | IPv6 prefix (16 octers) |
  8. + +
  9. | |
  10. +---------------------------------------------------------------+
  11. | Route tag | Prefix len | Metric |
  12. +---------------------------------------------------------------+
字段名 长度 含义
IPv6 prefix 16字节 目的IPv6地址的前缀。
Route tag 16比特 路由标记,用来区分外部路由。
Prefix len 8比特 IPv6地址的前缀长度。
Metric 8比特 路由的度量值(开销)。

3.4 Reference Standards

标准 描述
RFC 2080 RIPng for IPv6