“选出出口和IP下一跳后,ARP邻居解析再取得该接口上的目的MAC。表从哪里来则另看距离向量、链路状态和BGP路径向量与策略:它们分别展开旧估计回传、混合数据库版本和局部偏好不收敛的轨迹,不能…”
路由器也可以不转述“我到目的有多远”,而是告诉全网“我直接连着谁,成本是多少”。每台路由器收集这些局部事实,拼出一张图,再自己求最短路。难点因此分成两部分:传播哪一版事实,以及何时根据本地图更新转发表。
形式陈述
一份来源明确、可比较版本的通告
沿用IP转发接口,本页最终仍需为每个可达目的选出出口与IP下一跳。教学图由有限路由器和正成本点到点链路组成,链路对称;不含多区域、广播网络指定路由器或外部路由汇总。
每个来源
收到同一来源的通告时,只在版本更大或没有旧记录时替换;同版本重复不改变数据库;更小版本不覆盖新记录。接受的新通告向其他邻居继续传播。为了让这条规则在丢包网络上最终送达,还须有确认、重传或可靠的重复交换;“第一次发过一次”本身不构成交付保证。
本例将一条无向边纳入图的条件定义为:两端当前记录均列出对方,且给出相同正成本。这样,一端发布删除即可使这条边从本地计算图消失;孤立的一侧旧通告不能单独复活它。真实OSPF使用有向链路描述及相应双向连接检查,不能把本例的数据格式当成OSPF报文格式。
由本地图计算本地转发表
LSDB发生影响拓扑的改变后,可用Dijkstra算法从本路由器出发求距离,取每条选定最短路径的第一跳生成转发表。最短路算法处理的是这一刻输入的图;它不会替协议判断别的路由器是否已经收到同一版通告。
因此要区分至少三种状态:收到或在途的通告、本地已接受的LSDB、本地已经安装的转发表。实现可能合并多次更新后重算,也可能先算完再安装;本页事件在每次指定的接受之后立即完成本地重算,以便逐步核算。
直觉
同一来源能排序,不同来源没有天然共同快照
“来源R2的12比11新”是局部可检查的版本关系。R2的12与R3的8却没有统一大小关系;它们可能描述不同时间观察到的拓扑。一张LSDB往往是许多来源版本的组合,不是全网共同提交的某一瞬间。
对每个来源保留最大版本,有助于处理重复与乱序,却不能强迫各路由器同时切换转发表。链路状态路由因此可以在稳定后正确,同时在传播期间出现短暂环或丢包。
共同距离函数才能阻止稳定转发环
假设各处都采用同一张固定正成本图,且对目的
沿每一跳共同距离严格下降,不可能回到原点。平局选不同最短路径仍满足该式;但如果
例子与边界
一次断线产生两张都“算对了”的本地图
R1—R2成本1,R2—R3成本1,R1—R3成本4,以R3为目的。初始各处LSDB相同:R1选R2、成本2;R2直达R3、成本1。
现在R2—R3断开。R2发布自身版本12,列表只剩R1;它原来的版本11曾列出R1与R3。R2立即采用自己的12并重算;R1暂时仍保存R2的11。其余通告暂不改变,按双端列出才存在边的规则,得到:
| 路由器 | 本地R2版本 | 本地图是否有R2—R3 | 到R3的下一跳/成本 |
|---|---|---|---|
| R1 | 11 | 有 | R2 / 2 |
| R2 | 12 | 无 | R1 / 5 |
R2的5来自R2→R1→R3,成本
到达顺序比消息名称重要
随后R1收到R2的12,替换旧记录,删除计算图中的R2—R3,改为直达R3、成本4。R2继续经R1、成本5,转发路径恢复为R2→R1→R3。此后迟到的版本11被拒绝,不能把已撤销链路重新添回。
这个例子不要求R3的新版已经到达R1,因为R2这一端的删除足以让双端条件失败。若后来R3也发布撤销,它应作为另一个来源的独立版本处理,不能拿R3的版本号和R2的12比较大小。
序号回退会破坏“更大才新”的前提
若R2重启后从1重新计数,而其他节点仍记着12,它的新事实会被拒绝。若计数器达到最大值后直接回零,也有同一问题。本文通过不回绕、跨重启不倒退排除它们;真实OSPF则结合序号空间、刷新、老化和清除规则处理,不能仅照搬一行整数比较。
RFC2328中,一份LSA由类型、Link State ID及Advertising Router共同标识;新旧比较还包括序号、校验和与年龄,同序号不总意味着同一实例。本文按来源单记录的模型,只保留理解乱序所需的骨架。
收敛条件必须包含故障后的可达性
若拓扑最终固定,幸存控制链路连通,来源的最终版本能通过可靠交换抵达每个节点,且各节点最终完成重算安装,则大家最终得到相同图和相应转发表。分区时只能在各分量内讨论此结论;孤立节点不能靠无限等待获得另一分量的新事实。
推论与应用
数据库一致和转发表一致是两道检查
即使两个路由器已经保存同一组LSA,一个可能尚未完成重算或安装,所以检查LSDB相同还不够。反过来,两份LSDB不同也可能恰好生成同一目的的相同下一跳,不能只看版本差异就宣称必有环。
在图有
距离向量的坏消息示例提醒我们检查转述的依赖;这里的混合LSDB例提醒我们检查本地图的版本组合。二者都需要把控制消息轨迹与实际包的下一跳轨迹分别列出。
参考资料
- John Moy,1998,RFC2328:OSPF Version 2,§12.1.6序号,§13泛洪,§13.1实例新旧比较,§16.1区域内最短路与双向连接检查。本文三节点混合版本例与简化记录格式独立构造
- Larry L. Peterson、Bruce S. Davie,Computer Networks: A Systems Approach,§3.4 Routing,Link State:传播局部连接状态与本地计算的分工