2.1.2 RIPng的工作机制
(1)
路由器启动
RIP
后,便会向相邻的路由器发送请求报文。接着,路由器将不断侦听来自其它路由器的
RIP
请求消息或响应消息。
(2)
当发出请求的路由器收到响应报文后,路由器将处理响应报文中的路由更新消息并对自己的路由表进行更新,同时向相邻路由器发送触发更新报文,通告路由更新信息。
(3)
相邻路由器收到触发更新报文后,又向其各自的相邻路由器发送触发更新报文。在一连串的触发更新广播后,各路由器都能得到并保持最新的路由信息。
如下所示,当一台路由器加入到
RIPng
网络中,采用
debug ipv6 rip
采集到的路由器更新信息。
R2#
*Sep 3 20:52:30.991: RIPng: response received from FE80::C800:4FF:FE2C:1C on Ethernet1/0 for ripng
*Sep 3 20:52:30.991: src=FE80::C800:4FF:FE2C:1C (Ethernet1/0)
*Sep 3 20:52:30.991: dst=FF02::9
*Sep 3 20:52:30.991: sport=521, dport=521, length=52
*Sep 3 20:52:30.995: command=2, version=1, mbz=0, #rte=2
*Sep 3 20:52:30.995: tag=0, metric=1, prefix=2001:1:DB2::/64
*Sep 3 20:52:30.995: tag=0, metric=1, prefix=2001:2:DB2::/64
*Sep 3 20:52:30.995: RIPng: Added neighbor FE80::C800:4FF:FE2C:1C/Ethernet1/0
*Sep 3 20:52:30.999: RIPng: Inserted 2001:1:DB2::/64, nexthop FE80::C800:4FF:FE2C:1C, metric 2, tag 0
*Sep 3 20:52:30.999: RIPng: Inserted 2001:2:DB2::/64, nexthop FE80::C800:4FF:FE2C:1C, metric 2, tag 0
*Sep 3 20:52:31.003: RIPng: Triggered update requested
*Sep 3 20:52:31.003: RIPng: request received from FE80::C800:4FF:FE2C:1C on Ethernet1/0 for ripng
*Sep 3 20:52:31.003: src=FE80::C800:4FF:FE2C:1C (Ethernet1/0)
*Sep 3 20:52:31.003: dst=FF02::9
*Sep 3 20:52:31.007: sport=521, dport=521, length=32
*Sep 3 20:52:31.007: command=1, version=1, mbz=0, #rte=1
*Sep 3 20:52:31.007: tag=0, metric=16, prefix=::/0
*Sep 3 20:52:31.007: RIPng: Sending unicast update to FE80::C800:4FF:FE2C:1C for ripng
*Sep 3 20:52:31.011: src=FE80::C800:3FF:FE04:1C
*Sep 3 20:52:31.011: dst=FE80::C800:4FF:FE2C:1C (Ethernet1/0)
*Sep 3 20:52:31.011: sport=521, dport=521, length=132
*Sep 3 20:52:31.011: command=2, version=1, mbz=0, #rte=6
*Sep 3 20:52:31.015: tag=0, metric=1, prefix=2001:2:DB2::/64
*Sep 3 20:52:31.015: tag=0, metric=1, prefix=2001:3:DB2::/64
*Sep 3 20:52:31.015: tag=0, metric=1, prefix=2001:4:DB2::/64
*Sep 3 20:52:31.015: tag=0, metric=2, prefix=2001:5:DB2::/64
*Sep 3 20:52:31.019: tag=0, metric=2, prefix=2001:6:DB2::/64
*Sep 3 20:52:31.019: tag=0, metric=1, prefix=2001:7:DB2::/64
*Sep 3 20:52:32.003: RIPng: generating triggered update for ripng
*Sep 3 20:52:32.003: RIPng: Suppressed null multicast update on Serial2/0 for ripng
*Sep 3 20:52:32.007: RIPng: Suppressed null multicast update on Ethernet1/1 for ripng
*Sep 3 20:52:32.007: RIPng: Suppressed null multicast update on Ethernet1/0 for ripng
*Sep 3 20:52:32.007: RIPng: Suppressed null multicast update on FastEthernet0/0 for ripng
*Sep 3 20:52:35.279: RIPng: response received from FE80::C800:2FF:FE8C:1C on Ethernet1/1 for ripng
*Sep 3 20:52:35.279: src=FE80::C800:2FF:FE8C:1C (Ethernet1/1)
*Sep 3 20:52:35.283: dst=FF02::9
*Sep 3 20:52:35.283: sport=521, dport=521, length=52
*Sep 3 20:52:35.283: command=2, version=1, mbz=0, #rte=2
*Sep 3 20:52:35.283: tag=0, metric=1, prefix=2001:3:DB2::/64
*Sep 3 20:52:35.283: tag=0, metric=1, prefix=2001:5:DB2::/64
*Sep 3 20:52:40.715: RIPng: Sending multicast update on Serial2/0 for ripng
*Sep 3 20:52:40.715: src=FE80::C800:3FF:FE04:0
*Sep 3 20:52:40.719: dst=FF02::9 (Serial2/0)
*Sep 3 20:52:40.719: sport=521, dport=521, length=132
*Sep 3 20:52:40.719: command=2, version=1, mbz=0, #rte=6
*Sep 3 20:52:40.719: tag=0, metric=1, prefix=2001:2:DB2::/64
*Sep 3 20:52:40.719: tag=0, metric=1, prefix=2001:3:DB2::/64
*Sep 3 20:52:40.723: tag=0, metric=1, prefix=2001:4:DB2::/64
*Sep 3 20:52:40.723: tag=0, metric=1, prefix=2001:7:DB2::/64
*Sep 3 20:52:40.723: tag=0, metric=2, prefix=2001:5:DB2::/64
*Sep 3 20:52:40.723: tag=0, metric=2, prefix=2001:1:DB2::/64
*Sep 3 20:52:40.727: RIPng: Sending multicast update on Ethernet1/1 for ripng
*Sep 3 20:52:40.727: src=FE80::C800:3FF:FE04:1D
*Sep 3 20:52:40.731: dst=FF02::9 (Ethernet1/1)
*Sep 3 20:52:40.731: sport=521, dport=521, length=132
*Sep 3 20:52:40.731: command=2, version=1, mbz=0, #rte=6
*Sep 3 20:52:40.731: tag=0, metric=1, prefix=2001:2:DB2::/64
*Sep 3 20:52:40.731: tag=0, metric=1, prefix=2001:3:DB2::/64
*Sep 3 20:52:40.735: tag=0, metric=1, prefix=2001:4:DB2::/64
*Sep 3 20:52:40.735: tag=0, metric=1, prefix=2001:7:DB2::/64
*Sep 3 20:52:40.735: tag=0, metric=2, prefix=2001:6:DB2::/64
*Sep 3 20:52:40.735: tag=0, metric=2, prefix=2001:1:DB2::/64
*Sep 3 20:52:40.739: RIPng: Sending multicast update on Ethernet1/0 for ripng
*Sep 3 20:52:40.739: src=FE80::C800:3FF:FE04:1C
*Sep 3 20:52:40.739: dst=FF02::9 (Ethernet1/0)
*Sep 3 20:52:40.743: sport=521, dport=521, length=132
*Sep 3 20:52:40.743: command=2, version=1, mbz=0, #rte=6
*Sep 3 20:52:40.743: tag=0, metric=1, prefix=2001:2:DB2::/64
*Sep 3 20:52:40.743: tag=0, metric=1, prefix=2001:3:DB2::/64
*Sep 3 20:52:40.747: tag=0, metric=1, prefix=2001:4:DB2::/64
*Sep 3 20:52:40.747: tag=0, metric=1, prefix=2001:7:DB2::/64
*Sep 3 20:52:40.747: tag=0, metric=2, prefix=2001:5:DB2::/64
*Sep 3 20:52:40.747: tag=0, metric=2, prefix=2001:6:DB2::/64
*Sep 3 20:52:40.751: RIPng: Sending multicast update on FastEthernet0/0 for ripng
*Sep 3 20:52:40.751: src=FE80::C800:3FF:FE04:0
*Sep 3 20:52:40.751: dst=FF02::9 (FastEthernet0/0)
*Sep 3 20:52:40.755: sport=521, dport=521, length=152
*Sep 3 20:52:40.755: command=2, version=1, mbz=0, #rte=7
*Sep 3 20:52:40.755: tag=0, metric=1, prefix=2001:2:DB2::/64
*Sep 3 20:52:40.755: tag=0, metric=1, prefix=2001:3:DB2::/64
*Sep 3 20:52:40.755: tag=0, metric=1, prefix=2001:4:DB2::/64
*Sep 3 20:52:40.759: tag=0, metric=1, prefix=2001:7:DB2::/64
*Sep 3 20:52:40.759: tag=0, metric=2, prefix=2001:5:DB2::/64
*Sep 3 20:52:40.759: tag=0, metric=2, prefix=2001:6:DB2::/64
*Sep 3 20:52:40.759: tag=0, metric=2, prefix=2001:1:DB2::/64
*Sep 3 20:52:49.323: RIPng: response received from FE80::C800:6FF:FE24:0 on Serial2/0 for ripng
*Sep 3 20:52:49.323: src=FE80::C800:6FF:FE24:0 (Serial2/0)
*Sep 3 20:52:49.327: dst=FF02::9
*Sep 3 20:52:49.327: sport=521, dport=521, length=52
*Sep 3 20:52:49.327: command=2, version=1, mbz=0, #rte=2
*Sep 3 20:52:49.327: tag=0, metric=1, prefix=2001:4:DB2::/64
*Sep 3 20:52:49.327: tag=0, metric=1, prefix=2001:6:DB2::/64
*Sep 3 20:52:57.711: RIPng: response received from FE80::C800:4FF:FE2C:1C on Ethernet1/0 for ripng
*Sep 3 20:52:57.711: src=FE80::C800:4FF:FE2C:1C (Ethernet1/0)
*Sep 3 20:52:57.715: dst=FF02::9
*Sep 3 20:52:57.715: sport=521, dport=521, length=52
*Sep 3 20:52:57.715: command=2, version=1, mbz=0, #rte=2
*Sep 3 20:52:57.715: tag=0, metric=1, prefix=2001:1:DB2::/64
*Sep 3 20:52:57.715: tag=0, metric=1, prefix=2001:2:DB2::/64
根据上面所示,当路由收到网络中的一台路由器请求时,在回复更新时会采用单播的方式,主要是为节省网络资源。当收到了新加入路由器的路由条目后,会更新自己的路由表,并以触发更新的模式向路由器的其它接口进行组播其路由表。
RIPng
把参与通信的机器分为主动和被动两种方式。主动路由器向其他路由器通告路由,而被动路由器接收通告并更新其路由,被动路由器自己并不通告路由。只有路由器以主动方式使用
RIPng
,主机只能使用被动方式,因为主机并不了解路由信息。
运行
RIPng
的路由器维持一个到所有可能目的网络的路由表,路由器周期性地(
RFC
推荐为
30s
)向邻居节点发送该路由器的路由表,接收方通过接收邻居路由器的周期性通告更新自己的路由表。这种周期性的路由信息的交换使得每个路由器形成对网络拓扑结构的局部的认识。
RIPng
使用到达目的站点所经过的链路数,即跳数来度量路由花费,同时
RFC
规定
RIPng
的工作范围为
15
跳,数值
16
表示无穷大,即意味着路由不可达。
路由器通常不会主动发出请求报文来进行路由请求,路由请求通常只是在路由器刚启动或是路由器正在寻找路由信息时才会发出请求报文以获得响应。
路由器在查询响应、周期更新、触发更新三种情况下会收到响应报文。路由器根据响应报文判断是否对本地路由表进行更新。由于响应报文可能对本地路由表进行改动,因此对报文的来源必须进行严格的检查,以确认报文的合法性。
基于距离矢量算法的路由协议会产生慢收敛和无限计数问题,这样就引发了路由的不一致。
RIPng
使用水平分割技术、毒性逆转技术、触发更新技术来解决这些问题,但是这些技术的引入,同时又带来了另一些问题,如采用触发更新技术后,如果不对产生的报文进行合理的控制,很容易产生广播风暴。
路由器周期性的报文广播和触发更新给网络造成很多额外的负载,为减少路由信息的数量,
RIPng
可以采用多播技术发送更新报文,同时利用一个小的随机时延对触发更新报文进行抑制。
定时器在
RIPng
中起着非常重要的作用,
RIPng
使用定时器来实现路由表的更新、报文的发送。周期性的报文广播是由定时器实现的,另外为防止路由表长时间未更新而失效,每个路由表项有两个定时器与之相联系,超时的路由表项最终将会被删除,以防止路由器广播和使用已经失效的路由。
RIPng
中使用的定时器主要有以下三个:
Ø
更新定时器
:此定时器被设置成
25s
到
35s
之间的任一随机数。这样设置的目的是为了避免网络上所有路由器以相同的定时发送更新报文,利用随机间隔可以均衡通信量,从而减少路由器之间发生冲突的可能性。
Ø
期满定时器
:路由器只要收到通往特定信宿路由,就对通往该信宿的期满定时器初始化。期满定时器被设定为
180s
,如果一条路由在期满定时器超时前未得到相关报文的更新,则该条路由不再有效,但仍保留在路由表中,以便通知其他路由器这条路由已经失效。
Ø
垃圾收集定时器
:路由器对无效路由打上尺度为无穷大的无效标记并将垃圾收集定时器初始化。此时,定时器被设置为
120s
,在这段时间内这些路由仍然会被路由器周期性地广播,这样相邻路由器就能迅速从路由表中删除该路由。
如下图所示:
2.1.3 RIPng与RIPv1、RIPv2区别
通过以上小节的学习,
RIPng
的目标并不是创造一个全新的协议,而是对
RIP
进行必要的改造以使其适应
IPv6
下的选路要求,因此
RIPng
的基本工作原理同
RIP
是一样的,但其与
RIP
也存在很区别,具体区别如下:
(
1
)报文结构不同
n
地址版本不同
²
RIPv1
、
RIPv2
是基于
IPv4
的,地址域只有
32bit
,
²
RIPng
基于
IPv6
,使用的所有地址均为
128bit
。
n
子网掩码和前缀长度不同
²
RIPv1
被设计成用于无子网的网络,因此没有子网掩码的概念,这就决定了
RIPv1
不能用于传播变长的子网地址或用于
CIDR
的无类型地址。
²
RIPv2
增加了对子网选路的支持,因此使用子网掩码区分网络路由和子网路由。
²
IPv6
的地址前缀有明确的含义,因此
RIPng
中不再有子网掩码的概念,取而代之的是前缀长度。同样也是由于使用了
IPv6
地址,
RIPng
中也没有必要再区分网络路由、子网路由和主机路由。
n
协议的使用范围不同
²
RIPv1
、
RIPv2
的使用范围被设计成不只局限于
TCP/IP
协议簇,还能适应其他网络协议簇的规定,因此报文的路由表项中包含有网络协议簇字段,但实际的实现程序很少被用于其他非
IP
的网络,因此
RIPng
中去掉了对这一功能的支持。
n
对下一跳的表示不同
²
RIPv1
中没有下一跳的信息,接收端路由器把报文的源
IP
地址作为到目的网络路由的下一跳。
²
RIPv2
中明确包含了下一跳信息,便于选择最优路由和防止出现选路环路及慢收敛。
²
与
RIPv2
不同,为防止
RTE
过长,同时也是为了提高路由信息的传输效率,
RIPng
中的下一跳字段是作为一个单独的
RTE
存在的。
n
报文长度不同
²
RIPv1
、
RIPv2
中对报文的长度均有限制,规定每个报文最多只能携带
25
个
RTE
。
²
RIPng
对报文长度、
RTE
的数目都不作规定,报文的长度是由介质的
MTU
决定的。
RIPng
对报文长度的处理,提高了网络对路由信息的传输效率。
n
报文的发送方式不同
²
RIPv1
使用广播来发送路由信息,不仅路由器会接收到分组,同一局域网内的所有主机也会接收到分组,这样做是不必要的,也是不安全的。
²
RIPv2
既可以使用广播也可以使用多播发送报文,这样在支持多播的网络中就可以使用多播来发送报文,大大降低了网络中传播的路由信息的数量。
²
RIPng
使用组播方式周期性地发送路由信息。
(
2
)安全认证不同
n
RIPv1
报文中并不包含验证信息,因此也是不安全的,任何通过
UDP
的
520
端口发送分组的主机,都会被邻机当作一个路由器,从而很容易造成路由器欺骗。
n
RIPv2
设计了验证报文来增强安全性,进行路由交换的路由器之间必须通过验证才能接收彼此的路由信息,但是
RIPv2
的安全性还是很不充分的。
n
RIPng
自身不提供认证功能,而是通过使用
IPv6
提供的安全机制来保证自身报文的合法性。
(
3
)与网络层协议的兼容性不同
n
RIP
不仅能在
IP
网络中运行,也能在
IPX
网络中运行;
n
RIPng
只能在
IPv6
网络中运行。