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网络中运行。