距离向量算法(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 是计算机网络路由协议中最核心的一组对比概念。