9.4 路由控制面:RIP、OSPF 与 BGP
转发面逐包查询 FIB,控制面则学习、计算和选择路由。RIP、OSPF 与 BGP 传播的是可达性和路径信息;路由协议会话正常,并不保证某个业务包已经能送达。本课比较三类协议,并沿故障发现、选路和表项下发检查收敛过程。
1. 候选路由选优与逐包查表是两步
路由器可能同时从直连、静态配置、OSPF 和 BGP 获得同一前缀。操作系统或厂商实现按路由来源优先级、协议度量和策略选择活动路由;路由信息库(RIB)保存选路所需信息,转发信息库(FIB)用于快速查找。
包查表通常按目的地址做最长前缀匹配。/24 比 /16 更具体,即使它们来自不同协议、使用不同度量。因此不能说“度量最小的路由总会胜出”,不同协议的度量也不能直接比较。
等价多路径(ECMP)可以安装多个符合条件的下一跳,再按流散列。逐包轮流转发可能引入乱序;常见实现选择按流分配,但散列字段、成员变化后的重分配和一致性保证需要查具体实现。
2. 距离向量:从邻居的距离推导自己的距离
距离向量路由器从邻居收到目的地与距离,再加上到邻居的代价。Bellman–Ford 关系式概括了这一过程,其中 v 遍历 x 的邻居:
D_x(y) = min_v { cost(x, v) + D_v(y) }假设 A 原本直接到达目标,B 经 A 到达目标。A 的直连失效后,如果把 B 尚未更新的通告当成替代路线,就可能选择 B,而 B 仍选择 A。双方继续根据对方的旧消息提高距离,形成“计数到无穷”。水平分割、毒性逆转和触发更新可减少这类问题,但不保证任意拓扑都立即收敛。
RIPv2 使用跳数,15 是最大可达度量,16 表示不可达。它通常每 30 秒周期更新,并使用 224.0.0.9 多播向邻居发送 RIPv2 更新,兼容模式等配置可能改变发送方式。这些是协议规定与部署选项,不能统称为随意的实现细节。RFC 2453
3. 链路状态:建立区域拓扑,再独立计算
OSPF 路由器建立邻接,使用链路状态通告(LSA)描述状态,并维护链路状态数据库(LSDB),独立计算最短路径优先(SPF)树。
区域限制完整拓扑的传播范围,但不同 LSA 的泛洪范围不同。OSPFv2 的 Router-LSA 和 Network-LSA 在区域内传播;Type 5 AS-external-LSA 通常跨区域泛洪,Stub 区域等有例外。不能把“区域内拓扑数据库”理解为“所有 LSA 都只能在本区域”。RFC 2328 §12
区域边界路由器(ABR)向其他区域通告汇总或可达性信息,骨干区域 0 连接区域间路由。普通区域内的路由器无需知道其他区域的全部链路。区域划分因此影响规模、故障影响范围与排查方式。
OSPF cost 由配置或实现的计算规则决定,不是实时测出的链路延迟。参考带宽若未统一配置,不同高速链路可能得到相同 cost。认证、被动接口、区域类型、汇总和默认路由都需要与拓扑一起设计。
4. 收敛要经过多道处理
链路失效后的过程包括:
- 通过物理信号、Hello/Dead 计时器或 BFD 发现故障;
- 更新邻接和链路状态;
- 生成并传播 LSA 或其他路由更新;
- 重新计算 SPF 或应用选路策略;
- 完成 RIB 选优和 FIB 下发;
- 处理邻居更新不同步时可能出现的短暂环路或黑洞。
Dijkstra 算法运行很快,不代表整次中断也同样短。快速重路由可以预先准备备用下一跳,在控制面完全收敛前恢复部分转发,但必须检查备用路径是否无环、是否有足够容量。
5. BGP 传播自治系统间的可达性与策略
BGP 对等体通过 TCP 交换网络层可达信息(NLRI)和路径属性。eBGP 连接不同自治系统(AS),iBGP 在同一 AS 内分发 BGP 路由,路由反射器可以减少全互联会话数量。
常见属性包括:
LOCAL_PREF:表达本 AS 选择出站路径的偏好,通常值越高越优先;AS_PATH:记录通告经过的 AS 路径,用于环路检查和策略,并不是路径真实性的密码学证明;ORIGIN:描述路由信息最初如何进入 BGP,不是源 AS 的身份凭证;MED:向相邻 AS 表达多个入口的偏好,通常值较低者优先,但比较范围受策略限制;NEXT_HOP:数据转发下一跳,需要能通过底层路由递归解析;- Community 与 Large Community:附加策略标签。
BGP 有明确的状态机、报文处理、环路检查和选路流程。本地策略可以优先于 AS_PATH 长度;厂商默认的平局处理也不完全相同。因此一张厂商选路顺序表,不能当作整个互联网唯一的规则。
6. 路由泄漏、劫持与 RPKI 源验证
路由劫持可能是未获授权的 AS 宣告他人前缀;路由泄漏常是把本不应继续传播的路由传给另一方。两者都可能吸引错误流量、形成绕路或黑洞。
RPKI 的路由源授权(ROA)声明获准宣告的源 AS、前缀及最大长度。验证器先检查这些签名对象,再向路由器提供已验证的前缀与源 AS 信息(VRP)。路由源验证(ROV)据此将通告分为 Valid、Invalid 或 NotFound;处理策略仍由运营者配置。
假设本地只有一条 VRP:192.0.2.0/24,最大长度 25,源 AS 64496。下面使用文档地址和文档 AS 号演算,不发布真实路由:
| 通告前缀 | 源 AS | 验证结果 | 原因 |
|---|---|---|---|
| 192.0.2.0/25 | 64496 | Valid | 覆盖范围、长度和源 AS 都匹配 |
| 192.0.2.0/26 | 64496 | Invalid | 超过允许的最大长度 |
| 192.0.2.0/24 | 64497 | Invalid | 有覆盖记录,但源 AS 不匹配 |
| 198.51.100.0/24 | 64496 | NotFound | 没有覆盖该前缀的 VRP |
若有多个覆盖记录,只要至少一条完全匹配即可为 Valid;不能只取最长的一条记录。NotFound 表示缺少覆盖记录,不等于已经验证可信,也不等于已判定劫持。RFC 6811 §2
ROV 不验证整条 AS_PATH,也不能阻止所有路由泄漏。前缀过滤、最大前缀数限制、IRR/RPKI 数据、对等策略、监控和事故协作仍需结合使用。
7. 从 RIB 一直查到实际转发
- 协议数据库或 Adj-RIB-In 是否收到目标前缀?
- 入站策略是否拒绝或改写了它?
- 候选为什么没有成为活动路由?
- 下一跳是否可解析?
- 活动路由是否成功写入 FIB 或硬件?
- 邻居解析或邻接是否完成?
- 数据面计数器与抓包是否符合控制面的结果?
BGP 会话显示 Established,不证明目标前缀已接收、选中并下发;路由表存在一项,也不证明硬件和邻居表能实际转发。排查需要走完这条链。
8. 验收问题
- 控制面、RIB、FIB 与转发面分别承担什么?
- 距离向量为什么会计数到无穷?
- OSPF 区域限制了哪些信息,哪些 LSA 可以跨区域?
- 为什么最短 AS_PATH 不一定胜出?
- ROV 表中的 Invalid 与 NotFound 有何区别,它们为什么不能验证整条路径?