在一个IP网络中,路由(Routing)是个非常非常基本的概念。网络的基本功能,是使得处于网络中的两个IP节点能够互相通信,而通信实际上就是数据交互的过程,数据交互则需要网络设备帮助我们来将数据在两个通信节点之间进行传输。当路由器(或者其他三层设备)收到一个IP数据包,路由器会找出报文中的IP头里的目的IP地址,然后拿着目的IP地址到自己的路由表(Routing Table)中进行查找,找到“最匹配”的路由条目后,将数据包根据路由条目所指示的出接口或下一跳IP转发出去,这就是路由(Routing)。
而每台路由器都会在本地维护一个路由表,路由表中装载着路由器通过各种途径获知的路由条目(Routes),每一条路由条目由路由前缀(路由所关联的目的网络号)、路由信息来源、出接口或下一跳IP、优先级、开销等信息元素构成。路由器通过直连、静态的或者动态的方式获取路由条目并维护自己的路由表,路由表是每台支持路由功能的设备进行数据转发的依据和基础,是一个非常重要的概念,任何一台支持路由功能的设备要执行数据转发或路由的动作,就必须拥有及维护一张路由表。
上面已经说了,路由器是依赖自己维护的路由表来进行数据转发的,而路由表又是由许多路由条目构成的,路由器要将数据转发到目的地就必须有路由。一台路由器可以从多种来源学习到路由条目:
直连路由
路由器在初始启动后,如果我们为其接口配置IP地址,并且接口的物理及协议的状态都为UP,则路由器能够自动地学习该接口的网络号,将这条直连路由装载进路由表,这其实很好理解,因为这是我“家门口”的网络嘛,无需干预,自动学习。
静态路由
直连网络能够自动学习,可是非直连网络可就无法自动学习了,那么一种最简单的方式,就是通过手工配置的方式为路由器创建静态的路由表项,这叫静态路由,静态路由由于其是静态手工配置,因此可管理性非常高,但是也有明显的缺陷,因为你要到一个目的地,就必须做一条静态路由的配置,那么如果网络特别庞大、设备数量特别多呢?工作量就相当大了,这是低效且不切实的;再者静态路由无法根据网络拓扑的变更做出动态的感知,因此当网络发生变化时,管理员可能不得不重新配置或调整静态路由。因此,我们迫切需要一种动态的机制,来帮助路由器更加灵活的维护路由信息。
根据作用的范围,路由协议可分为:
内部网关协议(Interior Gateway Protocol,简称IGP):在一个自治系统内部运行
外部网关协议(Exterior Gateway Protocol,简称EGP):运行于不同自治系统之间
所谓的AS自治系统指的就是,一个独立自治的、自我管理的路由选择域。
根据使用的算法,路由协议可分为:
距离矢量协议(Distance-Vector):包括RIP和BGP。其中,BGP也被称为路径矢量协议(Path-Vector)
链路状态协议(Link-State):包括OSPF和IS-IS
我们先初步认识一下距离矢量路由协议。
动态路由协议,大家可以理解为赋予了路由器一种“语言”交流能力。在静态路由环境下,路由器之间都互相不交流的,比较闷骚。但是一旦激活了动态路由协议,路由器之间就能够进行互相的通告和学习。
在上图中,初始情况下,R2是无法知道远程网络、R1的直连1.1.1.0/24的,在R1和R2激活了距离矢量的动态路由协议后,R1将自己家门口的路由1.1.1.0/24通告给R2,在通告路由的同时,还告诉R2你要前往1.1.1.0/24所需花费的“代价,或成本”,这样一来R2就能动态的从R1学习到这条路由并且装载进路由表。于是当R2要发送数据去往1.1.1.0/24的时候,就会将数据包丢给下一跳路由器、也就是路由的通告者R1。这就是所谓的距离矢量。最具代表性的距离矢量路由协议是RIP,RIP是一个有着悠久历史的路由协议,简单、小巧,但是也存在很大局限,这使得它几乎很少在现今的网络环境中被使用。但是经典毕竟是经典,从它入手,我们将更快速的理解动态路由协议。
使用距离矢量路由协议的路由器并不了解网络的拓扑。该路由器只知道:
自身与目的网络之间的距离,应该往哪个方向或使用哪个接口转发数据包
实际上,运行距离矢量路由协议的路由器,是将自己的整张路由表更新给直连的其他路由器,彼此之间都进行更新,而路由器也会从其他直连路由器收到他们发来的路由更新,于是就进行一系列的路由收发行为,最终的结果是,大家都心满意足的填充好了自己的路由表。
距离矢量路由协议是直接将自己的路由表更新给直连路由器,并且路由器并不了解整个拓扑结构,这很容易在特定情况下产生诸如路由环路之类的问题(因此距离矢量路由协议定义了一系列防止环路的特性)。相比之下,链路状态路由协议则更新的不再是路由表或路由条目,而是对链路(接口)的描述等,通过链路状态信息的泛洪,路由器搜集这些链路状态信息并装载进链路状态数据库,随后运行特定的算法计算出一个无环的拓扑。因此运行链路状态路由协议的路由器是知晓网络的拓扑结构的。
链路状态路由协议应该说是目前业内IGP应用的主流,其中最具代表性的当属OSPF和ISIS。
1、RIP的更新过程
现在我们通过一个简单的环境,来看一下运行了RIP的路由器是如何交互路由信息的,并且网络中的路由器是如何完成路由信息的学习和收敛的。当然,这是一个微观的模拟过程,旨在帮助大家理解RIP的工作机制。
1)路由器初始启动
最初的网络发现:直连网络写入路由表,路由器能够自动学习直连路由并写入路由表,现在我们在所有路由器上都部署RIP。
2)初次交换路由信息
由于ABC都运行了RIP,因此他们都将自己的路由表通过广播(RIP版本1是广播发送,版本2是组播发送)的方式从所有激活了RIP的接口上更新出去。拿B来举例,它将自己的路由表更新出去,A和C都能够收到。A收到B传过来的路由表,它发现10.0.3.0路由自己没有,于是将这条路由学习过来,同时在为这条路由关联一个度量值:1跳,所谓1跳的意思是,A要到达10.0.3.0这个网络,需要经过B这个路由器,这是一跳,一跳就是一台三层设备,RIP通过跳数作为路由的度量值。
经过这一轮学习,A能学到10.0.3.0,C能学到10.0.2.0,而B能够学习到A和C传来的10.0.1.0及10.0.4.0。
3)路由收敛完成
接下去又是一轮更新,所有路由器将自己的路由表发送给直连邻居。A就能学习到B更新过来的10.0.4.0路由,跳数为2跳,因为它要到10.0.4.0需要经过BC两台路由器(实际上他并不知道要经过谁,RIP只是单纯的做个加法而已)。这样一来,所有的路由器,都拥有到达全网各个角落的路由了。我们把这个称为,路由收敛完成了。
路由器收敛完成的标志
当所有路由表包含相同网络可达性信息
网络(路由)进入一个稳态
路由器继续交换路由信息
当无新路由信息被更新时收敛结束
网络在达到收敛前无法完全正常工作
2、RIP概述
RIP(Routing Information Protocols,路由信息协议)是历史悠久的内部网关协议,适用于小型网络,是典型的距离矢量协议;
RIP基于UDP,端口520;
华为设备上路由优先级为100;
定期更新整张路由表;依照传闻;距离矢量路由协议并不了解网络拓扑;
V2在V1的基础上做了如下改进:
3、RIP的Metric(度量值)
RIP以跳数(Hops)作为度量值,虽然简单,但是事实上是不够科学的。如下图:
R5本地有个直连网络100.0/24,它通过RIP将这个网络更新出来。R2及R4都能学习到这条路由,并且跳数为1。而R1能通过R2学习到这条路由,跳数为2;同时R1又能从R3学习到R4传递过来的100.0/24路由,跳数为3,这样一来,R1将收到两条到达同一个网络100.0/24的两条RIP更新,它会去比较这两条路由的metric,结果发现,从R2来的路由,metric也就是跳数要更小,因此R1将R2更新过来的路由装载进路由表,并且将R2设置为去往该网段的下一跳。
很明显,这是不合理的,因为虽然R1从R3-R4-R5这段路径去往100.0/24经过的设备更多,但是链路却都是1G带宽,而从R2这一侧走,链路的带宽却非常的低。但是很遗憾,RIP并无法不关心带宽的问题,它只将跳数作为路由的度量值,这就是它的短板之一。
在路由表中,能够查看到RIP路由的跳数:
4、RIP的防环机制
我们先来看一下路由更新环路的现象:
上图汇总,假设ABC都运行了RIP,并且网络已经收敛完成。现在C路由器的直连网段10.0.4.0发生故障,C检测到故障后,将10.0.4.0路由从路由表中擦除。
这时候,更新周期到了,ABC路由器都将自己的路由表更新给直连邻居。那么C路由器会收到B更新过来的路由,其中也包括10.0.4.0,这时候C把10.0.4.0学习过来并且装载进了路由表,同时关联metric为2跳(因为路由是从B学习过来的,而B自己是1跳)。
10.0.4.0路由继续在网络中随着更新周期的到来不断的被更新来更新去,然而事实上,10.0.4.0网络早就不存在了,这时候如果网络中有任何一个地方发送数据到10.0.4.0网络,这个数据将在网络中不断的打转,直到TTL递减为0。这就是环路。
环路是一个危害非常大的问题,一个健壮的路由协议应该有充分的机制去规避环路的问题,RIP也有相应的一系列机制来防止网络中出现环路。
定义最大度量以防止计数至无穷大
在上文的例子中,10.0.4.0路由被RIP在网络中传来传去,跳数不断的累加。RIP定义了一个最大跳数,15跳,当一条路由跳数为16跳时,这条路由被视为不可达,因此这就避免了路由被无休止的传递。当然,这事实上是个笨方法,因为它在规避环路的同时,也限制了RIP适用的网络规模,如果我的网络当真有15台以上的路由器串起来呢,这时候RIP就搞不定了。
水平分割规则
水平分割规则是距离矢量路由协议一个特点非常鲜明的机制。
当一台路由器,从一个接口收到一条路由更新,这台路由器将不再把这条路由从该接口再更新回去,这就是水平分割规则,RIP的环路避免很大程度上依赖于该规则。
毒性路由
另一个避免环路的机制是,路由中毒机制,上图中,C路由器一旦发现10.0.4.0的直连网络发生故障,它将立即发送一个路由更新,该更新包含10.0.4.0路由同时将跳数设置为16跳,这样其他路由器将接收这个路由更新并将故障路由从路由表中擦去。
毒性逆转
毒性逆转(Poison Reverse)的原理是,RIP从某个接口学到路由后,将该路由的开销设置为16(即指明该路由不可达),并从原接口发回邻居路由器。利用这种方式,可以清除对方路由表中的无用路由。毒性逆转可以防止产生路由环路的发生。
在上图中,如果C的10.0.4.0网络挂掉了,而B不再从C收到4.0的路由更新,它就有可能向C通告4.0的路由(暂不考虑水平分割规则),这样一来C就有可能将B作为4.0网络的下一跳,这就形成了环路。在B上开启了毒性逆转后,B从GE0/0/1口收到的RIP路由,它也会将路由从该接口更新回去,只不过跳数被设置成了16,这样C将不会使用这些路由。
同时配置水平分割和毒性逆转的话,只有毒性逆转生效。
5、RIP的配置
1.配置命令
启动RIP进程,并进入RIP配置视图
[Router] rip 1
在指定网段使能RIP(RIP只支持classful网络宣告)
[Router-rip-1] network 192.168.12.0
事实上这条命令将产生两个效果:1是network的这个接口将激活RIP,开始发送和侦听RIP消息;2是network的这个接口所在的网段会被
引入RIP并被RIP通告出去。
指定RIP的版本(默认为版本1)
[Router-rip-1] version 2
2.配置示例
R1的配置如下:
#完成接口IP的配置:
[R1] interface GigabitEthernet 0/0/0 [R1-GigabitEthernet0/0/0] ip address 192.168.12.1 24 [R1] interface GigabitEthernet 0/0/1 [R1-GigabitEthernet0/0/1] ip address 192.168.1.254 24
#在R1的GE0/0/0及GE0/0/1口上激活RIPv2:
[R1] rip 1 [R1-rip-1] version 2 #指定RIP的版本为版本2 [R1-rip-1] network 192.168.12.0 #在GE0/0/0口上激活RIP [R1-rip-1] network 192.168.1.0 #在GE0/0/1口上激活RIP
R2的配置如下:
#完成接口IP的配置:
[R2] interface GigabitEthernet 0/0/0 [R2-GigabitEthernet0/0/0] ip address 192.168.12.2 24 [R2] interface GigabitEthernet 0/0/1 [R2-GigabitEthernet0/0/1] ip address 192.168.23.2 24
#在R2的GE0/0/0及GE0/0/1口上激活RIPv2:
[R2] rip 1 [R2-rip-1] version 2 [R2-rip-1] network 192.168.12.0 [R2-rip-1] network 192.168.23.0
R3的配置如下:
#完成接口IP的配置
[R3] interface GigabitEthernet 0/0/0 [R3-GigabitEthernet0/0/0] ip address 192.168.23.3 24 [R3] interface GigabitEthernet 0/0/1 [R3-GigabitEthernet0/0/1] ip address 192.168.2.254 24
#在R3的GE0/0/0及GE0/0/1口上激活RIPv2
[R3] rip 1 [R3-rip-1] version 2 [R3-rip-1] network 192.168.2.0 [R3-rip-1] network 192.168.23.0
完成上述配置后,我们来查看及验证,首先查看R1的IP路由表:
[R1] display ip routing-table Route Flags: R - relay, D - download to fib ------------------------------------------------------------------------------ Routing Tables: Public Destinations : 12 Routes : 12 Destination/Mask Proto PreCostFlags NextHop Interface 192.168.1.0/24 Direct 0 0 D 192.168.1.254 GigabitEthernet0/0/1 192.168.1.254/32 Direct 0 0 D 127.0.0.1 GigabitEthernet0/0/1 192.168.1.255/32 Direct 0 0 D 127.0.0.1 GigabitEthernet0/0/1 192.168.2.0/24 RIP100 2 D 192.168.12.2 GigabitEthernet0/0/0 192.168.12.0/24 Direct 0 0 D 192.168.12.1 GigabitEthernet0/0/0 192.168.12.1/32 Direct 0 0 D 127.0.0.1 GigabitEthernet0/0/0 192.168.12.255/32 Direct 0 0 D 127.0.0.1 GigabitEthernet0/0/0 192.168.23.0/24 RIP 100 1 D 192.168.12.2 GigabitEthernet0/0/0 255.255.255.255/32 Direct 0 0 D 127.0.0.1 InLoopBack0 ……
从上面的输出,我们可以看到R1已经通过RIP学习到了两条路由,分别是192.168.2.0/24及192.168.23.0/24。当然为了使得PC1与PC2要能够正常通信,沿途的所有路由器都要有完整的路由表项,因此我们还需要检查检查R2及R3的路由表,重点看RIP路由:
[R2] display ip routing-table protocol rip Route Flags: R - relay, D - download to fib ------------------------------------------------------------------------------ Public routing table : RIP Destinations : 2 Routes : 2 RIP routing table status : <Active> Destinations : 2 Routes : 2 Destination/Mask Proto Pre Cost Flags NextHop Interface 192.168.1.0/24 RIP 100 1 D 192.168.12.1 GigabitEthernet0/0/0 192.168.2.0/24 RIP 100 1 D 192.168.23.3 GigabitEthernet0/0/1
R2也通过RIP学习到了两条路由,分别是192.168.1.0/24及192.168.2.0/24。 同理查看R3的路由表,确保R3能够学习到192.168.1.0/24的路由。如此一来,全网的路由就打通了,那么现在PC1与PC2是能够互相通信的。