在开始阅读前,可以先考虑以下问题,阅读后也可以来检验学习的效果:
- 静态路由和动态路由的区别,以及应用的场景。
- 为什么要有默认路由?
- 动态路由中距离矢量和链路状态矢量是怎么一回事?
- 为什么说 RIP V1 仅支持有类网络?
- RIP 的功能原理是什么?
- 为什么说 RIP 会出现成环的现象?
- 水平分割和毒性反转解决的是什么问题?
路由器
在之前关于路由器的介绍中,我们知道它是网络互联的核心设备,用于连接不同的网络,在网络之间转发 IP 数据报。对于路由器来说,路由表是其内部最为重要的构成组件。当路由器需要转发数据时,就会按照路由表和一定的匹配规则进行转发。对于路由表来说,一般有两种静态和动态这两种配置方式。下面将细化这一过程,分别讨论静态和动态路由使用场景,以及原理和配置。
回顾一下,对于一个路由器来说需要完成以下的工作:
- 识别数据包的目的地:通过匹配子网掩码,确定出数据包应该发往的网段。
- 确定路由信息的来源:当使用动态协议时,假如有多条路由可以到达某个网络,应该先评估将最优的那条添加到路由表中。
- 匹配路由:根据路由表选择最合适的路由条目。
- 维护和更新:拓扑的信息可能随时方法改变,需要自动的更新。
静态路由和动态路由的对比及应用场景
静态路由:
- 是网络管理员在路由器上手动配置的路由条目
- 当网络拓扑改变时,需要让管理员手动的更新路由条目
- 路由过程必须根据管理员的配置转发
动态路由:
- 当拓扑改变时,可以自动的更新路由条目。
- 通过交换和路由更新来学习和维护远端的路由。就是动态路由器定期会同步哥各个路由器之间的路由信息,保持一致。
- 路由器发现新的网络是通过共享路由表来实现的。
总结一下,静态路由将路由的转发完全交给管理员,在出现拓扑更新等情况,都是由管理员进行维护。而动态路由则相反,所有的转发,学习过程完全靠路由器自己。
静态路由-应用场景:
- 小型的网络-比如只有几台路由器
- 到达目的地只有单一路径时
- 当测试,排错等情况想快速建立一条路由时
- 作为默认路由使用:比如作为外网的输入
动态路由-应用场景:
-
大型的网络
-
当达到目的地有多条路径时
静态路由
在配置静态路由时,主要配置目的网段和下一跳地址,在配置前需要进行如下的分析:
静态路由的配置分析:
-
首先先统计网络个数
-
每个路由器需要配置的路由数目等于总网络数目减去本身连接的网络数目
-
目的网络位需要去的网络,也就是非直连的网络
-
下一跳为与自己直连路由器的接口地址
在为接口配置 IP 地址后,路由器就会生成两条默认路由-表示直连
Loopback 接口的作用主要是用于测试,当接收到数据时,会将数据自动返回来。
# 预配置命令
enable
configure terminal
line console 0
no exec-timeout
logging synchronous
no ip domain lookup
# R3 Router
Router(config)#hostname R3
# Configure 1.1.1.1/24, 12.1.1.1/24 IP
Router(config)#int e 0/0
Router(config-if)# ip addr 12.1.1.1 255.255.255.0
Router(config-if)# no shutdown
Router(config)#int lo 0
Router(config-if)# ip addr 1.1.1.1 255.255.255.0
Router(config-if)# no shutdown
# Configure Static Route
# Method1:
Router(config)#ip route 2.2.2.0 255.255.255.0 12.1.1.2
Router(config)#ip route 3.3.3.0 255.255.255.0 12.1.1.2
Router(config)#ip route 23.1.1.0 255.255.255.0 12.1.1.2
# Method2:边界配置默认路由比较省时间
Router(config)#ip route 0.0.0.0 0.0.0.0 12.1.1.2
// hostname R4
Router(config)#interface ethernet 0/0
Router(config-if)#ip address 12.1.1.2 255.255.255.0
Router(config-if)#no shutdown
Router(config-if)#exit
Router(config)#interface loopback 0
Router(config-if)#ip address 2.2.2.2 255.255.255.0
Router(config-if)#no shutdown
Router(config-if)#exit
Router(config)#interface ethernet 0/1
Router(config-if)#ip address 23.1.1.1 255.255.255.0
Router(config-if)#no shutdown
Router(config-if)#exit
# Configure Static Route
Router(config)#ip route 1.1.1.0 255.255.255.0 12.1.1.1
Router(config)#ip route 3.3.3.0 255.255.255.0 23.1.1.2
# The configuration of R5 is same as the R3
想象这样一种情况,假设到达 5.5.5.5/24 的网络,在 R4 配置静态路由时,可以通过 R6 和 R7 两条路径。
这时数据包在到达该网络时,该如何选择呢?
采用的原则如下:
- 首先通过 mask 匹配最长掩码
- 如果最长掩码一样,比较 AD,可以手动配置
- 当 AD 一样,可以比较 Metric
- 最后还一样的话,通过负载均衡来实现
动态路由
路由器之间可以通过路由协议,自主学习来获得的路由信息,这样的路由称为动态路由。使用路由协议动态构建路由表不需要人工参与,并能自动的适应网络状态的变化更新路由表,大型网络或状态变化频繁的网络通常会采用动态路由协议。
自制系统和分层路由
因特网的网络数量巨大,几百万个路由器相互相互连接在一起。要让一个路由器记录每个网络的信息是不可能的,而且许多机构并不愿意自己的网络内部细节对外暴露。基于以上的原因,因特网划分了许多个自制系统(Autonomous System)。
自治系统内部的路由通过内部网关协议(IGP)交换路由信息,典型的内部网关协议有 RIP 和 OSPF。
自治系统之间也需要交换路由信息,自治系统之间使用外部网关协议(EGP)交换路由信息,每个自治系统都会有边界路由器来完成这个任务,目前因特网使用的外部网关协议是 BGP。
动态路由协议一般分为如上图中这几种:
距离矢量路由协议:根据跳数来,选择跳数最小的。如 RIP 协议。EIGRP 会把跳数作为参考。
链路状态路由协议:通过自己计算和筛选怎么走(邻居表,拓扑表,路由表),如 OSPF,IS-IS 等。
RIP (距离矢量)
应用层协议,使用 UDP 传输,端口为 520。RIP 和 IGRP 已经被淘汰,因为它们仅支持有类路由协议。(就是不能划分子网的协议)
路由信息协议(RIP)是路由器生产厂商之间使用的第一个开放标准,是连接不同厂商设备使用最为广泛的共有协议。RIP 协议有两个版本,V2 版本比 V1 版本的基础上增加了一些拓展特性,如更新认证、路由汇总、无类路由、VLSM, 将广播改为组播等。
RIP 协议是基于距离矢量的路由状态协议。RIP 协议中,如果路由器 A 和 网络 B 直接相连,那么路由器 A 到网络 B 的距离就是 N + 1。如果从路由器 A 出发 到达网络 B 需要经过 N 个路由器,则路由器 A 到网络 B 的距离就是 N + 1。
RIP 认为距离最小的路径就是最好的路径。RIP 中的距离也称为 “跳数”,每增加一个路由器,跳数就加 1。
RIP 工作原理
- 每个路由器每隔 30s 给自己所有的邻居路由器广播 RIP 报文,报文的内容是这个路由器当前的路由信息。
- 收到邻居路由器的路由表信息后,更新自己的路由表,下次将更新后的路由表告诉自己的邻居
- 180s 没有收到某个路由器的路由表信息,就认为这个路由器出现故障,路由表中将所有以这个路由器为下一站的表项的距离修改为 16,表示不可达。再过 60s 依然没有回复,从路由表删除
当两个路由器共享一条链路或者在同一个物理网络中,就称它们为邻居
配置:
#三台路由器正常配置端口
# R1
# r1(config)#router rip
# 关闭自动汇总,汇总成主类 A,B,C 类的网络。
r1(config-router)#no auto-summary
r1(config-router)#version 2
r1(config-router)#network 12.0.0.0
r1(config-router)#network 1.0.0.0
r1(config-router)#network 13..0.0
# R2,R3 同理
# 排错命令
show ip rip database
show ip protocols/inc second
由于在向外通告网络时,存在 30s (默认)的时间差,这就有可能出现环路的现象。
比如在图中 R3 宣告自己的网络后,恰巧 Lo 0 接口端口,此时 R3 会立即将直接在路由表中删除 3.3.3.0 的网络。
但此时 R2 是不知道的,假设过了 10 s 后,到了 R2 该通告本身路由的情况,此时会组播发给 R1 和 R3.
而此时 R3 发现,R2 能到达 3.3.3.0 的网络,会将该网络加入自己的路由表,并且距离加一。
此时如果有数据包发送 3.3.3.0 的网络,就会在 R2 和 R3 之间一直传递。而随着下一通告周期的来临,R2 和 R3
的举例会一直增加,直到 16 在双方的路由表消失。
如何解决成环的问题:
-
限制最大距离:RIP 协议允许一条路径上最多包含 15 个路由器,距离的最大值为 16(表示网络不可达)
-
水平分割:路由器从某个接口接收到的更新信息不允许再从这个接口发回去。
- 如 R2 收到了 R3 中到达 3.3.3.0 网络的路由信息,在自己宣告时不会将到 3.3.3.0 的消息再告诉 R3.
但水平分割依然无法解决像第一个图中,有多条路径可达的情况。
这里的解决方法就是毒性反转:
实际上是一种改进的水平分割,当路由器从某个接口上接收到某个网段的路由信息后,并不是不往回发送信息了,而是将这个网段的跳数(距离)设为无限大,再发送出去。收到此种的路由信息后,接收方路由会立即抛弃该路由,而不是等到其老化时间到。
简单来说,逆转指的是对水平分割而言,原来是不发送,现在是发送。但是发送的是距离为 16 的信息,这样就表明该网络不可达,所以叫毒。
这里可以做一个实验,利用关闭水平分割,手动造成成环现象。
# 关闭 R1 e 0/0 接口的水平分割
R1(config-if)#no ip split-horizon
# 关闭 R2 e 0/0 接口的水平分割
R2(config-if)#no ip split-horizon
# 设置 R2 的 e0/0 为被动,禁止发送协议报文
R2(config-router)# passive-interface e 0/0
# 关闭 R2 的 loopback 0 口
# 设置 R2 的 e0/0 为主动
R2(config-router)#no passive-interface e 0/0
这时我们可以利用 show ip route
来观察,会发现 R1 和 R2 的跳数一直都会增加,增加到 16,全都消失
原因:
由于把 R2 的端口设置成被动,R1 收不到 R2 关闭了 lo 0 的消息。而且 R1,R2 的水平分割都已经被关闭。
这时 R2 会收到来自 R1 的它到 2.2.2.0 网络的跳数是 1,所以到 2.2.2.0 网络的跳数是 2。
由于 R2 已经无法通过直连到达 2.2.2.2。所以会更新自己的跳数。之后 R2 又会给 R1 发送到 2.2.2.2 的跳数是 2。
由于 R1 本身到 2.2.2.2 网络就是通过 R2,所以会更新自己的路由表跳数为 3。就这样以此类推直到到 16 结束。