一、导言:构建互联网的关键要素
路由(Routing)与转发(Forwarding)是网络层的两大核心功能。
- 转发(Forwarding):根据目的地址与转发表选择输出端口。
- 路由(Routing):决定转发表应如何构建,即路径选择的过程。
二、转发表与路由表的区别
-
路由表(Routing Table)
- 由路由算法动态构建;
- 存储从“网络号”到“下一跳(next hop)”的映射;
- 用于生成转发表。
-
转发表(Forwarding Table)
-
在数据包真正转发时使用;
-
每行包含从网络号到输出接口及下一跳 MAC 地址的映射;
-
示例:
网络号 下一跳接口 下一跳MAC地址 10.0.0.0 eth0 00:1A:2B:3C:4D:5E 192.168.1.0 eth1 00:1A:2B:3C:4D:6F
-
三、网络视图与最短路径问题
将网络抽象为一个加权有向图:
- 节点(node)代表路由器;
- 边(edge)代表链路;
- 每条边的权值(cost)表示链路代价,如带宽、时延、跳数等。
目标: 找出任意两节点之间的最低代价路径。 例如:路径代价 = 所有边代价之和。
例: 若从 A → B 代价为 2,B → C 代价为 3,则路径 A→B→C 的总代价为 5。
静态配置方式存在以下缺陷:
- 无法处理节点/链路失效;
- 不支持动态拓扑变化;
- 假设链路代价恒定不变。
因此需采用 分布式、动态的路由协议。
四、两大路由协议类型
- 距离向量(Distance Vector)协议
- 链路状态(Link State)协议
五、距离向量算法(Distance Vector Algorithm)
(一)基本原理
- 每个节点维护一维向量,记录到其他所有节点的距离(cost);
- 每个节点仅与直接邻居交换该向量;
- 初始假设:节点已知与直接邻居的链路代价。
(二)工作过程
- 每隔固定时间 (T) 秒,每个路由器向邻居发送自己的距离表;
- 每个邻居据此更新自身的距离估计;
- 重复该过程直至网络收敛。
该算法本质上是 Bellman-Ford 算法 的分布式实现。
(三)示例:节点 A 的初始与最终路由表
初始表(仅邻居距离已知)
| 目的节点 | 代价 | 下一跳 |
|---|---|---|
| B | 1 | B |
| C | 4 | C |
| D | ∞ | - |
若通过 B 到 D 的代价为 2,则更新后:
| 目的节点 | 代价 | 下一跳 |
|---|---|---|
| D | 3 | B |
六、距离向量算法的缺陷:数到无穷(Count-to-Infinity)
(一)问题现象
当某条链路失效时,错误信息可能在网络中反复传播:
- 节点 A 通知 B:E 不可达(距离∞);
- B 收到 C 的更新(C 仍认为到 E 距离为 2),遂认为自己可达;
- A 再次根据 B 的更新恢复对 E 的可达;
- 形成循环,距离不断增长,直至达“无穷”。
(二)解决方案
-
设定“无穷”上限 例如在 RIP 协议中,无穷定义为 16 跳。
-
Split Horizon(水平分割) 节点不向某个邻居通告其通过该邻居学到的路径。
-
Split Horizon with Poison Reverse(毒性逆转) 节点向邻居通告路径时,明确标注该路径不可达(距离∞),防止环路。
七、RIP 协议(Routing Information Protocol)
-
最早的 IP 动态路由协议(起源于 BSD 1982);
-
版本:
- RIP v1: [RFC 1058]
- RIP v2: [RFC 2453]
-
特性:
- 链路代价单位为“跳数”;
- 无穷定义为 16;
- 使用 UDP 端口 520 进行更新;
- 每个更新报文可包含最多 25 条路由项。
八、链路状态路由(Link State Routing)
(一)核心思想
每个节点仅发布自己直接相连链路的信息,而非整张路由表。 这种信息称为 LSP(Link State Packet),包含:
| 字段 | 含义 |
|---|---|
| Node ID | 发送者标识 |
| Link Cost | 到每个邻居的链路代价 |
| SEQNO | 序列号(用于检测新旧) |
| TTL | 存活时间 |
(二)可靠泛洪(Reliable Flooding)
-
每个节点存储来自每个节点的最新 LSP;
-
收到新 LSP 时:
- 若是新的,则转发给除来源外的所有邻居;
-
周期性生成新的 LSP(序列号递增);
-
TTL 递减至 0 时丢弃。
示意: 若 LSP 到达节点 X,X 将其转发至除来源外的其他邻居。 这样整个网络最终都能获得完整拓扑信息。
九、最短路径计算:Dijkstra 算法
每个节点在收集完整拓扑(所有 LSP)后,执行 Dijkstra 算法构建路由表。 常见实现:
- OSPF(Open Shortest Path First)
- IS-IS(Intermediate System to Intermediate System)
这两种算法均被广泛应用于现代 IP 网络。
十、触发泛洪的情景
-
拓扑变化
- 链路或节点失效;
- 链路或节点恢复;
-
配置变化
- 链路代价调整;
-
周期性刷新
- 通常每 30 分钟刷新一次,以防数据损坏。
十一、拓扑变化检测机制
-
Beaconing(信标探测):
- 周期性发送 “hello” 消息;
- 若连续若干个周期未收到回复,即判定链路失效。
-
性能权衡:
- 检测速度越快 → 误报率与带宽占用越高;
- 检测间隔越长 → 响应更慢但资源消耗低。
十二、距离向量 vs. 链路状态 比较
| 维度 | 距离向量(DV) | 链路状态(LS) |
|---|---|---|
| 收敛速度 | 慢,可能出现数到无穷 | 快,拓扑变化响应迅速 |
| 鲁棒性 | 可能传播错误路径 | 路径计算更稳定 |
| 消息开销 | 定期广播整个表 | 仅更新变化部分 |
| 计算负担 | 低 | 较高(需运行 Dijkstra) |
| 实例 | RIP | OSPF, IS-IS |
十三、规模扩展:分层路由(Hierarchical Routing)
为了应对大型网络的可扩展性问题,采用分层结构:
- 将网络划分为多个 Area(区域);
- 区域间通过核心区域(Area 0)连接;
- 在 OSPF 中称为 “Areas”,在 IS-IS 中称为 “Levels”。
示例:
Area 0(核心区域) ├─ Area 1 ├─ Area 2 └─ Area 3每个区域内部运行独立的链路状态算法,区域间仅交换汇总路由。
十四、总结
- 转发 与 路由 分工明确;
- 距离向量协议(RIP) 简单易实现但收敛慢;
- 链路状态协议(OSPF、IS-IS) 更复杂但高效稳定;
- 层次化路由 是应对大规模网络的关键机制。