域内路由

发布于 作者: Ethan

一、导言:构建互联网的关键要素

路由(Routing)与转发(Forwarding)是网络层的两大核心功能。

  • 转发(Forwarding):根据目的地址与转发表选择输出端口。
  • 路由(Routing):决定转发表应如何构建,即路径选择的过程。

二、转发表与路由表的区别

  1. 路由表(Routing Table)

    • 由路由算法动态构建;
    • 存储从“网络号”到“下一跳(next hop)”的映射;
    • 用于生成转发表。
  2. 转发表(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。

静态配置方式存在以下缺陷:

  • 无法处理节点/链路失效;
  • 不支持动态拓扑变化;
  • 假设链路代价恒定不变。

因此需采用 分布式、动态的路由协议


四、两大路由协议类型

  1. 距离向量(Distance Vector)协议
  2. 链路状态(Link State)协议

五、距离向量算法(Distance Vector Algorithm)

(一)基本原理

  • 每个节点维护一维向量,记录到其他所有节点的距离(cost);
  • 每个节点仅与直接邻居交换该向量;
  • 初始假设:节点已知与直接邻居的链路代价。

(二)工作过程

  1. 每隔固定时间 (T) 秒,每个路由器向邻居发送自己的距离表;
  2. 每个邻居据此更新自身的距离估计;
  3. 重复该过程直至网络收敛。

该算法本质上是 Bellman-Ford 算法 的分布式实现。


(三)示例:节点 A 的初始与最终路由表

初始表(仅邻居距离已知)

目的节点 代价 下一跳
B 1 B
C 4 C
D -

若通过 B 到 D 的代价为 2,则更新后:

目的节点 代价 下一跳
D 3 B

六、距离向量算法的缺陷:数到无穷(Count-to-Infinity)

(一)问题现象

当某条链路失效时,错误信息可能在网络中反复传播:

  1. 节点 A 通知 B:E 不可达(距离∞);
  2. B 收到 C 的更新(C 仍认为到 E 距离为 2),遂认为自己可达;
  3. A 再次根据 B 的更新恢复对 E 的可达;
  4. 形成循环,距离不断增长,直至达“无穷”。

(二)解决方案

  1. 设定“无穷”上限 例如在 RIP 协议中,无穷定义为 16 跳。

  2. Split Horizon(水平分割) 节点不向某个邻居通告其通过该邻居学到的路径。

  3. Split Horizon with Poison Reverse(毒性逆转) 节点向邻居通告路径时,明确标注该路径不可达(距离∞),防止环路。


七、RIP 协议(Routing Information Protocol)

  • 最早的 IP 动态路由协议(起源于 BSD 1982);

  • 版本:

    • RIP v1: [RFC 1058]
    • RIP v2: [RFC 2453]
  • 特性:

    • 链路代价单位为“跳数”;
    • 无穷定义为 16;
    • 使用 UDP 端口 520 进行更新;
    • 每个更新报文可包含最多 25 条路由项。

(一)核心思想

每个节点仅发布自己直接相连链路的信息,而非整张路由表。 这种信息称为 LSP(Link State Packet),包含:

字段 含义
Node ID 发送者标识
Link Cost 到每个邻居的链路代价
SEQNO 序列号(用于检测新旧)
TTL 存活时间

(二)可靠泛洪(Reliable Flooding)

  1. 每个节点存储来自每个节点的最新 LSP;

  2. 收到新 LSP 时:

    • 若是新的,则转发给除来源外的所有邻居;
  3. 周期性生成新的 LSP(序列号递增);

  4. TTL 递减至 0 时丢弃。

示意: 若 LSP 到达节点 X,X 将其转发至除来源外的其他邻居。 这样整个网络最终都能获得完整拓扑信息。


九、最短路径计算:Dijkstra 算法

每个节点在收集完整拓扑(所有 LSP)后,执行 Dijkstra 算法构建路由表。 常见实现:

  • OSPF(Open Shortest Path First)
  • IS-IS(Intermediate System to Intermediate System)

这两种算法均被广泛应用于现代 IP 网络。


十、触发泛洪的情景

  1. 拓扑变化

    • 链路或节点失效;
    • 链路或节点恢复;
  2. 配置变化

    • 链路代价调整;
  3. 周期性刷新

    • 通常每 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) 更复杂但高效稳定;
  • 层次化路由 是应对大规模网络的关键机制。