15

据我所知,当一个路由器提供另一个旧信息时,就会发生计数到无穷大,该旧信息继续通过网络传播到无穷大。从我读到的内容来看,这肯定会在删除链接时发生。

在此处输入图像描述

所以在这个例子中,Bellman-Ford 算法将为每个路由器收敛,它们彼此都有条目。R2 会知道它可以以 1 的成本到达 R3,R1 会知道它可以通过 R2 以 2 的成本到达 R3。

如果 R2 和 R3 之间的链路断开,则 R2 将知道它不能再通过该链路到达 R3,并将其从表中删除。在它可以发送任何更新之前,它可能会收到来自 R1 的更新,该更新将通告它可以以 2 的成本到达 R3。R2 可以以 1 的成本到达 R1,因此它将更新一条到R3 通过 R1 的成本为 3。R1 稍后将接收来自 R2 的更新,并将其成本更新为 4。然后它们将继续相互提供不良信息,直至无穷大。

我在几个地方看到的一件事是,除了链接脱机之外,可能还有其他原因导致无穷大,例如更改链接的成本。我开始考虑这个问题,据我所知,在我看来,增加链接的成本可能会导致问题。但是,我不认为降低成本可能会导致问题。

例如,在上面的示例中,当算法收敛时,R2 有一条到 R3 的路由,成本为 1,而 R1 有一条经过 R2 到 R3 的路由,成本为 2。如果 R2 和 R3 之间的成本增加到5. 那么这将导致同样的问题,R2 可以从 R1 获得更新,通告成本 2,并通过 R1 将其成本更改为 3,然后 R1 将其通过 R2 的路由更改为成本 4,依此类推。但是,如果融合路由的成本降低,则不会引起变化。它是否正确?可能导致问题的链接之间的成本增加,而不是成本降低?还有其他可能的原因吗?让路由器下线和链接出去是一样的吗?

4

4 回答 4

28

看看这个例子:

在此处输入图像描述

路由表将是:

    R1   R2    R3
R1  0    1     2
R2  1    0     1
R3  2    1     0

现在,假设 R2 和 R3 之间的连接丢失(您可能线路断开或它们之间的中间路由器掉线)。

在发送信息一次迭代后,您将获得以下路由表:

    R1   R2    R3
R1  0    1     2
R2  1    0     3
R3  2    3     0

发生这种情况是因为 R2、R3 不再连接,因此 R2“认为”它可以通过 R1 将包重定向到 R3,R1 的路径为 2 - 因此它将获得权重为 3 的路径。

在一次额外的迭代之后,R1 “看到” R2 比以前更昂贵,因此它修改了它的路由表:

    R1   R2    R3
R1  0    1     4
R2  1    0     3
R3  4    3     0

依此类推,直到它们收敛到正确的值 - 但这可能需要很长时间,特别是如果 (R1,R3) 很昂贵。
这被称为“计数到无穷大”(如果w(R1,R3)=infinity并且是唯一的路径 - 它将永远继续计数)。


请注意,当两个路由器之间的成本上升时,您将遇到同样的问题(假设w(R2,R3)在上面的示例中上升到 50)。同样的事情也会发生 -R2将尝试路由到R3viaR1而不“意识到”它也依赖于它(R2,R3),并且一旦找到正确的成本,您将获得相同的第一步并收敛。
但是,如果成本下降——这不会发生,因为新成本比当前成本更好——路由器R2将坚持使用相同的路由并降低成本,并且不会尝试通过路由R1

于 2012-11-23T06:17:21.623 回答
2

根据维基百科:

RIP 使用带有毒性反转技术的水平分割来减少形成循环的机会,并使用最大跳数来解决“计数到无穷大”问题。这些措施避免了在某些(但不是全部)情况下形成路由环路。增加保持时间(在路由撤回后的几分钟内拒绝路由更新)几乎可以避免在所有情况下形成环路,但会导致收敛时间显着增加。

最近,已经开发了许多无环距离矢量协议——著名的例子是 EIGRP、DSDV 和 Babel。它们在所有情况下都避免了环路形成,但会增加复杂性,并且由于 OSPF 等链路状态路由协议的成功,它们的部署速度已减慢。

http://en.wikipedia.org/wiki/Distance-vector_routing_protocol#Workarounds_and_solutions

于 2014-07-20T18:50:03.413 回答
1

这不承认问题的贝尔曼-福特算法部分,但这是一个简化的答案。开始。

注意原始海报的图像。有R1、R2、R3;分别代表路由器 1、2 和 3。

每条链路花费 1,每跳花费 1。跳两台路由器(例如:R1 到 R3)需要花费 2。

每个路由器都会跟踪成本并更新信息。然而,如果有一个缺失值(例如,路由器之间的链路缺失),跳数将被删除,并在路由表更新时由另一个路由器填充。

例子:

如果路由器 3 到路由器 2 的链路断开,路由器 2 将从它的表中删除该路由。路由器 1 仍然认为需要两跳才能到达路由器 3。这会被复制到路由器 2,现在两个路由器都认为需要两跳才能到达路由器 3。

路由器 1 做了一些简单的数学运算,“如果我需要一跳才能到达路由器 2,而路由器 2 需要两跳才能到达路由器 3,那么我应该需要三跳才能到达路由器 3。太棒了!” 路由器 2 执行类似的数学运算,并在其路由中添加一跳,依此类推。

这就是循环的工作方式。

于 2014-03-09T02:52:34.127 回答
0

按住:

  • 随着度量的增加,延迟传播信息

限制:

  • 延迟收敛 回环避免
  • 路由通告中的完整路径信息
  • 循环的显式查询(例如 DUAL) 水平分割
  • 永远不要通过下一跳来宣传目的地
    • A 不向 B 宣传 C
  • Poison reverse:在通过下一跳广告目的地时发送负面信息
  • A 以 ∞ 的度量向 B 宣传 C
    • 限制:仅适用于大小为 2 的“循环”
于 2016-01-18T20:41:14.640 回答