路由技术主要是指路由选择算法。
路由器基础
路由原理
路由选择发生在网络层,主要由路由器来完成。路由器有多个接口,用于连接不同的IPv6
网段,不同接口的IPv6
不能重叠。
路由器的工作就是接收数据分组,然后根据当前网络的状况选择最有效的路径将其转发出去。
路由器中的路由表必须实时更新,以准确地反映当前的网络状态。
网络前缀相同的主机之间可以直接通信,网络前缀不同的主机之间若要通信,则必须经过同一网段上的某个路由器或网关(gateway
)实现。
路由器在转发IPv6
分组时,根据目的IPv6
地址的网络前缀选择合适的接口,把IPv6
分组发送出去。
路由技术就是为了转发IP
数据分组而在通信子网中寻找最佳传输路径,以将其发送到最终设备。
路由选择算法必须启动并维护包含路由信息的路由表,其中路由信息因所用的路由选择算法而不尽相同。
路由选择算法将收集到的不同信息填入路由表中,根据路由表可将目的网络与下一跳(next-hop
)的关系告诉路由器。
路由器间互通信息进行路由更新,以更新维护路由表,使之正确反映网络的拓扑变化,并根据度量值来决定最佳路径,这就是路由协议(Routing Protocol
)。
开放式最短路径优先协议版本3(Open Shortest-Path First v3,OSPFv3
)和边界网关协议(Border Gateway Protocol,BGP
)等都是常见的路由协议。
路由转发即沿寻址好的最佳路径传送数据分组。
路由器首先在路由表中查找相关信息,以查询将分组发送到下一跳(路由器或主机)的最佳路由,如果路由器不知道如何发送分组,通常会将该分组丢弃;
否则就根据路由表的相应表项将分组发送到下一跳;如果目的网络直接与路由器相连,那么路由器就把分组直接发送到相应的接口上。
路由协议
根据路由器学习路由信息、生成并维护路由表的方式,可将路由分为直连路由、静态路由和动态路由。
直连路由通过接口配置生成,静态路由通过管理员手动配置生成,动态路由通过动态路由协议计算生成。
直连路由
直连路由由数据链路层协议发现,是指去往路由器的接口IPv6
地址所在网段的路径,该路径信息不需要网络管理员维护,也不需要路由器通过某种算法进行计算获得,只要该接口处于激活状态(active
),路由器就会把直连接口所在网段的路由信息填写到路由表中去。
在IPv4
中,路由器会自动产生激活接口所在网段的直连路由。在IPv6
中,路由器同样也会自动产生激活接口所在网段的直连路由。
router-1
的配置如下:
Router>enable
Router#conf t
Router(config)#hostname Router-1
Router-1(config)#ipv6 unicast-routing 开启IPv6路由协议,有些路由器默认并没有开启IPv6路
由支持
Router-1(config)#interface Loopback0 配置环回接口0,这是路由器上的虚拟接口,可用来模拟路由
Router-1(config-if)#ipv6 enable 启用接口的IPv6功能,默认情况下,接口的IPv6功能处于未启用状态。未启用状态的接口不会处理某些IPv6报文,比如ND中的RA报文。没有RA报文,接口将无法通过RA获取网络前缀和网关,也就无法形成IPv6地址。此命令不是必需的,在接口配置IPv6地址后,同样的功能也会开启。
Router-1(config-if)#ipv6 address 2001:1::1/64
Router-1(config-if)#no shutdown
Router-1(config-if)#interface Ethernet0/0
Router-1(config-if)#ipv6 enable
Router-1(config-if)#ipv6 address 2001:2::1/64
Router-1(config-if)#no shutdown
router-2
的配置如下:
Router>enable
Router#conf t
Router(config)#hostname Router-2
Router-2(config)#ipv6 unicast-routing
Router-2(config)#interface Loopback0
Router-2(config-if)#ipv6 enable
Router-2(config-if)#ipv6 address 2001:3::1/64
Router-2(config-if)#no shutdown
Router-2(config-if)#interface Ethernet0/0
Router-2(config-if)#ipv6 enable
Router-2(config-if)#ipv6 address 2001:2::2/64
Router-2(config-if)#no shutdown
在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 2001:2::/64 [0/0] //C表示直连路由,是接口所在网段的路由;前面的0代表管理距离,后面的0代表度量值也称为开销
via Ethernet0/0, directly connected //通过eth0/0接口可到达这个网段,是直连的路由
L 2001:2::2/128 [0/0] //L表示本地,这是接口ip所在的128位的主机路由
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 FF00::/8 [0/0] //L表示本地,多播地址空间的路由
via Null0, receive
静态路由
静态路由是指由网络管理员手动配置的路由信息。IPv4
和IPv6
网络都支持静态路由。
当网络的拓扑或链路状态发生变化时,网络管理员需要手动修改路由表中相关的静态路由信息。静态路由信息是私有的,不会传递给其他的路由器。
常规静态路由
如果路由器Router-1
知道把去往2001:3::1
的数据包发给Router-2
,Router-1
路由器默认会使用距离目标最近的接口IP
作为源IP
,也就是Router-1
使用2001:2::1
作为源IP
地址,去ping Router-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
呢?这就需要添加静态路由。添加静态路由的命令格式如下:
ipv6 route 2001:3::/64 2001:2::2
IPv6
静态路由的配置与IPv4
的类似,它使用的命令是ipv6 route
,后面是要去往的目的网络。
在IPv4
中,目的网络采用“网络号+网络掩码”的形式表示,在IPv6
中则是网络地址后跟“/网络前缀长度”。
这里配置的2001:3::/64
,表示的是去往以2001:0003:0000:0000
为起始地址的所有IPv6
地址。
接下来是输入下一跳路由器直连接口的IP
地址,或者输入本路由器的外出接口。
这里特别要注意的是,即使要到达的网络与本路由器相隔数台路由器,这里填入的还是下一跳地址,而不是目标网络的前一跳。也就是说,在静态路由中,只需指出下一跳的地址即可,至于以后如何指向,则是下一跳路由器考虑的事情。
此时,在Router-1
上ping 2001:3::1
,可以ping
通。取消上面的静态路由命令,改用外出接口,命令如下:
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
上ping 2001:3::1
,发现无法ping
通。
这两条命令都是在Router-1
上添加一条去往2001:3::/64
网段的静态路由。
由上可知,至于添加的是下一跳的地址还是本路由器的外出接口,还是有差别的。
如果是以太网这种多路访问链路,若使用外出接口,则路由器将不知道把包发往哪一台路由器,也不知道要发往哪一个IPv6
地址,自然也就无法完成数据链路层的解析过程。
在不知道下一跳设备MAC
地址的情况下,也就无法完成ping
包的数据封装。
使用下面命令在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
上配置静态路由
ipv6 route 2001:1::/64 2001:2::1
配置完成后,Router-2
就可以ping
通Router-1
环回接口的IP
地址了。
路由器默认会使用距离目的最近的接口IP
执行ping
操作。下面的命令强制Router-1
使用环回接口的IP地址2001:1::1
去ping
路由器Router-2
的环回接口的IP
地址2001:3::1
:
ping ipv6 2001:3::1 source 2001:1::1
在路由器Router-2
上执行debug ipv6 icmp
命令,检测Router-1
来访的IPv6
地址,显示如下:
Router-2#debug ipv6 icmp
ICMPv6 Packet debugging is on
Router-2#
*Feb 17 17:19:57.924: ICMPv6: Received echo request, Src=2001:1::1, Dst=2001:3::1
*Feb 17 17:19:57.924: ICMPv6: Sent echo reply, Src=2001:3::1, Dst=2001:1::1
从上面的输出可以看出,Router-1
是使用环回接口去ping
路由器Router-2
的环回接口的。
下面总结一下配置静态路由的一般步骤。
- 1.为路由器每个接口配置
IP
地址。 - 2.确定本路由器有哪些直连网段。
- 3.确定网络中有哪些属于本路由器的非直连网段。
- 4.在路由表中添加所有非本路由器直连网段的相关路由信息。
实验:配置静态路由
配置静态路由,使下图的任何两个IP
地址之间都可以连通。
分析:根据前面配置静态路由的总结,首先配置接口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>enable
Router#conf t
Router(config)#host 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 eth 0/0
Router-1(config-if)#ipv6 add 2001:da8:1011:f001::1/64
Router-1(config-if)#no shut
Router-1(config-if)#exit
Router-1(config)#ipv6 route 2001:da8:1011:2001::/64 2001:da8:1011:f001::2 去往Router-2环回接口0
Router-1(config)#ipv6 route 2001:da8:1011:2002::/64 2001:da8:1011:f001::2 去往Router-2环回接口1
Router-1(config)#ipv6 route 2001:da8:1011:3001::/64 2001:da8:1011:f001::2 去往Router-3环回接口0,不管之间隔了多少台路由器,只需要把数据包发给下一台路由器直连接口的IP地址即可
Router-1(config)#ipv6 route 2001:da8:1011:3002::/64 2001:da8:1011:f001::2 去往Router-3环回接口1
Router-1(config)#ipv6 route 2001:da8:1011:f002::/64 2001:da8:1011:f001::2 去往Router-2和Router-3之间的互联网段
Router-2
的配置如下:
Router>enable
Router#conf t
Router(config)#host 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 eth 0/0
Router-2(config-if)#ipv6 add 2001:da8:1011:f001::2/64
Router-2(config-if)#no shut
Router-2(config-if)#int eth 0/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-2(config)#ipv6 route 2001:da8:1011:1001::/64 2001:da8:1011:f001::1 去往Router-1环回接口0
Router-2(config)#ipv6 route 2001:da8:1011:1002::/64 2001:da8:1011:f001::1 去往Router-1环回接口1
Router-2(config)#ipv6 route 2001:da8:1011:3001::/64 2001:da8:1011:f002::2 去往Router-3环回接口0
Router-2(config)#ipv6 route 2001:da8:1011:3002::/64 2001:da8:1011:f002::2 去往Router-3环回接口1
Router-2
的配置如下:
Router>enable
Router#conf t
Router(config)#host 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 eth 0/0
Router-3(config-if)#ipv6 add 2001:da8:1011:f002::2/64
Router-3(config-if)#no shut
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:2001::/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
经过上述配置后,图中的所有IP地址之间都可以连通。
Router-1
中的5条路由都是去往Router-2
的2001:da8:1011:f001::2
。
有没有办法简化些配置呢?办法是有的,那就是采用路由汇总。
把所有路由写出来,然后把所有路由共有的部分写出来,再统计一下共用的位数。
所有路由共用的部分为2001:da8:1011
,共用的位数是48位,汇总后的路由是2011:da8:1011::/48
(当然这里的汇总属于不精确汇总)。
这样Router-1
上只写一条路由就可以了。在Router-1
删除明细路由,再添加一条汇总的路由。
采用类似的方法,在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
路由条目。
浮动静态路由
在简单的网络中可以通过指定静态路由的管理距离来达到链路冗余备份的目的。指定了管理距离的静态路由叫做浮动静态路由,广泛应用于链路备份的场合。下面通过一个实验来演示浮动静态路由的使用。
- 实验:配置浮动静态路由
如图下图所示。总部和分部之间通过双链路互连,假设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
地址。
- 1.配置核心交换机。
switch-1
的配置如下:Switch>enable Switch#conf t Switch(config)#host Switch-1 Switch-1(config)#ipv6 unicast-routing Switch-1(config)#interface Ethernet0/2 Switch-1(config-if)# no switchport Switch-1(config-if)# ipv6 address 2001:DA8:1011:F001::1/64 Switch-1(config-if)# ipv6 enable Switch-1(config-if)# no shutdown Switch-1(config-if)#interface Ethernet0/3 Switch-1(config-if)# no switchport Switch-1(config-if)# ipv6 address 2001:DA8:1011:F002::1/64 Switch-1(config-if)# ipv6 enable Switch-1(config-if)# no shutdown Switch-1(config-if)#interface Vlan1 Switch-1(config-if)# ipv6 address 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 这条路由没有指定静态路由的管理距离,使用默认的管理距离1 Switch-1(config)#ipv6 route 2001:DA8:1011:2001::/64 2001:DA8:1011:F002::2 2 这条路由指定静态路由的管理距离是2
switch-2
的配置如下:
Switch>enable
Switch#conf t
Switch(config)#host Switch-2
Switch-2(config)#ipv6 unicast-routing
Switch-2(config)#interface Ethernet0/2
Switch-2(config-if)# no switchport
Switch-2(config-if)# ipv6 address 2001:DA8:1011:F001::2/64
Switch-2(config-if)# ipv6 enable
Switch-2(config-if)# no shutdown
Switch-2(config-if)#interface Ethernet0/3
Switch-2(config-if)# no switchport
Switch-2(config-if)# ipv6 address 2001:DA8:1011:F002::2/64
Switch-2(config-if)# ipv6 enable
Switch-2(config-if)# no shutdown
Switch-2(config-if)#interface Vlan1
Switch-2(config-if)# ipv6 address 2001:DA8:1011:2001::1/64
Switch-2(config-if)# ipv6 enable
Switch-2(config-if)# no shutdown
Switch-2(config-if)#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
- 2.配置终端的
ipv6
地址并测试连通性。Win10-1
和Win10-2
默认启用了IPv6
协议,且自动获取地址。
使用ipconfig
命令验证两台计算机是否都获取了正确的IPv6
地址,其中Win10-2
的显示如图所示。
可以看到Win10-2
获取了2001:da8:1011:2001::/64
的IPv6
地址,并成功ping
通以2001:da8:1011:1001::/64
开头的Win10-1
的IPv6
地址(这里Win10-1
的IPv6地址是2001:da8:1011:1001:d57c:b6c:cf69:cec6
)。
这里也可以看到,因启用了IPv4
协议和自动获取IPv4
地址,而网络上没有DHCP
服务器,所以IPv4
的IP
地址被随机配置成以169.254
打头的IP地址。
- 3.验证路由。查看
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
去往2001:DA8:1011:2001::/64
的下一跳是2001:da8:1011:F001::2
,走的是e0/2
链路。
为了让效果更明显,在Win10-2
上持续用大包ping Win10-1
,命令如下:
ping 2001:da8:1011:1001:d57c:b6c:cf69:cec6 -t -l 10240
ping
测试默认是发送4个包,这里-t
的意思是一直ping
,ping
包的默认大小是32
字节,这里-l 10240
指定ping
包的大小是10240
字节
在交换机Switch-1
上使用show
命令,分别查看e0/2
和e0/3
端口的数据包统计,e0/2
接口上的数据持续不断,e0/3
接口上的数据基本不变,这证明了大量的ping
包确实走的是e0/2
链路。
也可以通过抓包来验证。可以观察到e0/2
接口捕获到了大量的ICMPv6
报文。
由于数据包的默认大小是1510字节,所以导致每个10240字节的ping
包被拆成了多个报文。
e0/3
接口没有捕获到这样的数据包。
- 4.模拟故障。断开
Switch-1
和Switch-2
的e0/2
接口,发现Win10-1
和Win10-2
之间仍然可以ping
通。
可以使用show interface e0/3
命令查看接口的通信情况,以证明此时流量切换到e0/3
链路。
在Switch-1
上查看路由表,显示如下。可以看出去往2001:da8:1011:2001::/64的
下一跳是2001:DA8:1011:F002::
2,已经切换到e0/3
链路。注意这条静态路由后的显示是[2/0],管理距离是2。
Switch-2(config-if)#do show 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
S 2001:DA8:1011:1001::/64 [2/0]
via 2001:DA8:1011:F002::1
C 2001:DA8:1011:2001::/64 [0/0]
via Vlan1, directly connected
L 2001:DA8:1011:2001::1/128 [0/0]
via Vlan1, receive
C 2001:DA8:1011:F002::/64 [0/0]
via Ethernet0/3, directly connected
L 2001:DA8:1011:F002::2/128 [0/0]
via Ethernet0/3, receive
L FF00::/8 [0/0]
via Null0, receive
- 5.模拟故障恢复。打开
Switch-1
和Switch-2
的e0/2
接口,此时再次执行show interface
命令,可以看到流量又切换回e0/2
链路。
静态路由优缺点
与所有的路由协议一样,静态路由协议也有自己的优缺点。了解每种路由协议的优缺点,有利于根据网络规模的状况,正确地选择适合的路由协议。静态路由具有以下优点。
- 对CPU、内存等硬件的需求不高。静态路由不像动态路由协议那样,需要缓存相互交换的路由信息,并执行一些算法,这意味着静态路由对CPU和内存的要求不高。
- 不占用带宽。静态路由不像动态路由协议那样,需要相互交换网络信息或路由表,这意味着静态路由可以节省带宽。
- 增加网络安全。静态路由是网络管理员手动添加的,即使不同的网络之间存在物理路径,只要管理员没有添加它们之间的静态路由,网络也是不可达的。相较于动态路由协议,静态路由更容易实现网络间的控制。
静态路由具有以下缺点。
- 配置工作量大且容易出错。由于所有的路由都需要管理员手动加入,对大型网络来说,这几乎是不可能的,而且容易出错。当某个新的网络出现时,管理员必须在所有路由器上添加这条静态路由。
- 适应拓扑变化的能力较差。静态路由不能适应网络拓扑的变化,从而动态地调整路由表。虽说可通过配置浮动静态路由,起到了冗余备份的作用,但毕竟只是用在简单的网络中。当网络规模较大时,试图通过配置浮动静态路由来冗余备份将变得异常复杂和不可行。
默认路由
默认路由(default routing
)也称作缺省路由,使用默认路由可以将那些路由表中没有明确列出目标网络的数据包转发到下一跳路由器。
在存根网络(只有一条连接到其邻居网络的路由,进出这个网络都只有一条路可以走)上可以使用默认路由,因为存根网络与外界之间只有一个连接。
上图所示为某公司的网络拓扑,该公司通过路由器接入ISP
,并通过ISP
路由器2001: da8:a3::1
访问整个互联网。
如果配置具体的静态路由来访问互联网,将要配置多条,低端的路由器根本无法承受如此多的路由条目。
可以配置公司路由器,使其使用默认路由。
默认路由的配置方法与静态路由的类似,只是将网络地址和前缀长度改成了::/0
,即只要匹配0位就可以,也就是匹配了所有IPv6
地址。图中公司出口路由器的默认路由配置如下:
ipv6 route ::/0 2001:da8:a3:a007::1
其实不只存根网络使用了默认路由,据统计,互联网上99.9%的路由器都使用了默认路由。
在使用IPv6
的计算机上执行命令route print
,可以在路由表中看到::/0
的路由条目,该条目对应的网关是路由器接口的链路本地地址。
- 实验:配置默认路由
每台路由器都通过loopback 0
接口模拟一个网段。要求配置最少数量的静态路由条目,以实现全网全通。
分析:根据前面介绍的静态路由的配置步骤,先确定网络中有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条静态路由,由此实现了全网全通。
默认路由是一种特殊的静态路由,可以理解为最不精确的汇总,如果使用默认路由,在图6-11中只需要配置下面3条默认路由就可以实现全网全通。
Router-1(config)#ipv6 route ::/0 2001:12::2 Router-1上所有未知的数据包都发给路由器Router-2
Router-2(config)#ipv6 route ::/0 2001:23::3 Router-2上所有未知的数据包都发给路由器Router-3
Router-3(config)#ipv6 route ::/02 001:13::1 Router-3上所有未知的数据包都发给路由器Router-1
配置完成后,可以在任意路由器上测试任意IP
地址,都可ping
通。
但数据包的往返路径不一定相同。
比如在Router-1
上ping
路由器Router-3
上的2001:3::1
,去的路径是Router-1→ Router-2→Router-3
,返回的路径是Router-3→Router-1
。
由于默认路由不是精确的路由,会产生一些副作用,比如路由环路。
在Router-1
上随便ping
一个不存在的IPv6路由条目,比如2001::1
,显示如下:
Router-1#ping ipv6 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)
返回值为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 1 msec
2 2001:23::3 0 msec 1 msec 0 msec
3 2001:13::1 1 msec 0 msec 0 msec
4 2001:12::2 1 msec 0 msec 1 msec
5 2001:23::3 1 msec 0 msec 1 msec
6 2001:13::1 0 msec 0 msec 1 msec
7 2001:12::2 0 msec 1 msec 1 msec
8 2001:23::3 0 msec 0 msec 1 msec
9 2001:13::1 1 msec 1 msec 0 msec
10 2001:12::2 0 msec * 1 msec
11 2001:23::3 1 msec 1 msec 1 msec
12 2001:13::1 1 msec 1 msec 1 msec
13 2001:12::2 1 msec 1 msec 1 msec
14 2001:23::3 1 msec 1 msec 1 msec
15 2001:13::1 1 msec 1 msec 1 msec
16 2001:12::2 1 msec 2 msec 1 msec
17 2001:23::3 1 msec 1 msec 2 msec
18 2001:13::1 1 msec 1 msec 1 msec
19 2001:12::2 1 msec 1 msec 2 msec
20 2001:23::3 1 msec * 2 msec
21 2001:13::1 1 msec 2 msec 1 msec
22 2001:12::2 2 msec 2 msec 1 msec
23 2001:23::3 2 msec 2 msec 1 msec
24 2001:13::1 2 msec 2 msec 1 msec
25 2001:12::2 2 msec 2 msec 1 msec
26 2001:23::3 1 msec 2 msec 2 msec
27 2001:13::1 2 msec 2 msec 1 msec
28 2001:12::2 1 msec 2 msec 2 msec
29 2001:23::3 2 msec 2 msec 2 msec
30 2001:13::1 2 msec * 3 msec
Destination not found inside max hopcount diameter.
traceroute
默认显示的最大跳数是30,该命令执行完毕并不表示数据包已经被丢弃。跳数占用8位,最大值是255,当该值减为零时,数据包才会被丢弃。
可以通过配置静态路由来实现全网全通,可一旦拓扑发生变化,比如Router-1
和Router-2
之间发生链路故障,将导致Router-1
与Router-2
之间不通。
尽管在事实上可以通过Router-3
中转,但静态路由不会根据拓扑的变化自动调整路由表。接下来介绍的动态路由协议可以自动调整路由表。
动态路由协议
前面介绍了直连路由、静态路由和默认路由的配置。
通过静态路由虽然可以实现网络的互联,但如果网络规模很大,假设有100台路由器,101个网络,每台路由器上有两个直联网络,那么需配置静态路由的条目是100(101-2)=9900条,通过手动配置几乎无法实现。
另外,当网络出现变化时,静态路由也不能很好地反映拓扑变化,这时就需要使用动态路由协议。
静态路由与动态路由的比较
静态路由是由管理员在路由器中手动添加的路由条目。
除非网络管理员干预,否则静态路由不会发生变化。
由于静态路由不能对网络的改变做出反应,因此一般用于网络规模不大、拓扑结构固定的网络中。
静态路由的优点是简单、高效、可靠。
动态路由是网络中的路由器相互之间通信,传递路由信息,并利用收到的路由信息更新路由表的过程。
收到路由更新信息后,路由器会重新计算路由,并发出新的路由更新信息。
这些信息在网络中传送,引起各路由器执行路由算法,并更新各自的路由表,以动态地反映网络拓扑变化。
动态路由适用于网络规模大、网络拓扑复杂的网络。
当然,各种动态路由协议会不同程度地占用网络带宽和CPU资源。
动态路由 | 静态路由 | |
---|---|---|
配置的复杂性 | 网络规模的增加对配置的影响不大 | 随着网络规模的增加,配置越来越复杂 |
对管理员的要求 | 相对较高 | 相对较低 |
拓扑改变 | 自动适应拓扑的改变 | 需要管理员手动干预 |
适用环境 | 简单和复杂网络均可 | 简单的网络 |
安全性 | 较低 | 较高 |
资源使用 | 使用cpu、内存、额外带宽 | 不使用额外的资源 |
链路状态路由协议
链路状态路由协议也称为最短路径优先协议,链路状态路由协议使用的算法是最短路径优先(Shortest Path First,SPF
)算法,有时也称Dijkstra
算法。
链路状态路由协议一般要维护3个表:邻居表,用来跟踪直接连接的邻居路由器;拓扑表,保存整个网络的拓扑信息数据库;路由表,用来维护路由信息。
链路状态路由器维护着远端路由器及其互连情况的全部信息,路由选择算法根据拓扑数据库执行SPF
算法。
链路状态路由协议不易出现路由环路问题。
常见的动态路由协议
OSPF
20世纪80年代中期,由于RIP
已不能适应大规模异构网络的互联,所以开放式最短路径优先(Open Shortest Path First,OSPF)
随之产生。
OSPF
是IETF
的内部网关协议工作组为IP
网络开发的一种路由协议。
OSPF
是一种基于链路状态的路由协议,需要每个路由器向其同一管理域中的所有其他路由器发送链路状态通告信息。
OSPF
的链路状态通告信息中包括接口信息、度量值和其他一些参数。
运行OSPF
的路由器首先必须收集所有的链路状态信息,并以本路由器为根,使用SPF
算法算出到每个节点的最短路径。
BGP
BGP
是为TCP/IP
互联网设计的外部网关协议,用于在多个自治系统之间传递路由信息。
它既不是纯粹的链路状态算法,也不是纯粹的距离矢量算法,各个自治系统可以运行不同的内部网关协议,不同的自治系统通过BGP
交换网络可达信息。
BGP
的配置较复杂,是运营商级的路由协议。
OSPFv3
OSPF
是典型的链路状态路由协议。OSPFv3
用于在IPv6
网络中提供路由功能,是IPv6
网络中主流的路由协议。
OSPFv3
虽在工作机制上与OSPFv2
基本相同,但并不向下兼容OSPFv2
,不支持IPv4
协议。
-
OSPFv3
与OSPFv2
的相同点
OSPFv3
在协议设计思路和工作机制与OSPFv2
基本一致,两者具有的相同点如下所示。- 报文类型相同,也有5种类型的报文:
Hello、DBD、LSR、LSU、LSAck
。 - 区域划分相同。
LSA
泛洪和同步机制相同。- 为了保证
LSDB
内容的正确性,需要保证LSA
的可靠泛洪和同步。 - 路由计算方法相同:采用最短路径优先算法计算路由。
- 邻居发现和邻接关系形成机制相同。
DR
选举机制相同:在NBMA
和广播网络中需要选举DR
和BDR
。
- 报文类型相同,也有5种类型的报文:
-
ospfv3
与ospfv2
的不同点
为了能在IPv6
环境中运行,OSPFv3
对OSPFv2
做出了一些必要的改进,使OSPFv3
可以独立于网络层协议,而且后续只要稍加扩展就可以适应各种协议。
这为未来可能的扩展预留了充分的空间。OSPFv3
与OSPFv2
的不同主要表现在以下几个方面。
- 基于链路的运行:
OSPFv2
是基于网络运行的,两个路由器要形成邻居关系,则必须在同一个网段。OSPFv3
是基于链路运行的,一个链路可以划分为多个子网,节点即使不在同一个子网内,也可以形成邻居关系。 - 使用链路本地地址:
OSPFv3
的路由器使用链路本地地址作为发送报文的源地址。一个路由器可以学习到这个链路上相连的所有其他路由器的链路本地地址,并使用这些链路本地地址作为下一跳来转发报文。 - 通过Router ID唯一标识邻居:
在OSPFv2
中,当网络类型为点到点或者通过虚链路与邻居相连时,路由器通过Router ID
来标识邻居路由器。当网络类型为广播或NBMA
时,则通过邻居接口的IP
地址来标识邻居路由器。OSPFv3
取消了这种复杂性,即无论对于何种网络类型,都通过Router ID
来唯一标识邻居。Router ID
和Area ID
仍然采用32位长度。 - 认证的变化:
OSPFv3
协议本身不再提供认证功能,而是通过使用IPv6
提供的安全机制来保证自身报文的合法性。 - 报头的不同:与
OSPFv2
报头相比,OSPFv3
报头长度从24字节变成16字节,去掉了认证字段,但加了Instance ID
字段。Instance ID
字段用来支持在同一条链路上运行多个实例,且只在链路本地范围内有效,如果路由器接收到的Hello
报文的Instance ID
与当前接口配置的Instance ID
不同,将无法建立邻居关系。 - 组播地址的不同:
OSPFv3
的组播地址为FF02::5
和FF02::6
-
实验:配置
ospfv3
-
1.
router-1
的配置如下:Router-1(config)# ipv6 router ospf 1 启用OSPFv3协议,这里的1代表进程号,只具有本地意义 Router-1(config-rtr)# router-id 1.1.1.1 OSPFv3中每台路由器的Router ID不会自动根据IPv6地址产生,需要手动指定。路由器上若有IPv4的IP地址,也可不指定Router ID,Router ID由IPv4地址而来,生成的规则与OSPFv2相同 Router-1(config-rtr)#int e0/0 Router-1(config-if)# ipv6 ospf 1 area 0 OSPFv3不同于OSPFv2,不是在路由进程下通告所有的直连网络,而是在接口通告这个接口。这里的1代表OSPF进程号,其值需要与前面ipv6 router ospf命令配置的进程号一样。area 0代表该接口所在的OSPF区域。后面还可以跟Instance ID,若不设置,则默认是0 Router-1(config-if)#int e0/1 Router-1(config-if)# ipv6 ospf 1 area 0 Router-1(config-if)#int loop 0 Router-1(config-if)# ipv6 ospf 1 area 0
-
2.
router-2
的配置如下:Router-2(config)#ipv6 router ospf 1 这里的1同样只具有本地意义 Router-2(config-rtr)# router-id 2.2.2.2 Router-2(config-rtr)#int e0/0 Router-2(config-if)#ipv6 ospf 1 area 0 Router-2(config-if)#int e/1 Router-2(config-if)#ipv6 ospf 1 area 0 Router-2(config-if)#int loop 0 Router-2(config-if)#ipv6 ospf 1 area 0
-
3.
router-3
的配置如下:Router-3(config)#ipv6 router ospf 1 Router-3(config-rtr)#router-id 3.3.3.3 Router-3(config-rtr)#int e0/0 Router-3(config-if)#ipv6 ospf 1 area 0 Router-3(config-if)#int e0/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
-
4.测试。配置完成后,在
Router-1、Router-2、Router-3
上任意ping
图中标出的所有IPv6
地址,都可以ping
通。
在Router-3
上执行show ipv6 route
命令,路由条目显示如下:Router-3#show 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
-
第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`路由的下一跳地址和本路由器的外出接口,使用的仍然是邻居的链路本地地址。
第9行和第10行是`Router-2`环回接口的`OSPF`路由。
第15、16、17行是`Router-1`和`Router-2`互联网段的路由,这两条路由是等值链路,可以进行负载均衡。
断开某条链路,测试`OSPF`根据拓扑变化调整路由表的能力。会发现`OSPF`可以根据拓扑变化动态调整路由表,并且收敛的速度比较快。
路由选路
路由器默认根据数据分组中的目标`IP`地址进行选路,
路由器如何进行选路:一个目标地址被多个目标网络包含时;
一个目标网络的多种路由协议的多条路径共存时;
一个目标网络的同一种路由协议的多条路径共存时。
管理距离
管理距离(`Administrative Distance,AD`),是用来衡量路由可信度的一个参数。
管理距离越小,路由越可靠,这意味着具有较小管理距离的路由将优于较大管理距离的路由,管理距离的取值为0~255的整数值,0是最可信的,255是最不可信的。
如果一台路由器收到同一个网络的两个路由更新信息,那么路由器将把管理距离小的路由放入路由表中。
路由选路原则
-
最长匹配优先
如果一个目标地址被多个目标网络包含,那么它将优先选择最长匹配的路由。
比如`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
-
管理距离最小优先
当一个目标网络的多种路由协议的多条路径共存时,将按照下列顺序进行选路。
在子网掩码长度相同的情况下,路由器优先选择管理距离小的路由。
Router-3
通过RIPng
学到了2001:12::/64
的路由,又配置了OSPFv3
路由,Router-3
通过OSPF
也学到了2001:12::/64
的路由。
由于RIP
的管理距离是120,OSPF
的管理距离是110,对于同样的路由条目,管理距离小的路由进入路由表,管理距离大的路由被抑制。
在Router-1
和Router-2
环回接口下,输入ipv6 ospf network point-to-poin
t命令,恢复环回口的前缀路由。Router-1
和Router-2
环回接口的路由前缀长度都变成了64位。
- 度量值最小优先
当一个目标网络同一种路由协议的多条路径共存时,将根据度量值进行选路。
如果路由的子网掩码长度相同,管理距离也相等(这往往是一种路由协议的多条路径),接下来比较的就是度量值。
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。
比较从两处学来的路由:前缀长度相同,管理距离也相同。
接下来比较的就是度量值,度量值小的路由进入路由表,度量值大的跳由被抑制。
留言