路由算法
静态路由和动态路由
路由表的配置包含两种方式:静态路由和动态路由。
静态路由表示路由器的路由规则由人工进行手动配置,是写死的,每次想更改路由表时必须手动去更改。
动态路由规则根据 路由算法 动态地构建路由表,这里主要包含 RIP 和 OSPF 两种方式。
两种路由方式的具体对比如下表所示:
特点 | 静态路由 | 动态路由 |
---|---|---|
配置方式 | 手动配置 | 自动学习和适应 |
适用性 | 适用于小型网络或需要特定路由策略的情况 | 适用于大型、复杂的网络 |
稳定性 | 较稳定 | 可能更灵活,但较复杂 |
自动故障恢复 | 不支持自动故障恢复 | 支持自动故障检测和恢复 |
网络变化响应速度 | 静态,不会自动适应网络变化 | 自动适应网络变化,响应速度较快 |
管理复杂性 | 相对简单 | 较复杂,需要更多计算和资源 |
适用情况 | 较小规模的网络,特定路由策略需求 | 大型、复杂网络,需要动态适应 |
什么是路由算法
路由算法是网络通信中的一种机制,它决定数据包在计算机网络中从源地址传输到目标地址的路径。路由算法通过选择最佳路径来优化数据传输,确保数据有效且快速地传递。
路由算法的设计是为了实现以下目标:
- 最短路径选择:刚一个数据包经过当前机器时,路由算法通过计算路径的成本(如跳数、带宽、延迟等),能够选择从源到目标的最短或最优路径。
- 负载均衡:在网络拥堵时,将数据流量分散到多条路径上,以避免某一条路径过载。
- 快速收敛:当网络拓扑发生变化(如链路失败或新增路由器)时,路由算法能够快速调整并更新路由信息,确保网络稳定。
RIP 算法
RIP(Routing Information Protocol)是一种基于距离向量的路由协议,主要用于小型和中型网络中的内部网关协议。
距离向量
目标网络 | 距离(跳数) | 下一跳 |
---|---|---|
192.168.1.0/24 | 0 | A |
192.168.2.0/24 | 1 | B |
192.168.3.0/24 | 1 | C |
一个典型的距离向量(Distance Vector)可以表示为一个列表,其中每个条目包含以下信息:
- 目的地:目标网络或子网的地址。
- 距离:从当前路由器到达目标网络的代价,通常以跳数、延迟、带宽等度量标准表示。
- 下一跳:到达目标网络的下一跳路由器的地址。
注意
RIP 规定 最大跳数为 15,超过 15 则认为目标网络不可达。
距离向量算法
在距离向量算法中, 通过 周期性地 与相邻路由器 交换距离向量信息,每个路由器能够逐渐获得整个网络的拓扑信息,并更新其路由表 以选择最佳路径。
具体而言,工作流程如下:
- 初始化:每个路由器初始化其距离向量,只包含自己直接连接的网络,距离设为 0。
- 周期性更新:每个路由器周期性地将其距离向量广播给所有相邻的路由器。
- 接收和更新:每个路由器接收到相邻路由器的距离向量后,检查是否有新的或更短的路径。如果有,则更新自己的距离向量和路由表。
- 收敛:经过多次交换和更新后,所有路由器的距离向量和路由表最终会收敛到最优路径。
RIP 坏消息传得慢
假设一个路由器检测到它无法到达一个网络,这个信息可能需要比较长的时间才能被网络中的所有路由器感知到,这也是 RIP 的一个缺点。
举例说明:
假设有路由器 A、B、C 连接成一条线:A---B---C
。网络 X 连接到 C。
- 正常情况: A 知道通过 B 和 C 到达 X,跳数为 2。
- C 和 X 之间的连接断开:
- C 检测到 X 不可达。
- B 仍然会周期性地告诉 A,它可以通过 B 到达 X(因为 B 还不知道 C 和 X 之间的连接断开)。
- A 收到 B 的更新后,会更新自己的路由表,认为通过 B 到达 X 的距离变大(可能是通过其他路径,或者仍然通过 B,但距离变为无穷大之前的某个值)。
- 这个过程会重复多次,直到 A 最终确定 X 不可达。
最短路径计算方法
当路由器 $A$ 接收到来自相邻路由器 $B$ 发送的关于某个子网 $N$ 的距离向量 $V_{B}$ 时,它需要将 $V_{B}$ 中的跳数加一 然后与当前的到达子网 $N$ 的距离向量 $V_{A}$ 进行比较(需要加一的原因时从 $A$ 出发要经过 $B$,所以多了一跳),具体比较方式如下:
- 如果 $A$ 不存在到达子网 $N$ 的路由的话,直接添加 $V_{B}$ 进入路由表
- 如果 $V_{B}$ 的跳数小于 $V_{A}$ 的跳数的话,使用 $V_{B}$ 替换 $V_{A}$
以上过程使用的算法名称叫做 Bellman-Ford 算法,是一种寻找单源最短路径的算法,单源最短路径的意思是从一个结点出发到达其他结点的最短路径。这个算法不会直接考察,了解这个算法的名称即可。
OSPF 算法
OSPF(Open Shortest Path First)是一种基于链路状态的内部网关协议(IGP),广泛应用于中大型网络中。
OSPF 几乎不考察,这里主要了解以下几个小节的概念即可。
链路状态通告
路由器通过链路状态通告(LSA,Link State Advertisement)来了解其与邻居之间的链路状态。
在 RIP 路由算法中,路由器会定期将自己的距离向量发送给相邻的路由器。在 OSPF 中,也有类似的概念,不过这里传送的不是距离向量,而是链路状态通告。
路由器将其自身的状态和与邻居的链路状态信息打包成链路状态包(LSP,Link State Packet),并在网络中洪泛(flooding)传播。
每个 LSA 专注于描述一种类型的链路状态或网络信息。一个 LSA 包含的信息通常是:
- 路由器与某一特定链路的连接状态(如 Router LSA)。
- 某个网络的状态和与其相连的路由器信息(如 Network LSA)。
- 区域间或外部路由信息(如 Summary LSA 和 AS External LSA)。
链路状态数据库
链路状态数据库(LSDB,Link State Database)是 OSPF 协议中的一个关键组件,它存储了网络中所有链路状态通告(LSA)。通过 LSDB,每个路由器可以构建整个网络的拓扑图,并使用 Dijkstra 算法计算最短路径树。
这里举个例子方便大家理解 LSDB 的概念。 假设我们有一个简单的网络拓扑,包含 4 个路由器(R1, R2, R3, R4)和几个网络网段(NetA, NetB, NetC)。
NetA
/ \
[R1]-----[R2]-----[NetB]
| | |
| | |
[NetC] [R3]----[R4]
在链路状态算法收敛之后,某个路由器的 LSDB 可能是如下这种形式:
LSA 类型 | LSA ID | 路由器 ID | 链路 ID | 链路类型 | 路径成本 | 连接的路由器或网络 |
---|---|---|---|---|---|---|
Router | 1 | R1 | NetA | 广播链路 | 10 | R2 |
Router | 1 | R1 | NetC | 广播链路 | 5 | |
Router | 2 | R2 | NetA | 广播链路 | 10 | R1 |
Router | 2 | R2 | NetB | 广播链路 | 15 | R4 |
Router | 2 | R2 | R3 | 点对点链路 | 20 | R3 |
Router | 3 | R3 | R2 | 点对点链路 | 20 | R2 |
Router | 3 | R3 | R4 | 点对点链路 | 10 | R4 |
Router | 4 | R4 | NetB | 广播链路 | 15 | R2 |
Router | 4 | R4 | R3 | 点对点链路 | 10 | R3 |
链路状态路由算法
OSPF 中的链路状态路由算法的思想与 RIP 中的最短路径计算算法的思想类似,不过这里是使用 Dijkstra 算法来计算最短路径。 Dijkstra 算法使用 LSDB 中的信息来生成一棵最短路径树(SPT),确定从源节点到所有其他节点的最短路径。
对比
特性 | OSPF | RIP |
---|---|---|
协议类型 | 链路状态协议(Dijkstra 算法) | 距离矢量协议(Bellman-Ford 算法) |
路由度量 | 基于带宽的成本 | 基于跳数(最大 15 跳) |
拓扑视图 | 全局拓扑视图 | 仅相邻信息 |
收敛时间 | 快 | 慢 |
网络规模 | 适用于大型复杂网络 | 适用于小型网络 |
更新机制 | 事件驱动(LSA 泛洪) | 周期性(每 30 秒广播路由表) |
安全性 | 支持多种认证机制 | RIP v2 支持简单认证,RIP v1 无认证 |
配置和管理 | 配置复杂,适合大规模网络 | 配置简单,适合小规模网络 |
更新信息 | 发送链路状态变化 | 发送整个路由表 |
多路径支持 | 支持等价多路径路由(ECMP) | 支持但效果较差 |