在链路状态路由协议中使用 Dijkstra 算法。在距离矢量路由协议中使用了 Bellman-Ford 算法。我的问题是为什么我们使用两种不同的算法。为什么不只有一种算法?
Dijkstra 算法不能在负边缘上工作,但在路由中不能有任何负边缘。好的,但在有争议的情况下,假设出现故障可能会有任何负面影响。那么为什么不在这两个协议中使用 Bellman-Ford 呢?
在链路状态路由协议中使用 Dijkstra 算法。在距离矢量路由协议中使用了 Bellman-Ford 算法。我的问题是为什么我们使用两种不同的算法。为什么不只有一种算法?
Dijkstra 算法不能在负边缘上工作,但在路由中不能有任何负边缘。好的,但在有争议的情况下,假设出现故障可能会有任何负面影响。那么为什么不在这两个协议中使用 Bellman-Ford 呢?
链路状态和距离向量不是实际的路由协议,而是路由协议的类型。由于不同的环境有不同的要求,所以有不同的路由协议。Internet 路由协议 (BGP) 是一种距离矢量协议,因为它具有极强的可扩展性。此外,您不希望依赖来自其他公司的链接状态信息来路由您的流量。您基本上只想知道他们是否可以获得通往目的地的流量,以及他们是否比您自己和您连接到的其他系统更接近目的地。
Dijkstra 算法无法处理负边的事实在路由中不是问题。因为 Dijkstra 是一种贪心算法,它需要知道所有节点才能计算路径成本。在链路状态路由协议中,每个路由器都有一个网络的完整地图,它可以在该地图上执行 Dijkstra 算法来填充其路由表。
与 Dijkstra 不同,距离矢量路由协议中使用的 Bellman-Ford 分布式版本可以处理传入广告中可用信息的逐渐增加。
分布式 Bellman-Ford (BF) 和 Dijkstra 以相反的方向工作:BF 从路由信息的源(数据接收器)开始构建路径,而 Dijkstra 从数据发送方开始。
由于距离矢量协议从源头开始逐步工作,因此它们不能使用 Dijkstra,因此使用分布式 BF。没有什么原则,将防止链路状态协议使用BF,但(非分布式)BF具有立方的复杂性,而Dijkstra算法(如果实施正确的)是O(ñ ²日志 ñ)。
(由于方向不同,BF 和 Dijkstra 将使用一些非常奇怪的指标构建不同的路径——不符合 Sobrinho等渗条件的指标——但这种差异在实践中不太可能相关。)