距离向量算法(Distance Vector)详解

距离向量(Distance Vector,简称 DV)算法是计算机网络中一种经典的路由选择算法(Routing Algorithm),用于让网络中的路由器自动学习:

“到达每一个目标网络,应该经过哪个邻居,以及需要花费多少代价。”

它是早期互联网路由协议的核心思想,例如:

  • Cisco Systems 的早期路由实现

  • RIP(Routing Information Protocol)

与它对应的是另一类算法:

链路状态算法(Link State Algorithm,LS)

例如:

  • OSPF

  • IS-IS


1. 为什么需要距离向量算法?

假设有一个网络:

        2
   A -------- B
   |          |
 5 |          | 1
   |          |
   C -------- D
        3

每条边表示链路成本:

  • A-B:2

  • A-C:5

  • B-D:1

  • C-D:3

现在 A 想发送数据给 D。

A 有两个选择:

路径1:

A → B → D

成本:
2 + 1 = 3

路径2:

A → C → D

成本:
5 + 3 = 8

显然:

A → B → D

更优。

问题:

A 一开始怎么知道 B、C 到 D 的距离?

答案:

通过距离向量算法不断交换信息。


2. 什么是“距离”和“向量”?

距离向量包含两个概念:


2.1 距离(Distance)

距离表示:

到某个目标节点的代价是多少

例如:

A 的路由表:

目标 距离
B 2
C 5
D ?

A 不知道 D。


2.2 向量(Vector)

向量表示:

到所有目的地的距离集合

例如 B 告诉 A:

B 的距离向量:

目标      距离

A          2
C          4
D          1

实际上就是:

B = {A:2, C:4, D:1}

这就是一个距离向量。


3. DV 算法核心思想

一句话:

每个路由器只知道自己的邻居信息,然后通过邻居告诉它的信息,逐渐计算整个网络的最短路径。

它遵循一个非常重要的公式:

Bellman-Ford 方程

数学形式:

D_x(y) = min_v { c(x, v) + D_v(y) }

其中:

符号 含义
D_x(y) x 到 y 的最低成本
v x 的邻居
c(x, v) x 到邻居 v 的链路成本
D_v(y) 邻居 v 到 y 的距离

翻译成人话:

我到目标 y 的距离 = 我先走到某个邻居,再由邻居走到 y,选择最短的一条。


4. DV算法运行过程

继续刚才例子:

        2
   A -------- B
              |
              |1
              |
              D

初始化:

每个节点只知道自己和邻居。


第一步:初始化路由表

A:

目的 距离 下一跳
A 0 -
B 2 B

B:

目的 距离 下一跳
B 0 -
A 2 A
D 1 D

D:

目的 距离 下一跳
D 0 -
B 1 B

第二步:交换距离向量

B 告诉 A:

我到D距离=1

A 收到:

经过B:

A→B→D

成本:

2+1=3

于是 A 更新:

目标 距离 下一跳
D 3 B

现在 A 知道:

去D:
A→B→D

5. DV算法的特点

5.1 分布式(Distributed)

没有中心服务器。

例如:

        A

     /     \

    B       C

     \     /

        D

不存在:

       中央控制器
            |
   ----------------
   |      |       |
   A      B       C

每个节点自己计算。


5.2 只知道邻居信息

这是 DV 最大特点。

A 不知道:

B---C---D

完整结构。

A 只知道:

邻居告诉我的东西

例如:

B:

D距离=5

A相信B。


5.3 周期性交换

路由器定期发送:

我的距离向量如下:
--------------------------------

目标A  0
目标B  2
目标C  5
目标D  3

--------------------------------

邻居收到后重新计算。


6. DV算法中的“好消息传播快,坏消息传播慢”

这是距离向量最大的历史问题。

叫:

Count To Infinity(无穷计数问题)


假设:

A ---- B ---- C

成本:

A-B=1
B-C=1

正常:

A知道:

C距离=2

现在:

C突然挂了:

A ---- B    C ❌

C告诉B:

C不可达

B更新:

C=∞

但是:

A还不知道。

A告诉B:

我到C距离=2

B:

哦?
A可以到C?

那么:

B→A→C

距离:

1+2=3

于是:

B认为:

C=3

继续:

A收到:

B到C=3

认为:

A到C=4

于是:

A: C=4

B: C=5

A: C=6

B: C=7
...

不断增加。

这就是:

count to infinity

7. 如何解决这个问题?

7.1 定义有限无穷大

例如 RIP:

规定:

16跳 = 不可达

所以:

距离:

1
2
3
...

16 = infinity

7.2 Split Horizon(水平分割)

规则:

不向某个方向告诉从该方向学习来的路径。

例如:

A ---- B ---- C

B 从 A 学到:

C经过A

那么 B 不会告诉 A:

我可以经过A到C

避免环路。


7.3 Poison Reverse(毒性逆转)

更强:

直接告诉:

经过你的路线不可达

例如:

B告诉A:

C距离=∞

防止A认为:

B可以绕回来

8. DV算法和LS算法比较

距离向量 DV 链路状态 LS
思想 问邻居 广播全网
算法 Bellman-Ford Dijkstra
信息范围 邻居 整个网络
计算位置 分布式 每个节点独立计算
收敛速度
复杂度
典型协议 RIP OSPF

9. DV算法对应现实中的RIP

RIP:

Routing Information Protocol

核心:

  • 使用距离向量

  • 距离=跳数(hop count)

  • 最大15跳

  • 16表示不可达

例如:

A

 |
1跳

B

 |
2跳

C

 |
3跳

D

RIP认为:

A到D距离=3

10. DV算法完整流程总结

可以把一个路由器想象成:

┌─────────────────┐
│      路由器A      │
│                 │
│ 当前路由表        │
│                 │
│ D: 5 via B       │
│ C: 2 via C       │
└────────┬────────┘
         |
         |
周期交换距离向量
         |
         ↓

邻居告诉:

B:
D=3

C:
D=8


重新计算:

min(
 A→B→D,
 A→C→D
)

选择最短路径

更新路由表

11. 最核心的一句话理解

距离向量算法就是:

每个路由器像“问邻居打听路况”,只知道邻居告诉自己的距离,通过不断交换信息,利用 Bellman-Ford 公式逐渐找到到所有目的地的最低成本路径。

如果你已经理解了 TCP、MTU、分组交换这些网络基础,那么下一步非常推荐学习 OSPF 的链路状态算法(Link State),因为 DV 和 LS 是计算机网络路由协议中最核心的一组对比概念。