IPv6路由技术

路由技术主要是指路由选择算法,路由技术是网络的核心内容,也是网络工程师必须掌握的内容。下面我们一起来学习一下路由原理和路由协议;并通过实验来演示常见的直连、静态、默认和动态路由的配置,剖析路由的选路原则。学完之后我们对路由的工作原理,常用路由协议的配置会有一个全面的了解,当然这也有助于日常网络故障的排除。

1、路由基础

1.1、路由原理

路由选择发生在网络层,主要由路由器来完成。路由器有多个接口,用于连接不同的IPv6网段,不同接口的IPv6前缀不能重叠。路由器的工作就是接收数据分组,然后根据当前网络的状况选择最有效的路径将其转发出去。路由器中的路由表必须实时更新,以准确地反映当前的网络状态。网络前缀相同的主机之间可以直接通信,网络前缀不同的主机之间若要通信,则必须经过同一网段上的某个路由器或网关(gateway)实现。路由器在转发IPv6分组时,根据目的IPv6地址的网络前缀选择合适的接口,把IPv6分组发送出去。路由技术就是为了转发IP数据分组而在通信子网中寻找最佳传输路径,以将其发送到最终设备。为了判定最佳路径,首先要选择一种路由协议,不同的路由协议使用不同的度量值。所谓度量值,即判断传输路径好坏的评价标准。

度量值包括跳数(hop count,即经过路由器的数量)、带宽(bandwidth)、延时(delay)、可靠性(reliability)、负载(load)、滴答数(tick)和开销(cost)等。路由选择算法必须启动并维护包含路由信息的路由表,其中路由信息因所用的路由选择算法而不尽相同。路由选择算法将收集到的不同信息填入路由表中,根据路由表可将目的网络与下一跳(next-hop)的关系告诉路由器。路由器间互通信息进行路由更新,以更新维护路由表,使之正确反映网络的拓扑变化,并根据度量值来决定最佳路径,这就是路由协议( Routing Protocol ) 。例如RIP 下一代版本(Routing Information Protocol next generation,RIPng)、增强型内部网关路由协议( Enhanced Interior Gateway Routing Protocol , EIGRP ) 、开放式最短路径优先协议版本3 ( OpenShortest-Path First v3 , OSPFv3 ) 和边界网关协议( Border Gateway Protocol,BGP)等都是常见的路由协议。

就BGP来讲,现在使用的是BGP-4,也就是边界网关协议版本4,它仅支持IPv4路由信息。IETF对BGP-4进行了扩展,提出了BGP4+,称为BGP-4多协议扩展,可以支持IPv6。鉴于一般单位使用不到BGP,这里我们BGP就不做过多的介绍,感兴趣的小伙伴可自行百度。而所谓的路由转发即沿寻址好的最佳路径传送数据分组。路由器首先在路由表中查找相关信息,以查询将分组发送到下一跳(路由器或主机)的最佳路由,如果路由器不知道如何发送分组,通常会将该分组丢弃;否则就根据路由表的相应表项将分组发送到下一跳;如果目的网络直接与路由器相连,那么路由器就把分组直接发送到相应的接口上。

1.2、路由协议

在讲解路由协议之前,我们先要搞清楚路由协议(Routing Protocol)和被路由协议(Routed Protocol)的区别。路由器使用动态路由协议在互联网上动态发现所有网络,用来构建动态路由表。被路由协议有时也称为可路由协议,它按照路由协议构建的路由表来通过互联网转发用户数据。根据路由器学习路由信息、生成并维护路由表的方式,可将路由分为直连路由、静态路由和动态路由。直连路由通过接口配置生成,静态路由通过管理员手动配置生成,动态路由通过动态路由协议计算生成。

如下图所示,动态路由协议根据所处的自治系统(Autonomic Systems,AS)不同,又分为内部网关协议(Interior Gateway Protocol,IGP)和外部网关协议(Exterior Gateway Protocol,EGP)。这里的自治系统是指一个具有统一管理机构、统一路由策略的网络。

image-20220314112729273

IGP协议是指在同一个AS内运行的路由协议,又分为距离矢量路由协议(典型代表是RIP,针对IPv6的是RIPng)和链路状态路由协议(典型代表是OSPF,针对IPv6的是OSPFv3)。EGP协议是指运行在不同AS之间的路由协议,目前使用最多的是BGP协议,BGP协议也属于动态路由协议,BGP协议对配置人员的要求比较高,在实际工作环境中遇到的概率不大,所以这里我们不对BGP做过多叙述。

2、直连路由

直连路由由数据链路层协议发现,是指去往路由器的接口IPv6地址所在网段的路径,该路径信息不需要网络管理员维护,也不需要路由器通过某种算法进行计算获得,只要该接口处于激活状态(active),路由器就会把直连接口所在网段的路由信息填写到路由表中去。在IPv4中,路由器会自动产生激活接口所在网段的直连路由。在IPv6中,路由器同样也会自动产生激活接口所在网段的直连路由;我们用下面的实验拓扑来演示一下什么是直连路由。

image-20220314113017771

R1的配置如下:

Router>enable 
Router#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
Router(config)#hostname Router-1
# 开启IPv6路由协议,有些路由器默认并没有开启IPv6路由支持
Router-1(config)#ipv6 unicast-routing
# 配置环回接口0,这是路由器上的虚拟接口,可用来模拟路由
Router-1(config)#interface Loopback 0
# 启用接口的IPv6功能,默认情况下,接口的IPv6功能处于未启用状态。未启用状态的接口不会处理某些IPv6报文,比如ND中的RA报文。
# 没有RA报文,接口将无法通过RA获取网络前缀和网关,也就无法形成IPv6地址。此命令不是必需的,在接口配置IPv6地址后,同样的功能也会开启。
Router-1(config-if)#ipv6 enable 
Router-1(config-if)#ipv6 add 2001:1::1/64
Router-1(config-if)#no shutdown 
Router-1(config-if)#exit
Router-1(config)#int ethernet 0/0
Router-1(config-if)#ipv6 enable 
Router-1(config-if)#ipv6 add 2001:2::1/64
Router-1(config-if)#no shutdown 
Router-1(config-if)#end
Router-1#wr
Building configuration...
[OK]

R2的配置如下:

Router>en
Router#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
Router(config)#hostname Router-2
Router-2(config)#ipv6 unicast-routing 
Router-2(config)#interface Loopback 0
Router-2(config-if)#ipv6 enable 
Router-2(config-if)#ipv6 add 2001:3::1/64
Router-2(config-if)#no shutdown 
Router-2(config-if)#exit
Router-2(config)#interface Ethernet 0/0
Router-2(config-if)#ipv6 enable 
Router-2(config-if)#ipv6 add 2001:2::2/64
Router-2(config-if)#no shutdown 
Router-2(config-if)#end
Router-2#wr
Building configuration...
[OK]

在Router-2执行show ipv6 route命令,显示如下:

Router-2#show ipv6 route
IPv6 Routing Table - default - 5 entries
Codes: C - Connected, L - Local, S - Static, U - Per-user Static route
       B - BGP, HA - Home Agent, MR - Mobile Router, R - RIP
       H - NHRP, I1 - ISIS L1, I2 - ISIS L2, IA - ISIS interarea
       IS - ISIS summary, D - EIGRP, EX - EIGRP external, NM - NEMO
       ND - ND Default, NDp - ND Prefix, DCE - Destination, NDr - Redirect
       O - OSPF Intra, OI - OSPF Inter, OE1 - OSPF ext 1, OE2 - OSPF ext 2
       ON1 - OSPF NSSA ext 1, ON2 - OSPF NSSA ext 2, la - LISP alt
       lr - LISP site-registrations, ld - LISP dyn-eid, a - Application
# C表示直连路由,与IPv4相同,是接口所在网段的路由。
# 这里的[0/0],其中前面的0代表管理距离,管理距离越小,路由越优先;后面的0代表度量值也称为开销,在管理距离相同的情况下,度量值越小的路由越优先。
# 对于直连路由,管理距离默认是0,度量值默认是0。
C   2001:2::/64 [0/0]
    # 通过Eth0/0接口可到达这个网段,是直连的路由。
     via Ethernet0/0, directly connected
# L表示本地,这是接口IP所在的128位的主机路由。
L   2001:2::2/128 [0/0]
     via Ethernet0/0, receive
C   2001:3::/64 [0/0]
     via Loopback0, directly connected
L   2001:3::1/128 [0/0]
     via Loopback0, receive
# L表示本地,多播地址空间的路由。
L   FF00::/8 [0/0]
     via Null0, receive
Router-2#

3、静态路由

静态路由是指由网络管理员手动配置的路由信息。IPv4和IPv6网络都支持静态路由。当网络的拓扑或链路状态发生变化时,网络管理员需要手动修改路由表中相关的静态路由信息。静态路由信息是私有的,不会传递给其他的路由器。

3.1、常规静态路由

在前面的实验中,Router-1是无法ping通2001:3::1。在Router-1上执行show ipv6 route命令,可以发现路由表中没有2001:3::/64的路由。那么,有什么办法可以让Router-1能ping通2001:3::1呢?解决的办法之一就是配置静态路由,这需要管理员手动配置。

Router-1#ping 2001:3::1
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 2001:3::1, timeout is 2 seconds:

% No valid route for destination
Success rate is 0 percent (0/1)
Router-1#show ipv6 route
IPv6 Routing Table - default - 5 entries
Codes: C - Connected, L - Local, S - Static, U - Per-user Static route
       B - BGP, HA - Home Agent, MR - Mobile Router, R - RIP
       H - NHRP, I1 - ISIS L1, I2 - ISIS L2, IA - ISIS interarea
       IS - ISIS summary, D - EIGRP, EX - EIGRP external, NM - NEMO
       ND - ND Default, NDp - ND Prefix, DCE - Destination, NDr - Redirect
       O - OSPF Intra, OI - OSPF Inter, OE1 - OSPF ext 1, OE2 - OSPF ext 2
       ON1 - OSPF NSSA ext 1, ON2 - OSPF NSSA ext 2, la - LISP alt
       lr - LISP site-registrations, ld - LISP dyn-eid, a - Application
C   2001:1::/64 [0/0]
     via Loopback0, directly connected
L   2001:1::1/128 [0/0]
     via Loopback0, receive
C   2001:2::/64 [0/0]
     via Ethernet0/0, directly connected
L   2001:2::1/128 [0/0]
     via Ethernet0/0, receive
L   FF00::/8 [0/0]
     via Null0, receive
Router-1#

在前面的拓扑图中,如果路由器Router-1知道把去往2001:3::1的数据包发给Router-2,Router-1路由器默认会使用距离目标最近的接口IP作为源IP,也就是Router-1使用2001:2::1作为源IP地址,去pingRouter-2。Router-2收到数据包后,查询ping包的目的IP地址,发现2001:3::1/128是本地接口路由,然后再查询ping包的源IP地址,发现是来自2001:2::1的数据包。Router-2查询本地的路由表,发现
2001:2::/64是直连路由,于是把ping的应答包从eth0/0接口发出。Router-1收到应答包,表示ping成功。关键是管理员如何通知路由器Router-1去往2001:3::1的数据包要发往Router-2呢?这就需要添加静态路由。添加静态路由的命令格式如下:

Router-1(config)#ipv6 route 2001:3::/64 ?
  Async              Async interface
  Auto-Template      Auto-Template interface
  BVI                Bridge-Group Virtual Interface
  CDMA-Ix            CDMA Ix interface
  CTunnel            CTunnel interface
  Dialer             Dialer interface
  Ethernet           IEEE 802.3
  GMPLS              MPLS interface
  LISP               Locator/ID Separation Protocol Virtual Interface
  LongReachEthernet  Long-Reach Ethernet interface
  Loopback           Loopback interface
  Lspvif             LSP virtual interface
  MFR                Multilink Frame Relay bundle interface
  Multilink          Multilink-group interface
  Null               Null interface
  Tunnel             Tunnel interface
  Vif                PGM Multicast Host interface
  Virtual-PPP        Virtual PPP interface
  Virtual-Template   Virtual Template interface
  Virtual-TokenRing  Virtual TokenRing
  X:X:X:X::X         IPv6 address of next-hop
  vmi                Virtual Multipoint Interface

IPv6静态路由的配置与IPv4的类似,它使用的命令是ipv6 route,后面是要去往的目的网络。在IPv4中,目的网络采用“网络号+网络掩码”的形式表示,在IPv6中则是网络地址后跟“/网络前缀长度”。这里配置的2001:3::/64,表示的是去往以2001:0003:0000:0000为起始地址的所有IPv6地址。接下来是输入下一跳路由器直连接口的IP地址,或者输入本路由器的外出接口。两者之间的区别将通过下面的示例来演示。路由器Router-1使用下一跳路由器直连接口的IP地址作为去往2001:3::/64的静态路由,命令如下:

Router-1(config)#ipv6 route 2001:3::/64 2001:2::2

这里特别要注意的是,即使要到达的网络与本路由器相隔数台路由器,这里填入的还是下一跳地址,而不是目标网络的前一跳。也就是说,在静态路由中,只需指出下一跳的地址即可,至于以后如何指向,则是下一跳路由器考虑的事情。此时,在Router-1上ping 2001:3::1,可以ping通。取消上面的静态路由命令,改用外出接口,命令如下:

Router-1#ping 2001:3::1
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 2001:3::1, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 1/4/16 ms
Router-1#

Router-1(config)#no ipv6 route 2001:3::/64 2001:2::2
Router-1(config)#ipv6 route 2001:3::/64 ethernet 0/0

这里使用的是路由器Router-1的外出接口。在Router-1上ping2001:3::1,发现无法ping通。

Router-1#ping 2001:3::1
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 2001:3::1, timeout is 2 seconds:
.....
Success rate is 0 percent (0/5)
Router-1#

这两条命令都是在Router-1上添加一条去往2001:3::/64网段的静态路由。由上可知,至于添加的是下一跳的地址还是本路由器的外出接口,还是有差别的。本路由器出口命令仅能用在点对点的链路上,比如串行线路。串行线路是在数据链路层封装一种协议,如高级数据链路控制(High Level Data Link Control,HDLC)协议或点对点协议(Point-to-Point Protocol,PPP)。这两个协议在点对点链路上使用时,链路一端的设备发送数据后,对端设备就能收到。如果串行线路封装的是帧中继(Frame-Relay)协议,由于帧中继链路默认是非广播多路访问(Non-Broadcast Multiple Access,NBMA)链路,这时需要指向下一跳路由器的接口IP地址,而不能是外出接口。

如果是以太网这种多路访问链路,若使用外出接口,则路由器将不知道把包发往哪一台路由器,也不知道要发往哪一个IPv6地址,自然也就无法完成数据链路层的解析过程。在不知道下一跳设备MAC地址的情况下,也就无法完成ping包的数据封装。同理,在多路访问的帧中继链路上,因不知道具体使用哪一条永久虚电路(Permanent Virtual Circuit,PVC),也不能使用外出接口。使用下面的命令在Router-1上恢复静态路由的配置:

Router-1(config)#no ipv6 route 2001:3::/64 ethernet 0/0
Router-1(config)#ipv6 route 2001:3::/64 2001:2::2

使用下面的命令在Router-2上配置静态路由:

Router-2(config)#ipv6 route 2001:1::/64 2001:2::1

Router-2#ping 2001:1::1
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 2001:1::1, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 1/3/5 ms
Router-2#

配置完成后,Router-2就可以ping通Router-1环回接口的IP地址了。

路由器默认会使用距离目的最近的接口IP执行ping操作。下面的命令强制Router-1使用环回接口的IP地址2001:1::1去ping路由器Router-2的环回接口的IP地址2001:3::1:

Router-1#ping ipv6 2001:3::1 source 2001:1::1
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 2001:3::1, timeout is 2 seconds:
Packet sent with a source address of 2001:1::1
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 1/1/1 ms
Router-1#

在路由器Router-2上执行debug ipv6 icmp命令,检测Router-1来访的IPv6地址,显示如下:

Router-2#debug ipv6 icmp
  ICMPv6 Packet debugging is on
Router-2#
*Mar 14 15:10:56.087: ICMPv6: Received echo request, Src=2001:1::1, Dst=2001:3::1
*Mar 14 15:10:56.087: ICMPv6: Sent echo reply, Src=2001:3::1, Dst=2001:1::1
*Mar 14 15:10:56.087: ICMPv6: Received echo request, Src=2001:1::1, Dst=2001:3::1
*Mar 14 15:10:56.087: ICMPv6: Sent echo reply, Src=2001:3::1, Dst=2001:1::1
*Mar 14 15:10:56.088: ICMPv6: Received echo request, Src=2001:1::1, Dst=2001:3::1
*Mar 14 15:10:56.088: ICMPv6: Sent echo reply, Src=2001:3::1, Dst=2001:1::1
*Mar 14 15:10:56.088: ICMPv6: Received echo request, Src=2001:1::1, Dst=2001:3::1
*Mar 14 15:10:56.088: ICMPv6: Sent echo reply, Src=2001:3::1, Dst=2001:1::1
Router-2#
*Mar 14 15:10:56.089: ICMPv6: Received echo request, Src=2001:1::1, Dst=2001:3::1
*Mar 14 15:10:56.089: ICMPv6: Sent echo reply, Src=2001:3::1, Dst=2001:1::1
Router-2#

从上面的输出可以看出,Router-1是使用环回接口去ping路由器Router-2的环回接口的。

好了、讲了这么多;大家对静态路由技术已经非常了解了。下面我们总结一下配置静态路由的一般步骤。步骤1:为路由器每个接口配置IP地址。步骤2:确定本路由器有哪些直联网段。步骤3:确定网络中有哪些属于本路由器的非直联网段。步骤4:在路由表中添加所有非本路由器直联网段的相关路由信息。是不是很简单呢?下面我们来看一下详细的配置静态路由的实验。

3.2、配置静态路由

image-20220314161858596

分析:实验拓扑如上,我们根据前面配置静态路由的总结,首先配置接口IP地址。然后分析每台路由器有哪些直联网段,有哪些非直接网段,然后给所有非直联网段添加静态路由。整个网络中有6个环回口路由,2个互联网络,共8个网段。这里以Router-1为例,有3个直联网段(2001:da8:1011:1001::/64、2001:da8:1011:1002::/64、2001:da8:1011:f001::/64),需要添加5(8-3=5)段路由(2001:da8:1011:2001::/64、2001:da8:1011:2002::/64、2001:da8:1011:3001::/64、2001:da8:1011:3002::/64、2001:da8:1011:f001::/64)。Router-2直连了4个网段,只需要添加4条静态路由。Router-3同Router-1一样,直连了3个网段,需要添加5条静态路由。我们先来配置Router-1,配置信息如下:

Router>en
Router#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
Router(config)#hostname Router-1
Router-1(config)#ipv6 unicast-routing 
Router-1(config)#int lo0
Router-1(config-if)#ipv6 add 2001:da8:1011:1001::1/64
Router-1(config-if)#int lo1
Router-1(config-if)#ipv6 add 2001:da8:1011:1002::1/64
Router-1(config-if)#int eth0/0
Router-1(config-if)#ipv6 add 2001:da8:1011:f001::1/64
Router-1(config-if)#no shutdown 
Router-1(config-if)#exit
# 去往Router-2环回接口0
Router-1(config)#ipv6 route 2001:da8:1011:2001::/64 2001:da8:1011:f001::2
# 去往Router-2环回接口1
Router-1(config)#ipv6 route 2001:da8:1011:2002::/64 2001:da8:1011:f001::2
# 去往Router-3环回接口0,不管之间隔了多少台路由器,只需要把数据包发给下一台路由器直连接口的IP地址即可。
Router-1(config)#ipv6 route 2001:da8:1011:3001::/64 2001:da8:1011:f001::2
# 去往Router-3环回接口1
Router-1(config)#ipv6 route 2001:da8:1011:3002::/64 2001:da8:1011:f001::2
# 去往Router-2和Router-3之间的互联网段
Router-1(config)#ipv6 route 2001:da8:1011:f002::/64 2001:da8:1011:f001::2
Router-1(config)#end
Router-1#wr
Building configuration...
[OK]
Router-1#

Router-2配置信息如下:

Router>en
Router#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
Router(config)#hostname Router-2
Router-2(config)#ipv6 unicast-routing 
Router-2(config)#int lo0
Router-2(config-if)#ipv6 add 2001:da8:1011:2001::1/64
Router-2(config-if)#int lo1
Router-2(config-if)#ipv6 add 2001:da8:1011:2002::1/64
Router-2(config-if)#int eth0/0
Router-2(config-if)#ipv6 add 2001:da8:1011:f001::2/64
Router-2(config-if)#no shutdown 
Router-2(config-if)#int eth0/1
Router-2(config-if)#ipv6 add 2001:da8:1011:f002::1/64
Router-2(config-if)#no shut
Router-2(config-if)#exit
# 去往Router-1环回接口0
Router-2(config)#ipv6 route 2001:da8:1011:1001::/64 2001:da8:1011:f001::1
# 去往Router-1环回接口1
Router-2(config)#ipv6 route 2001:da8:1011:1002::/64 2001:da8:1011:f001::1
# 去往Router-3环回接口0
Router-2(config)#ipv6 route 2001:da8:1011:3001::/64 2001:da8:1011:f002::2
# 去往Router-3环回接口1
Router-2(config)#ipv6 route 2001:da8:1011:3002::/64 2001:da8:1011:f002::2
Router-2(config)#end
Router-2#wr
Building configuration...
[OK]

Router-3配置信息如下:

Router>en
Router#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
Router(config)#hostname Router-3
Router-3(config)#ipv6 unicast-routing 
Router-3(config)#int lo0
Router-3(config-if)#ipv6 add 2001:da8:1011:3001::1/64
Router-3(config-if)#int lo1
Router-3(config-if)#ipv6 add 2001:da8:1011:3002::1/64
Router-3(config-if)#int eth0/0
Router-3(config-if)#ipv6 add 2001:da8:1011:f002::2/64
Router-3(config-if)#no shutdown 
Router-3(config-if)#exit
Router-3(config)#ipv6 route 2001:da8:1011:1001::/64 2001:da8:1011:f002::1
Router-3(config)#ipv6 route 2001:da8:1011:1002::/64 2001:da8:1011:f002::1
Router-3(config)#ipv6 route 2001:da8:1011:2002::/64 2001:da8:1011:f002::1
Router-3(config)#ipv6 route 2001:da8:1011:f001::/64 2001:da8:1011:f002::1
Router-3(config)#
Router-3(config)#end
Router-3#wr
Building configuration...
[OK]

经过上述配置后,实验拓扑中的所有IP地址之间都可以连通。不知道大家有没有发现,Router-1中的5条路由都是去往Router-2的2001:da8:1011:f001::2。有没有办法简化些配置呢?办法肯定是有的,那就是采用路由汇总。把所有路由写出来,然后把所有路由共有的部分写出来,再统计一下共用的位数,如下所示。所有路由共用的部分为2001:da8:1011,共用的位数是48位,汇总后的路由是2011:da8:1011::/48(当然这里的汇总属于不精确汇总)。这样Router-1上只写一条路由就可以了。

image-20220314172545030

我们在Router-1删除明细路由,再添加一条汇总的路由,操作如下:

Router-1(config)#no ipv6 route 2001:da8:1011:2001::/64 2001:da8:1011:f001::2
Router-1(config)#no ipv6 route 2001:da8:1011:2002::/64 2001:da8:1011:f001::2
Router-1(config)#no ipv6 route 2001:da8:1011:3001::/64 2001:da8:1011:f001::2
Router-1(config)#no ipv6 route 2001:da8:1011:3002::/64 2001:da8:1011:f001::2
Router-1(config)#no ipv6 route 2001:da8:1011:f002::/64 2001:da8:1011:f001::2
Router-1(config)#ipv6 route 2001:da8:1011::/48 2001:da8:1011:f001::2
Router-1(config)#

我们采用类似的方法,在Router-3上只写一条汇总路由ipv6 route 2011:da8:1011::/48 2001:da8: 1011:f002::1。Router-2上去往Router-1的两条路由可以简单地汇总成2001:da8:1011:1000::/60(因为16+16+16+12=60),如下图所示。还可以进一步把IP地址中的1和2划分成4位二进制,进一步汇总成2001:da8:1011:1000::/62(因为16+16+16+12+2=62)。这里属于比较精确的汇总,但仍不是最精确的汇总,因为汇总中包括了2001:da8:1011:1000::/64和2001:da8:1011: 1003::/64路由条目。

image-20220314173425542

将Router-2上的路由条目进行如下修改:

Router-2(config)#no ipv6 route 2001:da8:1011:1001::/64 2001:da8:1011:f001::1
Router-2(config)#no ipv6 route 2001:da8:1011:1002::/64 2001:da8:1011:f001::1
Router-2(config)#no ipv6 route 2001:da8:1011:3001::/64 2001:da8:1011:f002::2
Router-2(config)#no ipv6 route 2001:da8:1011:3002::/64 2001:da8:1011:f002::2
# 去往Router-1环回接口
Router-2(config)#ipv6 route 2001:da8:1011:1000::/62 2001:da8:1011:f001::1
# 去往Router-3环回接口
Router-2(config)#ipv6 route 2001:da8:1011:3000::/62 2001:da8:1011:f002::2

3.3、浮动静态路由

在简单的网络中,我们可以通过指定静态路由的管理距离来达到链路冗余备份的目的。指定了管理距离的静态路由叫作浮动静态路由,广泛应用于链路备份的场合。下面我们通过一个实验来演示浮动静态路由的使用。

image-20220314220111058

例如,总部和分部之间通过双链路互连,假设e0/2的链路是10Gbit/s链路,e0/3的链路是1Gbit/s链路。配置静态IPv6路由,使其在两条链路都正常时,流量走10Gbit/s链路;当10Gbit/s链路发生故障时,流量自动切换到1Gbit/s链路。当10Gbit/s链路恢复时,再自动切换回10Gbit/s链路。Switch-1模拟分部的核心交换机,其中VLAN 1的IPv6地址是2001:da8:1011:1001::1/64,Win10-1在VLAN 1中,自动获取IPv6地址。Switch-2模拟总部的核心交换机,其中VLAN 1的IPv6地址是2001:da8:1011:2001::1/64,Win10-2在VLAN 1中,自动获取IPv6地址。

现在我们开始配置核心交换机,其中Switch-1的配置如下:

Switch>en
Switch#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
Switch(config)#hostname Switch-1
Switch-1(config)#ipv6 unicast-routing 
Switch-1(config)#int ethernet 0/2
Switch-1(config-if)#no switchport 
Switch-1(config-if)#ipv6 add 2001:da8:1011:f001::1/64
Switch-1(config-if)#ipv6 enable 
Switch-1(config-if)#no shutdown 
Switch-1(config-if)#exit   
Switch-1(config)#int ethernet 0/3
Switch-1(config-if)#no switchport 
Switch-1(config-if)#ipv6 add 2001:da8:1011:f002::1/64
Switch-1(config-if)#ipv6 enable 
Switch-1(config-if)#no shutdown 
Switch-1(config-if)#int vlan 1
Switch-1(config-if)#ipv6 add 2001:da8:1011:1001::1/64
Switch-1(config-if)#ipv6 enable 
Switch-1(config-if)#no shutdown 
Switch-1(config-if)#exit
Switch-1(config)#ipv6 route 2001:da8:1011:2001::/64 2001:da8:1011:f001::2
Switch-1(config)#ipv6 route 2001:da8:1011:2001::/64 2001:da8:1011:f002::2 2
Switch-1(config)#end
Switch-1#wr
Building configuration...
Compressed configuration from 1143 bytes to 738 bytes[OK]
Switch-1#

Switch-2的配置如下:

Switch>en
Switch#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
Switch(config)#hostname Switch-2
Switch-2(config)#ipv6 unicast-routing 
Switch-2(config)#interface ethernet 0/2
Switch-2(config-if)#no switchport 
Switch-2(config-if)#ipv6 add 2001:da8:1011:f001::2/64
Switch-2(config-if)#ipv6 enable 
Switch-2(config-if)#no shutdown 
Switch-2(config-if)#interface eth0/3
Switch-2(config-if)#no switchport 
Switch-2(config-if)#ipv6 add 2001:da8:1011:f002::2/64
Switch-2(config-if)#ipv6 enable 
Switch-2(config-if)#no switchport 
Switch-2(config-if)#int vlan 1
Switch-2(config-if)#ipv6 add 2001:da8:1011:2001::1/64
Switch-2(config-if)#ipv6 enable 
Switch-2(config-if)#no shutdown 
Switch-2(config)#ipv6 route 2001:da8:1011:1001::/64 2001:da8:1011:f001::1 
Switch-2(config)#ipv6 route 2001:da8:1011:1001::/64 2001:da8:1011:f002::1 2
Switch-2(config)#end
Switch-2#wr
Building configuration...
Compressed configuration from 1239 bytes to 773 bytes[OK]
Switch-2#

我们给终端配置一个IPv6地址,然后来测试一下连通性。Win10-1和Win10-2默认启用了IPv6协议,且自动获取地址。我们使用ipconfig命令验证两台计算机是否都获取了正确的IPv6地址:

# WIN10-1
Microsoft Windows [版本 10.0.10240]
(c) 2015 Microsoft Corporation. All rights reserved.

C:\Users\Administrator>ipconfig

Windows IP 配置


以太网适配器 以太网:

   连接特定的 DNS 后缀 . . . . . . . :
   IPv6 地址 . . . . . . . . . . . . : 2001:da8:1011:1001:d57c:b6c:cf69:cec6
   临时 IPv6 地址. . . . . . . . . . : 2001:da8:1011:1001:f8b1:29e1:d9d6:4974
   本地链接 IPv6 地址. . . . . . . . : fe80::d57c:b6c:cf69:cec6%4
   自动配置 IPv4 地址  . . . . . . . : 169.254.206.198
   子网掩码  . . . . . . . . . . . . : 255.255.0.0
   默认网关. . . . . . . . . . . . . : fe80::a8bb:ccff:fe80:500%4

C:\Users\Administrator>ping 2001:da8:1011:2001:64af:5756:55dc:2359

正在 Ping 2001:da8:1011:2001:64af:5756:55dc:2359 具有 32 字节的数据:
来自 2001:da8:1011:2001:64af:5756:55dc:2359 的回复: 时间=26ms
来自 2001:da8:1011:2001:64af:5756:55dc:2359 的回复: 时间=1ms
来自 2001:da8:1011:2001:64af:5756:55dc:2359 的回复: 时间=1ms
来自 2001:da8:1011:2001:64af:5756:55dc:2359 的回复: 时间=1ms

2001:da8:1011:2001:64af:5756:55dc:2359 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 1ms,最长 = 26ms,平均 = 7ms

C:\Users\Administrator>

# WIN10-2
Microsoft Windows [版本 10.0.10240]
(c) 2015 Microsoft Corporation. All rights reserved.

C:\Users\Administrator>ipconfig

Windows IP 配置


以太网适配器 以太网:

   连接特定的 DNS 后缀 . . . . . . . :
   IPv6 地址 . . . . . . . . . . . . : 2001:da8:1011:2001:64af:5756:55dc:2359
   临时 IPv6 地址. . . . . . . . . . : 2001:da8:1011:2001:25d2:4e67:5432:b97b
   本地链接 IPv6 地址. . . . . . . . : fe80::64af:5756:55dc:2359%4
   自动配置 IPv4 地址  . . . . . . . : 169.254.35.89
   子网掩码  . . . . . . . . . . . . : 255.255.0.0
   默认网关. . . . . . . . . . . . . : fe80::a8bb:ccff:fe80:600%4

C:\Users\Administrator>

从上面的输出信息我们可以看到Win10-1获取了2001:da8:1011:1001::/64的IPv6地址,并成功ping通以2001:da8:1011:2001::/64开头的Win10-2的IPv6地址(这里Win10-1的IPv6地址是2001:da8:1011:1001:d57c:b6c:cf69:cec6)。我们再来验证一下路由信息,查看Switch-1的路由表,显示如下:

Switch-1#show ipv6 route
IPv6 Routing Table - default - 8 entries
Codes: C - Connected, L - Local, S - Static, U - Per-user Static route
       B - BGP, R - RIP, I1 - ISIS L1, I2 - ISIS L2
       IA - ISIS interarea, IS - ISIS summary, D - EIGRP, EX - EIGRP external
       ND - ND Default, NDp - ND Prefix, DCE - Destination, NDr - Redirect
       RL - RPL, O - OSPF Intra, OI - OSPF Inter, OE1 - OSPF ext 1
       OE2 - OSPF ext 2, ON1 - OSPF NSSA ext 1, ON2 - OSPF NSSA ext 2
       a - Application
C   2001:DA8:1011:1001::/64 [0/0]
     via Vlan1, directly connected
L   2001:DA8:1011:1001::1/128 [0/0]
     via Vlan1, receive
# 路由信息
S   2001:DA8:1011:2001::/64 [1/0]
     via 2001:DA8:1011:F001::2
C   2001:DA8:1011:F001::/64 [0/0]
     via Ethernet0/2, directly connected
L   2001:DA8:1011:F001::1/128 [0/0]
     via Ethernet0/2, receive
C   2001:DA8:1011:F002::/64 [0/0]
     via Ethernet0/3, directly connected
L   2001:DA8:1011:F002::1/128 [0/0]
     via Ethernet0/3, receive
L   FF00::/8 [0/0]
     via Null0, receive
Switch-1#

可以看到Switch-1去往2001:DA8:1011:2001::/64的下一跳是2001:da8:1011:F001::2,走的是e0/2链路。为了让效果更明显,在Win10-1上持续用大包ping Win10-2,命令如下:

C:\Users\Administrator>ping 2001:da8:1011:2001:64af:5756:55dc:2359 -t -l 10240

正在 Ping 2001:da8:1011:2001:64af:5756:55dc:2359 具有 10240 字节的数据:
来自 2001:da8:1011:2001:64af:5756:55dc:2359 的回复: 时间=5ms
来自 2001:da8:1011:2001:64af:5756:55dc:2359 的回复: 时间=3ms
来自 2001:da8:1011:2001:64af:5756:55dc:2359 的回复: 时间=4ms
来自 2001:da8:1011:2001:64af:5756:55dc:2359 的回复: 时间=4ms

然后我们在交换机Switch-1上使用show命令,分别查看e0/2和e0/3端口的数据包统计,显示如下所示。注意粗体部分,e0/2接口上的数据持续不断,e0/3接口上的数据基本不变,这证明了大量的ping包确实走的是e0/2链路:

# Eth0/2接口
Switch-1#show int eth0/2
Ethernet0/2 is up, line protocol is up (connected) 
  Hardware is Ethernet, address is aabb.cc00.0520 (bia aabb.cc00.0520)
  MTU 1500 bytes, BW 10000 Kbit/sec, DLY 1000 usec, 
     reliability 255/255, txload 1/255, rxload 1/255
  Encapsulation ARPA, loopback not set
  Keepalive set (10 sec)
  Auto-duplex, Auto-speed, media type is unknown
  input flow-control is off, output flow-control is unsupported 
  ARP type: ARPA, ARP Timeout 04:00:00
  Last input 00:00:04, output 00:00:00, output hang never
  Last clearing of "show interface" counters never
  Input queue: 0/75/0/0 (size/max/drops/flushes); Total output drops: 0
  Queueing strategy: fifo
  Output queue: 0/40 (size/max)
  # 数据包
  5 minute input rate 10000 bits/sec, 3 packets/sec
  5 minute output rate 10000 bits/sec, 3 packets/sec
     1136 packets input, 495838 bytes, 0 no buffer
     Received 406 broadcasts (0 IP multicasts)
     0 runts, 0 giants, 0 throttles 
     0 input errors, 0 CRC, 0 frame, 0 overrun, 0 ignored
     0 input packets with dribble condition detected
     804 packets output, 479903 bytes, 0 underruns
     0 output errors, 0 collisions, 0 interface resets
     0 unknown protocol drops
     0 babbles, 0 late collision, 0 deferred
     0 lost carrier, 0 no carrier
     0 output buffer failures, 0 output buffers swapped out
Switch-1#

# Eth0/3接口
Switch-1#show int eth0/3
Ethernet0/3 is up, line protocol is up (connected) 
  Hardware is Ethernet, address is aabb.cc00.0530 (bia aabb.cc00.0530)
  MTU 1500 bytes, BW 10000 Kbit/sec, DLY 1000 usec, 
     reliability 255/255, txload 1/255, rxload 1/255
  Encapsulation ARPA, loopback not set
  Keepalive set (10 sec)
  Auto-duplex, Auto-speed, media type is unknown
  input flow-control is off, output flow-control is unsupported 
  ARP type: ARPA, ARP Timeout 04:00:00
  Last input 00:00:16, output 00:00:14, output hang never
  Last clearing of "show interface" counters never
  Input queue: 0/75/0/0 (size/max/drops/flushes); Total output drops: 0
  Queueing strategy: fifo
  Output queue: 0/40 (size/max)
  5 minute input rate 0 bits/sec, 0 packets/sec
  5 minute output rate 0 bits/sec, 0 packets/sec
     524 packets input, 67265 bytes, 0 no buffer
     Received 348 broadcasts (0 IP multicasts)
     0 runts, 0 giants, 0 throttles 
     0 input errors, 0 CRC, 0 frame, 0 overrun, 0 ignored
     0 input packets with dribble condition detected
     535 packets output, 83204 bytes, 0 underruns
     0 output errors, 0 collisions, 0 interface resets
     0 unknown protocol drops
     0 babbles, 0 late collision, 0 deferred
     0 lost carrier, 0 no carrier
     0 output buffer failures, 0 output buffers swapped out
Switch-1#

我们也可以通过抓包来验证数据包的走向,我们在Switch-1上右键单击,从快捷菜单中选择“Capture”→“e0/2”,打开Switch-1的e0/2接口的捕获窗口,如下图所示。以类似的方法再打开Switch-1的e0/3接口的捕获窗口。

image-20220314224650843

从下图中我们可以观察到e0/2接口捕获到了大量的ICMPv6报文。由于数据包的默认大小是1510字节,所以导致每个10240字节的ping包被拆成了多个报文;然而e0/3接口并没有捕获到这样的数据包。

image-20220314224852852

我们还可以通过断开Switch-1和Switch-2的e0/2接口来模拟故障的发生,发现Win10-1和Win10-2之间仍然可以ping通。可以使用show interfacee0/3命令查看接口的通信情况,以证明此时流量切换到e0/3链路。在Switch-1上查看路由表,显示如下。可以看出去往2001:da8:1011:2001::/64的下一跳是2001:DA8:1011:F002::2,已经切换到e0/3链路。注意这条静态路由后的显示是[2/0],管理距离是2。

Switch-1(config)#int ethernet 0/2
Switch-1(config-if)#shutdown 
Switch-1(config-if)#end
Switch-1#s
*Mar 14 21:50:52.593: %LINK-5-CHANGED: Interface Ethernet0/2, changed state to administratively down
*Mar 14 21:50:53.076: %SYS-5-CONFIG_I: Configured from console by console
*Mar 14 21:50:53.593: %LINEPROTO-5-UPDOWN: Line protocol on Interface Ethernet0/2, changed state to down
Switch-1#sh ipv6 route
IPv6 Routing Table - default - 6 entries
Codes: C - Connected, L - Local, S - Static, U - Per-user Static route
       B - BGP, R - RIP, I1 - ISIS L1, I2 - ISIS L2
       IA - ISIS interarea, IS - ISIS summary, D - EIGRP, EX - EIGRP external
       ND - ND Default, NDp - ND Prefix, DCE - Destination, NDr - Redirect
       RL - RPL, O - OSPF Intra, OI - OSPF Inter, OE1 - OSPF ext 1
       OE2 - OSPF ext 2, ON1 - OSPF NSSA ext 1, ON2 - OSPF NSSA ext 2
       a - Application
C   2001:DA8:1011:1001::/64 [0/0]
     via Vlan1, directly connected
L   2001:DA8:1011:1001::1/128 [0/0]
     via Vlan1, receive
S   2001:DA8:1011:2001::/64 [2/0]
     via 2001:DA8:1011:F002::2
C   2001:DA8:1011:F002::/64 [0/0]
     via Ethernet0/3, directly connected
L   2001:DA8:1011:F002::1/128 [0/0]
     via Ethernet0/3, receive
L   FF00::/8 [0/0]
     via Null0, receive
Switch-1#

打开Switch-1和Switch-2的e0/2接口,此时再次执行show interface命令,可以看到流量又切换回e0/2链路(这里有一个小BUG、Swich-1和Switch-2的eth0/2端口必须同时断开网络才会自动切换、如果先断开一方就会出现网络故障了;这个问题我们在后面的章节中解决)。

3.4、静态路由优缺点

与所有的路由协议一样,静态路由协议也有自己的优缺点。了解每种路由协议的优缺点,有利于根据网络规模的状况,正确地选择适合的路由协议。

静态路由具有以下优点:对CPU、内存等硬件的需求不高。静态路由不像动态路由协议那样,需要缓存相互交换的路由信息,并执行一些算法,这意味着静态路由对CPU和内存的要求不高;不占用带宽。静态路由不像动态路由协议那样,需要相互交换网络信息或路由表,这意味着静态路由可以节省带宽;增加网络安全,静态路由是网络管理员手动添加的,即使不同的网络之间存在物理路径,只要管理员没有添加它们之间的静态路由,网络也是不可达的。相较于动态路由协议,静态路由更容易实现网络间的控制。

静态路由具有以下缺点:配置工作量大且容易出错。由于所有的路由都需要管理员手动加入,对大型网络来说,这几乎是不可能的,而且容易出错。当某个新的网络出现时,管理员必须在所有路由器上添加这条静态路由。适应拓扑变化的能力较差;静态路由不能适应网络拓扑的变化,从而动态地调整路由表。虽说我们通过实验配置了浮动静态路由,起到了冗余备份的作用,但毕竟只是用在简单的网络中;当网络规模较大时,试图通过配置浮动静态路由来冗余备份将变得异常复杂和不可行。

4、默认路由

默认路由(default routing)在有些文档中也称作缺省路由,使用默认路由可以将那些路由表中没有明确列出目标网络的数据包转发到下一跳路由器。在存根网络(只有一条连接到其邻居网络的路由,进出这个网络都只有一条路可以走)上可以使用默认路由,因为存根网络与外界之间只有一个连接。下图为某公司的网络拓扑,该公司通过路由器接入ISP,并通过ISP路由器2001: da8:a3::1访问整个互联网。如果配置具体的静态路由来访问互联网,将要配置多条,低端的路由器根本无法承受如此多的路由条目。针对下图中的网络拓扑,我们可以配置公司路由器,使其使用默认路由。默认路由的配置方法与静态路由的类似,只是将网络地址和前缀长度改成了“::/0”,即只要匹配0位就可以,也就是匹配了所有IPv6地址。

image-20220315090337499

其实不只存根网络使用了默认路由,据统计,互联网上99.9%的路由器都使用了默认路由。在使用IPv6的计算机上执行命令route print,可以在路由表中看到::/0的路由条目,该条目对应的网关是路由器接口的链路本地地址。

4.1、配置默认路由

我们通过下面的实验拓扑来测试一下如何配置默认路由。

image-20220315091341191

分析:根据前面介绍的静态路由的配置步骤,我们首先要确定网络中有6个网段,每台路由器都直连了3个网段,然后为所有非直连的网段添加静态路由。以Router-1为例,添加一条去往2001:2::/64的路由,下一跳是2001:12::2;添加一条去往2001:3::/64的路由,下一跳是2001:13::3;添加一条去往2001:23::/64的路由,下一跳是2001:12::2或2001:13::3,Router-1上需要配置3条静态路由。与之类似,Router-2和Router-3上也需要各自配置3条静态路由,这样3台路由器总共配置了9条静态路由,由此实现了全网全通。

其实,默认路由是一种特殊的静态路由,我们可以理解为最不精确的汇总;如果使用默认路由,在上面的实验拓扑中我们只需要配置下面3条默认路由就可以实现全网全通。完整的配置如下:

# Router-1上所有未知的数据包都发给路由器Router-2
Router-1(config)#ipv6 route ::/02001:12::2
# Router-2上所有未知的数据包都发给路由器Router-3
Router-2(config)#ipv6 route ::/02001:23::3
# Router-3上所有未知的数据包都发给路由器Router-1
Router-3(config)#ipv6 route ::/02001:13::1

配置完成后,可以在任意路由器上测试任意IP地址,都可ping通。但数据包的往返路径不一定相同。比如在Router-1上ping路由器Router-3上的2001:3::1,去的路径是Router-1→ Router-2→Router-
3,返回的路径是Router-3→Router-1。

前面简单配置了3条默认路由,实现了全网互通,但由于默认路由不是精确的路由,会产生一些副作用,比如路由环路。在Router-1上随便ping一个不存在的IPv6路由条目,比如2001::1,显示如下:

Router-1#ping 2001::1
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 2001::1, timeout is 2 seconds:
TTTTT
Success rate is 0 percent (0/5)
Router-1#

返回值为TTTTT,这应该是跳数(Hop Count)超过最大允许值后返回的报错。Hop Count对应IPv4报头中的TTL(Time-To-Live),每经过一台路由器,TTL减1,当TTL为零时,路由器丢弃数据包,并向源发送方返回错误提示。在路由器上执行traceroute 2001::1命令,显示如下:

Router-1#traceroute 2001::1
Type escape sequence to abort.
Tracing the route to 2001::1

  1 2001:12::2 0 msec 0 msec 0 msec
  2 2001:23::3 1 msec 1 msec 0 msec
  3 2001:13::1 1 msec 0 msec 0 msec
  4 2001:12::2 1 msec 0 msec 0 msec
 ......
 27 2001:13::1 3 msec 3 msec 3 msec
 28 2001:12::2 4 msec 3 msec 4 msec
 29 2001:23::3 3 msec 3 msec 4 msec
 30 2001:13::1 3 msec *  4 msec
Destination not found inside max hopcount diameter.
Router-1#

traceroute默认显示的最大跳数是30,该命令执行完毕并不表示数据包已经被丢弃。跳数占用8位,最大值是255,当该值减为零时,数据包才会被丢弃。

在上面的实验拓扑中,我们可以通过配置静态路由来实现全网全通,可一旦拓扑发生变化,比如Router-1和Router-2之间发生链路故障,将导致Router-1与Router-2之间不通。尽管在事实上可以通过Router-3中转,但静态路由不会根据拓扑的变化自动调整路由表;而我们接下来介绍的动态路由协议可以自动调整路由表。

5、动态路由协议

前面我们介绍了直连路由、静态路由和默认路由的配置。通过静态路由虽然可以实现网络的互联,但如果网络规模很大,假设有100台路由器,101个网络,每台路由器上有两个直联网络,那么需配置静态路由的条目是100(101-2)=9900条,通过手动配置几乎无法实现。另外,当网络出现变化时,静态路由也不能很好地反映拓扑变化,这时就需要使用动态路由协议。

5.1、静态路由和动态路由的比较

前面介绍过,静态路由是由管理员在路由器中手动添加的路由条目。除非网络管理员手动干预,否则静态路由不会发生变化。由于静态路由不能对网络的改变做出反应,因此一般用于网络规模不大、拓扑结构固定的网络中。静态路由的优点是简单、高效、可靠。动态路由是网络中的路由器相互之间通信,传递路由信息,并利用收到的路由信息更新路由表的过程。收到路由更新信息后,路由器会重新计算路由,并发出新的路由更新信息。这些信息在网络中传送,引起各路由器执行路由算法,并更新各自的路由表,以动态地反映网络拓扑变化。动态路由适用于网络规模大、网络拓扑复杂的网络。当然,各种动态路由协议会不同程度地占用网络带宽和CPU资源。

静态路由与动态路由的比较如下表所示:

动态路由 静态路由
配置的复杂性 网络规模的增加对配置的影响不大 随着网络规模的增加,配置越来越复杂
对管理员的技术要求 相对较高 相对较低
拓扑改变 自动适应拓扑的改变 需要管理员手动干预
适用环境 简单和复杂的网络均可 简单的网络
安全性 较低 较高
资源适用 使用CPU、内存、链路带宽 不适用额外的资源

5.2、距离矢量和链路状态路由协议

IGP路由协议分为距离矢量(distance vector)和链路状态(link state)两类。

距离矢量路由协议和链路状态路由协议采用了不同的路由算法,路由算法在路由协议中起着至关重要的作用,采用何种算法往往决定了最终的寻径结果,因此在选择路由算法时一定要仔细,通常需要综
合考虑以下几个目标。

最优化:路由算法选择最佳路径的能力。

简洁性:算法设计简洁,可利用最少的开销提供最有效的功能。

坚固性:路由算法处于非正常或不可预料的环境时,如硬件故障、负载过高或操作失误时,都能正确运行。路由器分布在网络连接点上,若它们出故障会产生严重后果。最好的路由器算法通常能经受住时间的考验,并能在各种网络环境下正常且可靠运行。

快速收敛(convergence):指路由域中所有路由器对当前的网络结构和路由转发达成一致的状态。收敛时间是指从网络的拓扑结构发生变化到网络上所有的相关路由器都得知这一变化,并且相应地做出改变所需要的时间。当某个网络事件引起路由可用或不可用时,路由器就发出更新信息。路由更新信息遍及整个网络,引发最佳路径的重新计算,最终达到所有路由器公认的最佳路径。收敛慢的路由算法会造成路径环路或网络中断。

灵活性:路由算法可以快速、准确地适应各种网络环境。例如,若某个网段发生故障,路由算法要能很快发现故障,并为使用该网段的所有路由选择另一条最佳路径。

1、距离矢量路由协议

距离矢量路由协议选择算法定期地将路由表的副本从一个路由器发往另一个路由器。这些在路由器间的定期更新用于交流网络的路由信息和变化,基于距离矢量的路由选择算法也称为贝尔曼-福特(Bellman-Ford)算法。RIP和IGRP都是距离矢量路由协议,它们都定期地发送整个路由表到直接相邻的路由器。EIGRP也属于距离矢量路由协议,但EIGRP是一个高级的距离矢量路由协议,具备很多链路状态路由协议的特征。

(1)距离矢量路由协议路由环路的形成。

使用距离矢量路由协议的路由器没有关于远端网络的确切信息,也没有对远端路由器的认识,它们获知网络的途径就是邻居路由器的路由表副本。有时也称距离矢量路由协议为传闻路由协议,即道听途
说,不加以审核。当然,距离矢量路由协议也没有办法审核,因为它们没有关于远端网络和路由器的确切消息,这样极容易形成环路。

下面我们一起来看一下在距离矢量路由协议中,路由环路是如何形成的。这里以RIP路由协议为例,在下图中,路由器A把网络1的路由发给路由器B,路由器B学到了网络1,并把度量值标记为1跳,即经过一台路由器可以到达,下一跳路由器是A;路由器B把网络1的路由发给路由器C和路由器E,路由器C和路由器E都学到了网络1,并把度量值标记为2跳,即经过两台路由器可以到达,下一跳路由器是B;路由器C和路由器E都把网络1的路由发给路由器D,路由器D也学到了网络1,并把度量值标记为3跳,即经过3台路由器可以到达,下一跳路由器是C或E,即从两台路由器都可以到达,路由器D去往网络1的数据将进行负载均衡。此时所有的路由器都拥有一致的认识和正确的路由表,这时的网络称为已收敛。

image-20220315111751904

路由器B也会把学到的网络1发给路由器A,路由器A发现网络1是直连路由,有更小的管理距离(直连的管理距离是0,RIP的管理距离是120),路由器A不会接收路由器B传过来的路由;类似地,路由器C也会把学到的网络1发给路由器B,路由器B发现从路由器A学到的网络1有1跳,从路由器C学到的网络1有3跳,路由器B不会接收路由器C传过来的网络1的路由;通过类似的方式,所有路由器都会学到正确的路由。

在网络1没有出现故障前,路由器D有两条到达网络1的路径,即通过C或者E到达B,最后到达A所相连的网络1。当网络1断开时,路由器A将网络1不可达的信息扩散到路由器B,B将网络1不可达的信息扩散到路由器C和E。此时D还不知道网络1出现故障不可以到达,就在这个时候D发出了更新信息给E,认为通过C可以到达网络1(当然这里也可能是D发出了更新信息给C,认为通过E可以到达网络1,这里以前面一种假设为前提来讨论)。

路由器E收到网络1又可以到达的信息(通过D可以到达)。路由器E更新自己的路由表,并将网络1可到达的更新信息发送给B。路由器B更新自己的路由表,并发送给C和A。路由器C更新自己的路由表,并发送给D,此时路由环路产生。

(2)距离矢量路由环路的解决办法。

距离矢量路由协议环路的解决办法有5种。

1、最大跳数(maximum hop):在上面的描述中,尽管网络1出现了故障,但更新信息仍然在网络中循环。网络1的无效更新会不断地循环下去,直到其他进程停止该循环。解决这个问题的一个方法是定义最大跳数。RIP允许的最大跳数为15,任何需要经过16跳到达的网络都被认为是不可达的。对于RIP路由协议来说,当路由的跳数达到16前,即使路由出现环路,也保持路由条目的存在。超过16时,不管网络有没有出现环路,都认为路由不可达。最大跳数其实并没有消除路由环路的存在,只是把路由环路控制在一定的范围内。最大跳数的定义也限制了网络的规模,即使是合法的路由,也不能超过16跳。即使没有定义最大跳数,当出现路由环路后,IP分组也不会无限循环下去,因为IP分组中有一个TTL字段,主机在传输分组前,会把TTL字段设置成1~255的一个整数值,该值独立于操作系统。路由器接收到分组后,会将TTL减1,如果TTL变成0,路由器将丢弃该IP分组。

2、水平分割(split horizon):另一个解决路由环路问题的方法称为水平分割。具体做法就是限制路由器,使其不能按接收信息的方向去发送信息。在图6-12中,路由器C和路由器E有关网络1的路由信息是从与路由器B相连的接口学到的,路由器C和路由器E将不会把网络1的信息从与路由器B相连的接口再传回去。这样路由器D最终会学到网络1故障的消息,所有路由器都会正确收敛,从而消除了路由环路。水平分割可以在简单的网络拓扑中消除路由环路,如果网络拓扑很复杂,规模很大,则水平分割将无法胜任。

3、路由中毒(route poisoning):路由中毒通过将故障网络的跳数设置成最大跳数加1来暗示网络的不可达。毒性反转(poison reverse)是避免路由环路的另一种方法,它的原理是,一旦从一个接口学到了一个路由,那么这个路由将作为不可达路由从同一个接口回送。在上图中,路由器A上的网络1断开后,路由中毒使路由器A向路由器B通告网络1的度量值为最大跳数加1,针对RIP协议就是16跳。路由器B收到路由器A的消息后,知道网络1有16跳,意味着网络1不可达,需要删除这条路径。毒性反转使路由器B向学到网络1路由的方向,即路由器A回送一个网络1不可达的消息。路由中毒或毒性反转用来在大型网络解决路由环路的问题。

如果没有采用路由中毒,发生拓扑变化的路由器(以上图中的路由器A为例),在检测到直连路由网络1丢失时,在发向路由器B的更新包中将不包含网络1。若偶尔一个更新包中不包含网络1,路由器B并不会认为网络1已经失效,因此继续向路由器C和路由器E发送更新信息。当连续多个更新包中都没有包含网络1的信息时,路由器B才认为网络1失效。在RIP协议中,当连续有6个更新包中都没有包含网络1的信息时(总计180s),路由器B才认为网络1失效。类似地,路由器C和路由器E再过大概180s才意识到网络1不可达,这样路由收敛的时间将会更长。如果采用路由中毒,路由器A向路由器B发送的更新包中包含的网络1的跳数是16,暗示网络1不可达。毒性反转则是路由器B反过来告诉路由器A网络1不可达。这里特别值得一提的是,毒性反转不受水平分割的影响。

4、触发更新(triggered update):使用距离矢量路由协议的路由器一般是周期性地发生路由更新的,比如RIP是30s。更新周期未到,即使路由发生变化也不发送更新。而一般链路状态路由协议都是触发式更新,即拓扑有变化时,马上发送路由更新。通过在距离矢量路由协议中使用触发更新,路由器无须等待更新定时器期满就可以发送更新,这样更新信息很快就可传遍全网,从而减小了出现路由环路的可能性。

5、抑制定时器(holddown time):可以用抑制定时器来避免计数到无穷大的问题。抑制定时器的使用分为下面4种情况。如果一个路由器从邻居处接收到一条更新,指示以前可到达的网络目前不可达,这个路由器将该路由标记为不可达,同时启动一个抑制定时器,比如RIP默认是180s。如果在抑制定时器期满以前,从同一个邻居处收到指示该网络又可达的更新,那么该路由器标识这个网络可以到达,并且删除抑制定时器。如果在抑制定时器期满以前,收到一个来自其他邻居路由器的更新,而且该路由具有比以前路由更好的度量值。比如以前通过RIP学到的某条路由的跳数是3,现在收到的更新消息显示该路由的跳数是2,那么该路由器将这个网络标识为可以到达,并删除抑制定时器。如果在抑制定时器期满以前,收到一个来自其他邻居路由器的更新,而且该路由具有比以前路由相同或更差的度量值。比如以前通过RIP学到某条路由的跳数是3,现在收到的更新消息显示该路由的跳数是3或4,则忽略这个更新。在抑制定时器期满以后,删除抑制定时器,接收任何拥有合法度量值的更新。

5.3、链路状态路由协议

链路状态路由协议也称为最短路径优先协议,链路状态路由协议使用的算法是最短路径优先(Shortest Path First,SPF)算法,有时也称Dijkstra算法。链路状态路由协议一般要维护3个表:邻居表,用来跟踪直接连接的邻居路由器;拓扑表,保存整个网络的拓扑信息数据库;路由表,用来维护路由信息。链路状态路由器维护着远端路由器及其互连情况的全部信息,路由选择算法根据拓扑数据库执行SPF算法。链路状态路由协议不易出现路由环路问题。表6-2对距离矢量路由协议和链路状态路由协议做了对比。

距离矢量路由协议 链路状态路由协议
配置和维护的技术要求 对管理员的要求不高 要求管理员的知识更全面
CPU、带宽和内存等资源 需要少量的内存来存储信息,需要耗费少量的CPU来进行计算。如果路由表很大,周期性的更新会占用一定的带宽 需要大量的内存来存储邻居和拓扑信息,需要耗费更多的CPU来执行SPF算法。路由表采用增量式更新,对带宽占用不多
收敛时间 采用周期性的更新,收敛时间较慢,有时甚至需要几分钟 触发式更新,收敛时间很快,一般几秒钟内就可完成
路由环路 慢速的收敛极易造成各路由器的路由表不一致,很容易产生环路 基于全网的拓扑数据库,执行SPF算法,不易产生路由环路
扩展性 慢速的收敛和平面型的设计决定了网络规模不可能很大 快速的收敛和层次型的设计使网络规模可以很大

5.4、常见动态路由协议

好了、讲了这么多;下面我们一起来看看常见的动态路由协议。

1、RIP:路由信息协议(Routing Information Protocol,RIP)是互联网中最古老的路由协议。RIP采用距离矢量算法,即路由器根据距离选择路由,所以也称为距离矢量协议。路由器收集所有可到达目的地的不同路径,并且保存有关到达每个目的地的最少跳数(hop)的路径信息,除到达目的地的最佳路径外,任何其他信息均予以丢弃。同时,路由器也把所收集的路由信息用RIP协议通知相邻的其他路由器。这样,正确的路由信息逐渐扩散到全网。RIP具有简单、便于配置的特点,但是只适用于小型的网络,因为它允许的最大跳数为15,任何超过15个站点的目的地均被标记为不可达。而且RIP每30s一次的路由信息广播也造成带宽的严重浪费,而且频繁的更新也会影响路由器的性能。RIP的收敛速度较慢,有时还会造成网络环路。

2、OSPF:20世纪80年代中期,由于RIP已不能适应大规模异构网络的互联,所以开放式最短路径优先(Open Shortest Path First,OSPF)随之产生。OSPF是IETF的内部网关协议工作组为IP网络开发的一种路由协议。OSPF是一种基于链路状态的路由协议,需要每个路由器向其同一管理域中的所有其他路由器发送链路状态通告信息。OSPF的链路状态通告信息中包括接口信息、度量值和其他一些参数。运行OSPF的路由器首先必须收集所有的链路状态信息,并以本路由器为根,使用SPF算法算出到每个节点的最短路径。

3、IS-IS:中间系统到中间系统(Intermediate System-to-Intermediate System,IS-IS)是ISO的标准协议,该协议与无连接网络服务(Connectionless Network Service,CLNS)和其他ISO路由协议一起使用。IS-IS也是链路状态协议,采用SPF算法来计算到达每个网络的最佳路径。该协议在国内较少使用,在美国多见于运营商的网络,所以这里我们就不做过多介绍。

4、IGRP:内部网关路由协议(Interior Gateway Routing Protocol,IGRP)也是一种距离矢量路由协议,它是思科公司私有的路由协议,使用复合的度量值(包括延迟、带宽、负载和可靠性)。该路由协议较老,基本退出了历史舞台,所以这里我们就不做过多介绍。

5、EIGRP:增强的IGRP(Enhanced IGRP,EIGRP)是IGRP的升级版,也是思科公司私有的路由协议,本书对此不做介绍。EIGRP结合了距离矢量和链路状态路由协议的优点,使用扩散更新算法(Diffusing Update Algorithm,DUAL)计算路由,收敛速度更快。

6、BGP:前面介绍的5种协议都是内部网关协议,BGP是为TCP/IP互联网设计的外部网关协议,用于在多个自治系统之间传递路由信息。它既不是纯粹的链路状态算法,也不是纯粹的距离矢量算法,各个自治系统可以运行不同的内部网关协议,不同的自治系统通过BGP交换网络可达信息。BGP的配置较复杂,是运营商级的路由协议,所以这里我们就不做过多介绍。

6、动态路由协议-RIP

RIP下一代版本(Routing Information Protocol next generation,RIPng)是RIP的IPv6版本,也是一个距离矢量路由协议,最大跳数是15,使用水平分割和毒性反转等来阻止路由环路。RIPng使用多播地址FF02::9作为目的更新地址,使用UDP协议的521端口发送更新。下面我们就通过一个实验来详细的讲解RIPng的使用方法以及配置内容。

6.1、配置IPv6 RIPng

我们按照下面的实验拓扑先把基本信息配置完成,配置完成以后再来配置RIPng协议。

image-20220315123246735

Router-1配置信息:

Router-1>en
Router-1#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
# 启用RIPng协议,这里的test是随便起的一个名字,就像OSPF的进程号一样,只具有本地意义
Router-1(config)#ipv6 router rip test
Router-1(config-rtr)#int eth0/0
# RIPng不同于RIP,不是在路由进程下通告所有的直联网络,而是在接口通告该接口运行RIPng协议,这里的test要与路由进程中的名字一致
Router-1(config-if)#ipv6 rip test enable 
Router-1(config-if)#int eth0/1
Router-1(config-if)#ipv6 rip test enable 
Router-1(config-if)#int lo0
Router-1(config-if)#ipv6 rip test enable 
Router-1(config-if)#end
Router-1#wr
Building configuration...
[OK]

Router-2配置信息:

Router-2>en
Router-2#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
Router-2(config)#ipv6 router rip abc
Router-2(config-rtr)#int eth0/0
Router-2(config-if)#ipv6 rip abc enable 
Router-2(config-if)#int eth0/1
Router-2(config-if)#ipv6 rip abc enable
Router-2(config-if)#int lo0
Router-2(config-if)#ipv6 rip abc enable
Router-2(config-if)#end
Router-2#wr
Building configuration...
[OK]

Router-3配置信息:

Router-3>en
Router-3#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
Router-3(config)#ipv6 router rip test
Router-3(config-rtr)#int eth0/0
Router-3(config-if)#ipv6 rip test enable 
Router-3(config-if)#int eth
Router-3(config-if)#int eth0/1
Router-3(config-if)#ipv6 rip test enable
Router-3(config-if)#int lo0
Router-3(config-if)#ipv6 rip test enable
Router-3(config-if)#end
Router-3#wr
Building configuration...
[OK]

配置完成之后我们开始测试,我们在在Router-1、Router-2、Router-3上任意ping在实验拓扑中标出的所有IPv6地址,都可以ping通。在Router3上执行show ipv6 route命令,显示如下:

Router-3#show ipv6 route 
IPv6 Routing Table - default - 11 entries
Codes: C - Connected, L - Local, S - Static, U - Per-user Static route
       B - BGP, HA - Home Agent, MR - Mobile Router, R - RIP
       H - NHRP, I1 - ISIS L1, I2 - ISIS L2, IA - ISIS interarea
       IS - ISIS summary, D - EIGRP, EX - EIGRP external, NM - NEMO
       ND - ND Default, NDp - ND Prefix, DCE - Destination, NDr - Redirect
       O - OSPF Intra, OI - OSPF Inter, OE1 - OSPF ext 1, OE2 - OSPF ext 2
       ON1 - OSPF NSSA ext 1, ON2 - OSPF NSSA ext 2, la - LISP alt
       lr - LISP site-registrations, ld - LISP dyn-eid, a - Application
1       S   ::/0 [1/0]
2            via 2001:13::1
3       R   2001:1::/64 [120/2]
4            via FE80::A8BB:CCFF:FE00:110, Ethernet0/0
5       R   2001:2::/64 [120/2]
6            via FE80::A8BB:CCFF:FE00:200, Ethernet0/1
7       C   2001:3::/64 [0/0]
8            via Loopback0, directly connected
9       L   2001:3::1/128 [0/0]
10           via Loopback0, receive
11      R   2001:12::/64 [120/2]
12           via FE80::A8BB:CCFF:FE00:110, Ethernet0/0
13           via FE80::A8BB:CCFF:FE00:200, Ethernet0/1
14      C   2001:13::/64 [0/0]
15           via Ethernet0/0, directly connected
16      L   2001:13::3/128 [0/0]
17          via Ethernet0/0, receive
18      C   2001:23::/64 [0/0]
19           via Ethernet0/1, directly connected
20      L   2001:23::3/128 [0/0]
21          via Ethernet0/1, receive
22      L   FF00::/8 [0/0]
23           via Null0, receive
Router-3# 

为了方便分析,我们在输出路由表的左侧加入了行号。第1行是在上个小结的实验中配置的默认路由,按理说这里配置了动态路由协议,就可以取消默认路由的配置,但是考虑到后面章节的讲解还会涉及到默认路由的配置信息,这里我们就先暂时不删除了。

第2行是默认路由的下一跳地址。

第3行前的R表示这条路由是通过RIP学到的;2001:1::/64是学到的网络前缀,也就是Router-1环回接口0的IP地址段;[120/2]中的120是RIP的管理距离(有关管理距离,后面我们会详细讲解);[120/2]中的2表示要达到这条路由需要经过路由器的数量,RIPng的跳数比想象中的要多1跳,这是RIPng与RIP不同的地方。在RIPng中,在默认情况下,进入路由表之前RIPng的度量值加1。

第4行是RIPng路由的下一跳地址,可以看到RIPng的下一跳不是邻居接口的IPv6地址,而是一个以FE80打头的地址。这个地址就是邻居路由器的相连接口的链路本地地址。RIPng使用链路本地地址作为更新消息的源地址。最后的Ethernet0/0表示本路由器的外出接口。

第5行和第6行是另一条RIPng路由的信息。

第11行是前缀为2001:12::/64的RIPng路由,该路由有两个下一跳,分别是第12行和第13行。所有去往2001:12::/64前缀的数据包将在两条等值的链路上进行负载均衡。检验如下:

# 打开IPv6的ICMP调试
Router-3#debug ipv6 icmp
  ICMPv6 Packet debugging is on
# ping 2001:12::/64(前缀的IPv6地址)
Router-3#ping 2001:12::1 
*Mar 15 16:12:18.039: ICMPv6: Received R-Advert, Src=FE80::A8BB:CCFF:FE00:110, Dst=FF02::1
Router-3#ping 2001:12::1 
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 2001:12::1, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 1/9/35 ms
Router-3#
*Mar 15 16:12:20.492: ICMPv6: Sent echo request, Src=2001:13::3, Dst=2001:12::1
*Mar 15 16:12:20.501: ICMPv6: Received N-Solicit, Src=FE80::A8BB:CCFF:FE00:110, Dst=FF02::1:FF00:3
*Mar 15 16:12:20.502: ICMPv6: Sent N-Advert, Src=2001:13::3, Dst=FE80::A8BB:CCFF:FE00:110
*Mar 15 16:12:20.502: ICMPv6: Received echo reply, Src=2001:12::1, Dst=2001:13::3
*Mar 15 16:12:20.502: ICMPv6: Sent echo request, Src=2001:23::3, Dst=2001:12::1
*Mar 15 16:12:20.528: ICMPv6: Received N-Solicit, Src=FE80::A8BB:CCFF:FE00:200, Dst=FF02::1:FF00:3
*Mar 15 16:12:20.537: ICMPv6: Sent N-Advert, Src=2001:23::3, Dst=FE80::A8BB:CCFF:FE00:200
Router-3#
*Mar 15 16:12:20.537: ICMPv6: Received echo reply, Src=2001:12::1, Dst=2001:23::3
*Mar 15 16:12:20.537: ICMPv6: Sent echo request, Src=2001:13::3, Dst=2001:12::1
*Mar 15 16:12:20.538: ICMPv6: Received echo reply, Src=2001:12::1, Dst=2001:13::3
*Mar 15 16:12:20.538: ICMPv6: Sent echo request, Src=2001:23::3, Dst=2001:12::1
*Mar 15 16:12:20.538: ICMPv6: Received echo reply, Src=2001:12::1, Dst=2001:23::3
*Mar 15 16:12:20.538: ICMPv6: Sent echo request, Src=2001:13::3, Dst=2001:12::1
*Mar 15 16:12:20.539: ICMPv6: Received echo reply, Src=2001:12::1, Dst=2001:13::3

从上面的输出中可以看到,Router-3轮流使用Ethernet0/0接口的IPv6地址2001:13::3和Ethernet0/1接口的IPv6地址2001:23::3去ping目标地址。

如果这时候出现故障、那么网络结构会发生什么变化呢?下面我们来模拟一下故障状态。我们断开Router-3和Router-1之间的链路,验证动态路由会根据拓扑的变化自动调整路由表。关闭Router-3的e0/0接口:

Router-3(config)#int eth0/0
Router-3(config-if)#shutdown 

注:在上述路由表中Router-3是通过Router-3和Router-1之间的链路去往Router-1的环回接口的。

然后我们查看Router-3的路由表,路由条目显示如下:

Router-3#sh ipv6 route
IPv6 Routing Table - default - 10 entries
Codes: C - Connected, L - Local, S - Static, U - Per-user Static route
       B - BGP, HA - Home Agent, MR - Mobile Router, R - RIP
       H - NHRP, I1 - ISIS L1, I2 - ISIS L2, IA - ISIS interarea
       IS - ISIS summary, D - EIGRP, EX - EIGRP external, NM - NEMO
       ND - ND Default, NDp - ND Prefix, DCE - Destination, NDr - Redirect
       O - OSPF Intra, OI - OSPF Inter, OE1 - OSPF ext 1, OE2 - OSPF ext 2
       ON1 - OSPF NSSA ext 1, ON2 - OSPF NSSA ext 2, la - LISP alt
       lr - LISP site-registrations, ld - LISP dyn-eid, a - Application
S   ::/0 [1/0]
     via 2001:13::1
R   2001:1::/64 [120/3]
     via FE80::A8BB:CCFF:FE00:200, Ethernet0/1
R   2001:2::/64 [120/2]
     via FE80::A8BB:CCFF:FE00:200, Ethernet0/1
C   2001:3::/64 [0/0]
     via Loopback0, directly connected
L   2001:3::1/128 [0/0]
     via Loopback0, receive
R   2001:12::/64 [120/2]
     via FE80::A8BB:CCFF:FE00:200, Ethernet0/1
R   2001:13::/64 [120/3]
     via FE80::A8BB:CCFF:FE00:200, Ethernet0/1
C   2001:23::/64 [0/0]
     via Ethernet0/1, directly connected
L   2001:23::3/128 [0/0]
     via Ethernet0/1, receive
L   FF00::/8 [0/0]
     via Null0, receive
Router-3#

注意在上面的输出中,Router-3通过 Router-3和Router-2之间的链路去往Router-1的环回接口,跳数从2变成了3。

好了、我们现在把故障恢复。我们打开Router-3的e0/0接口,马上查看路由表,路由表很可能没有恢复到断开前的状态。这是因为RIPng是距离矢量路由协议,每30s发送一次路由更新。稍后路由恢复到断开前的状态。

Router-3(config)#int eth0/0
Router-3(config-if)#no shutdown
# 故障恢复后立即查询路由表信息
Router-3#sh ipv6 route
IPv6 Routing Table - default - 10 entries
Codes: C - Connected, L - Local, S - Static, U - Per-user Static route
       B - BGP, HA - Home Agent, MR - Mobile Router, R - RIP
       H - NHRP, I1 - ISIS L1, I2 - ISIS L2, IA - ISIS interarea
       IS - ISIS summary, D - EIGRP, EX - EIGRP external, NM - NEMO
       ND - ND Default, NDp - ND Prefix, DCE - Destination, NDr - Redirect
       O - OSPF Intra, OI - OSPF Inter, OE1 - OSPF ext 1, OE2 - OSPF ext 2
       ON1 - OSPF NSSA ext 1, ON2 - OSPF NSSA ext 2, la - LISP alt
       lr - LISP site-registrations, ld - LISP dyn-eid, a - Application
S   ::/0 [1/0]
     via 2001:13::1
R   2001:1::/64 [120/3]
     via FE80::A8BB:CCFF:FE00:200, Ethernet0/1
R   2001:2::/64 [120/2]
     via FE80::A8BB:CCFF:FE00:200, Ethernet0/1
C   2001:3::/64 [0/0]
     via Loopback0, directly connected
L   2001:3::1/128 [0/0]
     via Loopback0, receive
R   2001:12::/64 [120/2]
     via FE80::A8BB:CCFF:FE00:200, Ethernet0/1
R   2001:13::/64 [120/3]
     via FE80::A8BB:CCFF:FE00:200, Ethernet0/1
C   2001:23::/64 [0/0]
     via Ethernet0/1, directly connected
L   2001:23::3/128 [0/0]
     via Ethernet0/1, receive
L   FF00::/8 [0/0]
     via Null0, receive
Router-3#

# 故障恢复30S以后查看路由表
Router-3#sh ipv6 route
IPv6 Routing Table - default - 11 entries
Codes: C - Connected, L - Local, S - Static, U - Per-user Static route
       B - BGP, HA - Home Agent, MR - Mobile Router, R - RIP
       H - NHRP, I1 - ISIS L1, I2 - ISIS L2, IA - ISIS interarea
       IS - ISIS summary, D - EIGRP, EX - EIGRP external, NM - NEMO
       ND - ND Default, NDp - ND Prefix, DCE - Destination, NDr - Redirect
       O - OSPF Intra, OI - OSPF Inter, OE1 - OSPF ext 1, OE2 - OSPF ext 2
       ON1 - OSPF NSSA ext 1, ON2 - OSPF NSSA ext 2, la - LISP alt
       lr - LISP site-registrations, ld - LISP dyn-eid, a - Application
S   ::/0 [1/0]
     via 2001:13::1
R   2001:1::/64 [120/2]
     via FE80::A8BB:CCFF:FE00:110, Ethernet0/0
R   2001:2::/64 [120/2]
     via FE80::A8BB:CCFF:FE00:200, Ethernet0/1
C   2001:3::/64 [0/0]
     via Loopback0, directly connected
L   2001:3::1/128 [0/0]
     via Loopback0, receive
R   2001:12::/64 [120/2]
     via FE80::A8BB:CCFF:FE00:200, Ethernet0/1
     via FE80::A8BB:CCFF:FE00:110, Ethernet0/0
C   2001:13::/64 [0/0]
     via Ethernet0/0, directly connected
L   2001:13::3/128 [0/0]
     via Ethernet0/0, receive
C   2001:23::/64 [0/0]
     via Ethernet0/1, directly connected
L   2001:23::3/128 [0/0]
     via Ethernet0/1, receive
L   FF00::/8 [0/0]
     via Null0, receive
Router-3#

至此,我们通过实验证明了动态路由协议能自动学习邻居路由,并能根据拓扑变化自动调整路由表。

7、动态路由协议-OSPFv3

OSPF是典型的链路状态路由协议。OSPFv3用于在IPv6网络中提供路由功能,是IPv6网络中主流的路由协议。OSPFv3虽在工作机制上与OSPFv2基本相同,但并不向下兼容OSPFv2,不支持IPv4协议。

OSPFv3与OSPFv2的相同点

OSPFv3在协议设计思路和工作机制与OSPFv2基本一致,两者具有的相同点如下:

1、报文类型相同,也有5种类型的报文:Hello、DBD、LSR、LSU、LSAck。

2、区域划分相同。

3、LSA泛洪和同步机制相同。

4、为了保证LSDB内容的正确性,需要保证LSA的可靠泛洪和同步。

5、路由计算方法相同:采用最短路径优先算法计算路由。

6、邻居发现和邻接关系形成机制相同。

7、DR选举机制相同:在NBMA和广播网络中需要选举DR和BDR。

OSPFv3与OSPFv2的不同点

为了能在IPv6环境中运行,OSPFv3对OSPFv2做出了一些必要的改进,使OSPFv3可以独立于网络层协议,而且后续只要稍加扩展就可以适应各种协议。这为未来可能的扩展预留了充分的空间。OSPFv3与OSPFv2的不同主要表现在以下几个方面:

1、基于链路的运行:OSPFv2是基于网络运行的,两个路由器要形成邻居关系,则必须在同一个网段。OSPFv3是基于链路运行的,一个链路可以划分为多个子网,节点即使不在同一个子网内,也可以形成邻居关系。

2、使用链路本地地址:OSPFv3的路由器使用链路本地地址作为发送报文的源地址。一个路由器可以学习到这个链路上相连的所有其他路由器的链路本地地址,并使用这些链路本地地址作为下一跳来转发报文。

3、通过Router ID唯一标识邻居:在OSPFv2中,当网络类型为点到点或者通过虚链路与邻居相连时,路由器通过Router ID来标识邻居路由器。当网络类型为广播或NBMA时,则通过邻居接口的IP地址来标识邻居路由器。OSPFv3取消了这种复杂性,即无论对于何种网络类型,都通过Router ID来唯一标识邻居。Router ID和Area ID仍然采用32位长度。

4、认证的变化:OSPFv3协议本身不再提供认证功能,而是通过使用IPv6提供的安全机制来保证自身报文的合法性。

5、报头的不同:与OSPFv2报头相比,OSPFv3报头长度从24字节变成16字节,去掉了认证字段,但加了Instance ID字段。InstanceID字段用来支持在同一条链路上运行多个实例,且只在链路本地范围内有效,如果路由器接收到的Hello报文的Instance ID与当前接口配置的Instance ID不同,将无法建立邻居关系。

6、组播地址的不同:OSPFv3的组播地址为FF02::5和FF02::6。

注:鉴于OSPF配置的复杂性,这里我们仅介绍单区域OSPF的配置。

7.1、配置OSPFv3

讲了这么多、下面我们一起来看看单区域OSPFv3的实验配置。

image-20220315173640681

Router-1的配置信息如下:

Router-1>en
Router-1#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
# 启用OSPFv3协议,这里的1代表进程号,只具有本地意义
Router-1(config)#ipv6 router ospf 1
# OSPFv3中每台路由器的RouterID不会自动根据IPv6地址产生,需要手动指定。
# 路由器上若有IPv4的IP地址,也可不指定Router ID,Router ID由IPv4地址而来,生成的规则与OSPFv2相同
Router-1(config-rtr)#router-id 1.1.1.1
Router-1(config-rtr)#int eth0/0
# OSPFv3不同于OSPFv2,不是在路由进程下通告所有的直联网络,而是在接口通告这个接口。
# 这里的1代表OSPF进程号,其值需要与前面ipv6 router ospf命令配置的进程号一样。
# area 0代表该接口所在的OSPF区域;这条命令后面还可以跟Instance ID,若不设置,则默认是0
Router-1(config-if)#ipv6 ospf 1 area 0
Router-1(config-if)#int eth0/1
Router-1(config-if)#ipv6 ospf 1 area 0
Router-1(config-if)#int lo0
Router-1(config-if)#ipv6 ospf 1 area 0
Router-1(config-if)#end
Router-1#wr
Building configuration...
[OK]

Router-2的配置信息如下:

Router-2>en
Router-2#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
Router-2(config)#ipv6 router ospf 1
Router-2(config-rtr)#
Router-2(config-rtr)#router-id 2.2.2.2
Router-2(config-rtr)#int eth0/0
Router-2(config-if)#ipv6 ospf 1 area 0
Router-2(config-if)#int eth0/1
Router-2(config-if)#ipv6 ospf 1 area 0
Router-2(config-if)#int lo0
Router-2(config-if)#ipv6 ospf 1 area 0
Router-2(config-if)#end
Router-2#wr
Building configuration...
[OK]

Router-3的配置信息如下:

Router-3>en
Router-3#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
Router-3(config)#ipv6 router ospf 1
Router-3(config-rtr)#router-id 3.3.3.3
Router-3(config-rtr)#int eth0/0
Router-3(config-if)#ipv6 ospf 1 area 0
Router-3(config-if)#int eth0/1
Router-3(config-if)#ipv6 ospf 1 area 0
Router-3(config-if)#int lo0
Router-3(config-if)#ipv6 ospf 1 area 0
Router-3(config-if)#end
Router-3#wr
Building configuration...
[OK]

配置完成之后,我们来测试一下网络连通性。我们在在Router-1、Router-2、Router-3上任意ping实验拓扑中标出的所有IPv6地址,都可以ping通。在Router-3上执行show ipv6 route命令,路由条目显示如下:

Router-3#sh ipv6 route 
IPv6 Routing Table - default - 13 entries
Codes: C - Connected, L - Local, S - Static, U - Per-user Static route
       B - BGP, HA - Home Agent, MR - Mobile Router, R - RIP
       H - NHRP, I1 - ISIS L1, I2 - ISIS L2, IA - ISIS interarea
       IS - ISIS summary, D - EIGRP, EX - EIGRP external, NM - NEMO
       ND - ND Default, NDp - ND Prefix, DCE - Destination, NDr - Redirect
       O - OSPF Intra, OI - OSPF Inter, OE1 - OSPF ext 1, OE2 - OSPF ext 2
       ON1 - OSPF NSSA ext 1, ON2 - OSPF NSSA ext 2, la - LISP alt
       lr - LISP site-registrations, ld - LISP dyn-eid, a - Application
1       S   ::/0 [1/0]
2            via 2001:13::1
3       R   2001:1::/64 [120/2]
4            via FE80::A8BB:CCFF:FE00:110, Ethernet0/0
5       O   2001:1::1/128 [110/10]
6            via FE80::A8BB:CCFF:FE00:110, Ethernet0/0
7       R   2001:2::/64 [120/2]
8            via FE80::A8BB:CCFF:FE00:200, Ethernet0/1
9       O   2001:2::1/128 [110/10]
10           via FE80::A8BB:CCFF:FE00:200, Ethernet0/1
11      C   2001:3::/64 [0/0]
12           via Loopback0, directly connected
13      L   2001:3::1/128 [0/0]
14           via Loopback0, receive
15      O   2001:12::/64 [110/20]
16           via FE80::A8BB:CCFF:FE00:110, Ethernet0/0
17           via FE80::A8BB:CCFF:FE00:200, Ethernet0/1
18      C   2001:13::/64 [0/0]
19           via Ethernet0/0, directly connected
20      L   2001:13::3/128 [0/0]
21           via Ethernet0/0, receive
22      C   2001:23::/64 [0/0]
23           via Ethernet0/1, directly connected
24      L   2001:23::3/128 [0/0]
25           via Ethernet0/1, receive
26      L   FF00::/8 [0/0]
27           via Null0, receive
Router-3# 

为了方便讲解,我们在输出路由表的左侧加入了行号。

第5行的O代表是OSPF的路由;2001:1::1/128表示网络前缀,这里是Router-1环回接口的路由。OSPF会自动识别环回接口,并直接显示128位的主机路由。若想恢复环回接口原来的前缀,需要配置下面的命令:

Router(config)#int loopback 0
Router(config-if)#ipv6 ospf network point-to-point

这里我们暂不配置该命令,后面章节我们再进行配置。第5行的[110/10]中的110表示OSPF的管理距离是110;10表示OSPF的开销(Cost),该值是沿途上链路开销的总和,该值由带宽计算而来。

第6行是OSPF路由的下一跳地址和本路由器的外出接口,这里与RIPng相同,使用的仍然是邻居的链路本地地址。

第9行和第10行是Router-2环回接口的OSPF路由。

第15、16、17行是Router-1和Router-2互联网段的路由,这两条路由是等值链路,可以进行负载均衡。

感兴趣的同学可以像测试RIPng路由一样,断开某条链路,测试OSPF根据拓扑变化调整路由表的能力。测试之后同学们会发现OSPF也可以根据拓扑变化动态调整路由表,并且收敛的速度比RIPng更快。

8、路由选路

路由器默认根据数据分组中的目标IP地址进行选路,本节我们将介绍在下面多种情况下,路由器如何进行选路:一个目标地址被多个目标网络包含时;一个目标网络的多种路由协议的多条路径共存时;一个目标网络的同一种路由协议的多条路径共存时。

8.1、管理距离

管理距离(Administrative Distance,AD),是用来衡量路由可信度的一个参数。管理距离越小,路由越可靠,这意味着具有较小管理距离的路由将优于较大管理距离的路由,管理距离的取值为0~255
的整数值,0是最可信的,255是最不可信的。如果一台路由器收到同一个网络的两个路由更新信息,那么路由器将把管理距离小的路由放入路由表中。下表列出了思科和华为设备上默认的管理距离值(这里仅对常用的直连、静态、RIP和OSPF做了介绍)。

路由源 默认管理距离值(思科) 默认管理距离值(华为)
直连接口 0 0
静态路由 1 60
EIGRP汇总路由 5
外部BGP 20 255
内部EIGRP 90
OSPFv3 110 OSPF区域内是10,OSPF外部是150
IS-IS 115 15
RIPng 120 100
EGP 140 255
外部EIGRP 170
内部BGP 200 255
未知 255

8.2、路由选路原则

1、最长匹配优先

如果一个目标地址被多个目标网络包含,那么它将优先选择最长匹配的路由。比如上面的OSPFv3实验中中Router-3如果去访问Router-1的环回接口2001:1::1,那么下面的3条路由都满足。根据最长匹配原则,路由器将选择第5行的路由,这条路由匹配了128位,第3行的路由匹配了64位,第1行的路由匹配了0位(属于最不精确的匹配)。

1    S   ::/0 [1/0]
2           via 2001:13::1
3    R   2001:1::/64 [120/2]
4           via FE80::A8BB:CCFF:FE00:110, Ethernet0/0
5    O   2001:1::1/128 [110/10]
6           via FE80::A8BB:CCFF:FE00:110, Ethernet0/0

2、管理距离最小优先

当一个目标网络的多种路由协议的多条路径共存时,将按照下列顺序进行选路。

在子网掩码长度相同的情况下,路由器优先选择管理距离小的路由。在RIPng实验中Router-3通过RIPng学到了2001:12::/64的路由,在实验6-5中又配置了OSPFv3路由,Router-3通过OSPF也学到了2001:12::/64的路由。由于RIP的管理距离是120,OSPF的管理距离是110,对于同样的路由条目,管理距离小的路由进入路由表,管理距离大的路由被抑制。

看到这里有同学可能会问,为什么第3行和第7行的RIPng路由没有被抑制呢?原因是Router-3通过RIPng学到Router-1环回接口的路由是2001:1::/64,通过OSPF学到Router-1环回接口的路由是2001:1::1/128,也就是第3行和第5行是不同的路由条目,所以第5行不能抑制第3行。同理,第7行也不会被第9行抑制。

3    R   2001:1::/64 [120/2]
4            via FE80::A8BB:CCFF:FE00:110, Ethernet0/0
5    O   2001:1::1/128 [110/10]
6            via FE80::A8BB:CCFF:FE00:110, Ethernet0/0
7    R   2001:2::/64 [120/2]
8            via FE80::A8BB:CCFF:FE00:200, Ethernet0/1
9    O   2001:2::1/128 [110/10]
10           via FE80::A8BB:CCFF:FE00:200, Ethernet0/1
11   C   2001:3::/64 [0/0]
12           via Loopback0, directly connected
13   L   2001:3::1/128 [0/0]
14           via Loopback0, receive
15   O   2001:12::/64 [110/20]
16           via FE80::A8BB:CCFF:FE00:110, Ethernet0/0
17           via FE80::A8BB:CCFF:FE00:200, Ethernet0/1

在Router-1和Router-2环回接口下,输入ipv6 ospf network point-to-point命令,恢复环回口的前缀路由,此时再查看Router-3的路由表,显示如下:

Router-3#show ipv6 route
1    S   ::/0 [1/0]
2            via 2001:13::1
3    O   2001:1::/64 [110/11]
4            via FE80::A8BB:CCFF:FE00:110, Ethernet0/0
5    O   2001:2::/64 [110/11]
6            via FE80::A8BB:CCFF:FE00:200, Ethernet0/1
7    C   2001:3::/64 [0/0]
8            via Loopback0, directly connected
9    L   2001:3::1/128 [0/0]
10           via Loopback0, receive
11   O   2001:12::/64 [110/20]
12           via FE80::A8BB:CCFF:FE00:200, Ethernet0/1
13           via FE80::A8BB:CCFF:FE00:110, Ethernet0/0
14   C   2001:13::/64 [0/0]
15           via Ethernet0/0, directly connected
16   L   2001:13::3/128 [0/0]
17           via Ethernet0/0, receive
18   C   2001:23::/64 [0/0]
19           via Ethernet0/1, directly connected
20   L   2001:23::3/128 [0/0]
21           via Ethernet0/1, receive
22   L   FF00::/8 [0/0]
23           via Null0, receive

从输出中可以看到,Router-1和Router-2环回接口的路由前缀长度都变成了64位,成功地抑制了RIPng路由。这里的第1行是静态路由,管理距离是1,第3、5、11行的OSPF路由管理距离是110。假如有数据包的目标IP地址是2001:2::1,则该数据包是走第1行的静态路由,还是走第3行的OSPF路由呢(这2条路由都包含2001:2::1地址)?答案是走第3行的OSPF路由。别忘了,选路原则的第一条是最长匹配优先,接下来比较的才是管理距离,而第1行仅匹配了0位,第3行匹配了64位。

3、度量值最小优先

当一个目标网络同一种路由协议的多条路径共存时,将根据度量值进行选路。

如果路由的子网掩码长度相同,管理距离也相等(这往往是一种路由协议的多条路径),接下来比较的就是度量值。回想一下RIPng实验中,Router-1通过RIPng协议把2001:1::/64路由发给了Router-2和Router-3,稍后Router-2会把自己的路由表也发给Router-3。Router-3从Router-1和Router-2都学到了2001:1::/64路由,但从Router-1学到的跳数是2,从Router-2学到的跳数是3。比较从两处学来的路由:前缀长度相同,管理距离也相同。接下来比较的就是度量值,度量值小的路由进入路由表,度量值大的跳由被抑制。

推荐文章