路由,是一个寻找抵达各个目的地的路径的过程。该过程中会创建一个叫做"路由表"的东西,路由器会根据路由表来决定如何转发数据包。路由算法会决定将数据包通过哪个路由传输到目的地。
路由算法可以分为三大类:
- 自适应算法(adaptive algorithms)
- 非自适应算法(non-adaptive algorithms)
- 混合算法(hybrid algorithms)
自适应路由算法(Adaptive Algorithms)
自适应算法会在网络拓扑或流量负载发生变化时改变路由选择(routing decisions),因此也被称为动态路由。该路由方式会依赖当前拓扑、网络负载、延迟等动态信息来调整路由。优化参数包含距离、跳数、预计传输时间等。
自适应算法可以进一步细分为:
- 孤立(Isolated):在该方法中,每个节点都只使用自己拥有的信息来调整路由,而不关心其他节点拥有的信息,发送数据的节点对其他链路一无所知。该方案的缺点是数据包可能会被发往一个正处于拥塞状态的网络,带来更大的延迟。算法有:Hot potato 路由和 backward learning。
- 中心化(Centralized):该方法中,一个中央节点拥有网络的所有信息,并作出所有的路由决策。这么做的优点是只需要有一个节点保存网络的全部信息,坏处是该节点一旦挂了网络就挂了。链路状态算法就被称作是一个中心化算法,因为其需要考虑网络中每一条链路上的开销。
- 分布式(Distributed):该方法中,每个节点都会从自己的邻居那里获取网络信息,根据这些信息来转发数据包。这么做的缺点是,如果网络状态在两次信息更新的间隔中发生了变化,那么在这个变化过程中发送的数据包就会有比较大的延迟。该类算法通常会计算源地址和目的地址之间的最小开销路径。
优点
- 动态:自适应算法能够根据网络状态动态调整路由,选择更好的路径,带来更好的性能、更大带宽和更低的延迟
- 负载均衡:自适应算法能够在多个路径上分摊网络流量,避免拥塞,高效利用多个链路;
- 失效容忍(Fault Tolerance):自适应路由算法可以让数据包绕开失效的网络部分完成路由,增强可用性和可靠性;
- 更高性能:通过选择更短、更低拥塞的路径来实现更好的网络性能
缺点
- 复杂:相较于非自适应算法更加复杂,实现和维护更困难;
- 额外开销:算法需要更强的算力和内存,增加资源开销;
- 路由环路:有时会产生路由环路,导致数据包永远无法抵达目的地;
- 延迟:为每个数据包计算最短路径需要消耗时间,可能导致更大的延迟
非自适应路由算法(Non-Adaptive Algorithms)
该类算法不会自己修改路由——路由器中的路由都是预先计算好并下载进路由器的,因此也被称作 "静态路由" 。
该类算法可进一步细分为:
- 洪泛(Flooding):该技术会将入向数据包从所有接口发出(除了传入该数据包的接口)。这么做的问题是数据包可能会被环路路由,节点可能会多次收到相同的数据包,但该问题可以通过序列号、跳数和生成树解决。
- 随机走动(Random walk):该方法中,每个节点都会将数据包随机发给自己的邻居。由于通常都会选排队最短的链路发送数据包,因此该方法的鲁棒性很强。
优点
- 简洁:更好实现也更好维护,能够降低网络基础设施的复杂度;
- 开销低:只需要很少的运算资源;
- 更少的路由环路;
- 低延迟
缺点
- 低效:可能会选择非最优路径发送数据。带来拥塞、延迟等;
- 不灵活:无法根据网络状态进行调整;
混合算法
该类算法混合了自适应和非自适应算法 —— 混合算法方案将网络划分为多个区域,在每个区域中使用适合的算法。混合算法可以进一步划分为:
- 链路状态(link-state):该方法中,每个路由器会为网络创建一个详细而完整的地图,然后把该地图和其他所有的路由器共享。该方法可实现更精准高效的路由选择;
- 距离向量(Distance vector):该方法中,每个路由器都会维护一个表,该表包含了到达网络中每个节点的距离和方向信息。该表会和网络中的所有路由器共享。该方法的弊端是可能导致路由环路。
链路状态路由
- 每个路由器都会和网络中的所有其他路由器共享自己邻居的信息;
- 通过洪泛向所有路由器共享自己拥有的关于邻居的信息;
- 只在信息发生变化时再次共享信息;
- 使用 Dijkstra 算法构造路由表;
- 问题:洪泛会带来较大的流量。洪泛的无限环路问题可以通过 TTL 解决
距离向量路由
- 路由器会计算自己和目的地之间的距离(跳数);
- 路由器会向自己的邻居共享网络信息,同时根据邻居共享的信息更新自己的路由表;
- 以相同的时间间隔和邻居共享信息;
- 使用 Bellman-Ford 算法制作路由表;
- 问题:
- 无限计数问题(Count to infinity problem):可以通过分裂视野(Splitting horizon)的方法来解决。主要思路是路由器不将接收到的路由信息送回传入信息的接口;
- 好消息传播的快,坏消息传得慢;
路由和洪泛的区别
路由 | 洪泛 |
---|---|
需要路由表 | 无需路由表 |
可能得到最短路径 | 总是得到最短路径 |
不那么可靠 | 更可靠 |
流量少 | 流量很大 |
没有重复包 | 可能会出现重复包 |