计算机网络学习站

kp-014 · 03-网络层与路由

内部网关协议:RIP 与 OSPF

核心 约 30 分钟 RIPOSPF距离向量链路状态
我的进度:

注:本文基于模型知识整理,建议结合权威教材与 RFC 原文核对细节。

一句话定义

内部网关协议(Interior Gateway Protocol, IGP)在同一个自治系统内部交换路由信息,代表实现是距离向量路线的 RIP 与链路状态路线的 OSPF,二者分别以「听邻居转述」和「全网共享地图再本地算路」两种哲学求最短路径。

为什么重要

任何稍具规模的网络都不可能手写全部路由:几十台路由器的网络需要动态协议自动感知拓扑变化并收敛。RIP 与 OSPF 是理解所有动态路由协议的两块基石——后来 BGP 的路径向量思想也是对距离向量的改造。分清「交换计算结果」与「交换原始事实」的差异,是读懂一切路由协议设计的第一课。

前置知识

建议先读 kp-011《子网划分、CIDR 与路由聚合》,理解路由表条目、前缀匹配与路由聚合的含义;对图论中的最短路径概念有直觉即可,不要求会推导算法。

核心概念

  • 路由协议分类:按范围分域内 IGP 与域间 EGP(Exterior Gateway Protocol);按配置分静态路由与动态路由协议;动态协议再按算法分距离向量与链路状态两大流派。
  • 距离向量(distance vector):每台路由器周期性把整张路由表发给邻居,表里是「到各目的网络的距离」;邻居把收到的距离加一跳后更新自己的表。信息是转述的、逐跳放大的。
  • 链路状态(link state):每台路由器主动探测直连链路,用链路状态通告 LSA(Link State Advertisement)把「我与谁相邻、代价多少」可靠泛洪(flooding)给区域内所有路由器,人人持有相同的链路状态数据库 LSDB(Link State Database),再各自本地用 Dijkstra 算法计算最短路径树。
  • RIP 要点:度量是跳数,最大 15 跳,16 表示不可达,因此只适合小网络;默认每 30 秒向邻居广播完整路由表;存在坏消息传播慢问题,即计数到无穷(count to infinity)——链路故障后旧路由信息来回转手,距离逐次加一,直到爬到 16 才认定不可达,收敛极慢。
  • 水平分割与毒性逆转:水平分割(split horizon)规定「从某接口学来的路由不再从该接口通告出去」,切断来回累加的回路;毒性逆转(poison reverse)更激进,把学自某接口的路由回发时距离直接置 16,主动宣告不可达,加快坏消息传播。
  • OSPF 要点:用 Hello 报文发现并维持邻居;LSA 靠确认与重传实现可靠泛洪;全网 LSDB 保持一致;本地用 Dijkstra SPF 计算路由;链路代价 = 参考带宽 ÷ 接口带宽(默认参考带宽 100 Mbps),带宽越高代价越小。
  • 区域与 ABR:大网络划成多个区域(area),把 LSA 泛洪与 SPF 计算限制在区域内;骨干区域固定为 0.0.0.0,所有非骨干区域必须与骨干相连,跨区域流量统一经过骨干;区域边界路由器 ABR(Area Border Router)汇总区域间路由并隔离拓扑细节,控制 LSDB 规模。

公式与模型

OSPF 接口代价 = 参考带宽 ÷ 接口带宽,参考带宽默认 100 Mbps:百兆口代价为 1,千兆口按向上取整也为 1(可通过调大参考带宽加以区分),路径代价为沿途各接口代价之和,取最小者为最优路径。RIP 度量 = 报文经过的路由器个数(跳数),上限 15。

图示

两种流派的「信息形状」

距离向量(RIP)                        链路状态(OSPF)
邻居间只交换距离数字                   每台路由器向全网泛洪原始链路事实

 R1 --"到X 5跳"--> R2 --"到X 6跳"--> R3    R1、R2、R3 各自洪泛 LSA:
 转述结果逐跳叠加、可能过时失真             "我与谁相邻、代价各是多少"
                                           人人得到同一张 LSDB 地图,
                                           本地跑 Dijkstra 独立算最短路

原理与机制

两大流派差异的根源在于交换的信息形状:距离向量交换的是算好的结果,报文小、计算轻,但二手信息会失真且收敛慢——故障消息像流言一样一圈圈传开,RIP 靠 30 秒周期全表广播维持同步,坏消息还可能被计数到无穷放大;水平分割与毒性逆转就是针对这种环路的补丁。链路状态交换的是原始事实,泛洪保证所有节点拿到同一张一致的地图,收敛快且无转述失真,代价是每个节点都要维护 LSDB 并承担 SPF 计算,对 CPU 与内存要求更高。OSPF 用区域划分控制这一开销:泛洪与计算局限在区域内,跨区域流量统一经过骨干区域 0.0.0.0,ABR 只向其他区域通告汇总后的路由,使 LSDB 规模与全网规模解耦。

实例分析

选型对比:20 台路由器的园区网拓扑简单、变化少,RIP 配置零心智负担即可胜任;数百台路由器的城域网则必须上 OSPF 并划分区域,否则全网的 LSA 泛洪与 SPF 重算会把设备压垮。逐项对比两者:算法流派上 RIP 是距离向量、OSPF 是链路状态;度量上 RIP 数跳数(上限 15)、OSPF 按参考带宽除接口带宽;信息交换上 RIP 周期广播整张路由表、OSPF 变化时可靠泛洪 LSA;收敛速度上 RIP 慢且坏消息传播慢、OSPF 触发式更新收敛快;资源消耗上 RIP 低、OSPF 较高;适用规模上 RIP 限小型网络、OSPF 覆盖中大型网络并可分区。域内选路解决之后,跨自治系统的规模、策略与信任三大问题由 BGP 接手(见 kp-015)。

常见误区

  • 以为 RIP 的 16 表示「第 16 跳可达」:16 是「不可达」的哨兵值,可达到顶只有 15 跳。
  • 以为水平分割能解决一切环路:它针对相邻路由器互发旧路由的典型场景,更大拓扑仍需毒性逆转等机制配合。
  • 把 LSDB 当成路由表:LSDB 是全网拓扑的地图,路由表是对地图本地计算后的结果,二者不是一回事。
  • 以为 OSPF 区域可以随意连接:非骨干区域之间不能直接互换路由,必须经由骨干区域 0.0.0.0。

自测题

  1. RIP 为什么把跳数上限定为 15?

答案要点:度量是跳数且用 16 表示不可达,15 跳上限既防止计数到无穷无限累加,也决定了 RIP 只适合小型网络。

  1. 水平分割与毒性逆转各自做什么?

答案要点:水平分割不把学自某接口的路由从原接口发回,切断来回累加;毒性逆转更激进,回发时直接置 16,明确宣告不可达以加速收敛。

  1. OSPF 中 LSDB 与路由表是什么关系?

答案要点:LSDB 是全网拓扑的统一地图,路由表是本地用 SPF 对地图计算后得出的最短路径结果,地图与导航结果是两回事。

  1. 为什么要划分区域并设骨干区域 0.0.0.0?

答案要点:把泛洪与 SPF 计算限制在区域内,控制 LSDB 规模与设备开销;骨干区域保证跨区域路径经过统一骨干,避免区域间路由混乱。

  1. 两个协议在「谁向谁交换什么」上的根本差异?

答案要点:RIP 向邻居交换「我到各目的地的距离」这类转述结果;OSPF 向全网泛洪「我与谁相邻、代价多少」这类原始事实,后者没有转述失真。

延伸阅读

  • RFC 2453《RIP Version 2》
  • RFC 2328《OSPF Version 2》
  • 谢希仁《计算机网络》