摘要
- OSPFv2 用有符号 32 位序列号排列同一 LSA 的各个版本,范围从
0x80000001到0x7fffffff;若从最大值直接回到初始值,网络中残留的旧最大版本会被判为更新。 - 通告发起者必须先把最大序列版本设为 MaxAge 并重新泛洪,等撤回获得确认且旧副本可以安全删除后,才能以初始序列号重新发布;“消失”由此成为两个纪元之间的显式边界。
最初的序列空间像一根棒棒糖
1989 年 10 月的 RFC 1131 给 OSPF 第一版画了一幅不寻常的序列号示意图:一段直线通向一个圆环,形似棒棒糖。路由器启动时先沿直线前进,进入圆环后再循环使用数值。这个形状试图兼顾两件事:刚恢复的路由器要越过前一轮遗留状态,长期运行的路由器又要不断产生新版本。
1991 年 7 月,RFC 1247 发布 OSPFv2,并在“已修正的问题”中明确放弃了这只圆环。新空间按有符号 32 位整数线性排列:0x80000000 保留不用,0x80000001 是最小、最旧的可用值,0x7fffffff 是最大、最新的值。
线性排序把普通比较变得很清楚。面对同一 LSA 的两个版本,数值较大者更新。可线段与圆环不同,它有尽头。设计者必须回答:最后一个数已经用过以后,下一个事实怎样才能继续被承认?
直接回绕会让新事实输给旧副本
一份 LSA 由 LS 类型、Link State ID 与 Advertising Router 共同标识。序列号只比较这个身份内部的版本,不是全网时钟,也不能拿两份无关 LSA 的数字判断谁“更接近现在”。
若发起者在 0x7fffffff 之后直接发送 0x80000001,所有还保存最大值副本的路由器都会忠实地拒绝新内容。按照线性有符号比较,旧最大值确实比新初始值更新。一个算术上的回绕,会在分布式数据库里变成历史压倒现实。
等待也不能自动证明安全。LS age 会随传播和停留增加,但不同路由器可能在不同时间重启,邻居还可能把旧副本放在重传列表里,或在数据库同步时重新交出来。沉默只说明当前没听见,并不说明最大序列版本已经从所有相关状态中消失。
OSPFv2 因而没有发明更复杂的环形比较,而是给两个线性纪元之间加了一道可见的删除程序。
最大值先变成自己的撤回令
当发起者需要在 MaxSequenceNumber 之后再产生一个版本时,RFC 2328 要求它取出当前最大序列的 LSA,把 LS age 直接设为 MaxAge,再将其重新泛洪。这种未等自然到期就令通告老化的动作叫 premature aging,即提前老化。
权限边界十分严格:路由器只能提前老化自己发起的 LSA,不能借此任意抹掉别人的链路状态。通告身份与最大序列号没有改变,内容校验和也维持原样;变化的是 age 字段。Age 本来就要在传输与保存中增长,因此不纳入 LSA 内容校验和。
这里的 MaxAge 不是一个悄悄过期的旧记录。若两个版本的序列号与校验和都相同,其中一个达到 MaxAge,协议把 MaxAge 副本视为更新。这样,撤回令可以覆盖仍然“活着”的同版副本,而不必等每台机器各自数满一小时。
它撤回的是这个 OSPF 通告实例,不是向世界宣布链路断裂、路由器死亡或目的地全面不可达。别的 LSA、别的路径仍可能维持转发。
删除之前,协议要证明旧状态不再流通
发出 MaxAge 只是上半场。只要一份通告仍在任何邻居的链路状态重传列表中,本地就不能把它删除;只要有邻居停留在 Exchange 或 Loading 状态,也要继续保留,因为正在进行的数据库同步可能把旧纪元再次带回来。
若此次清除是为了序列号重启,发起者还要等待所有相邻邻居确认这份 MaxAge 通告。等最大值版本满足删除条件之后,它才可以用 InitialSequenceNumber 为同一身份重新起稿。
因此,从最大值跳到初始值并不是同一个比较空间里的倒退。最大值所属的旧纪元已经被明确撤回,撤回已经越过相关邻接关系,数据库同步也不会再夹带它;此后的低值才有资格代表新纪元。
RFC 1247 甚至调整了数据库描述过程,防止一边清除 LSA,另一边还在交换包含旧状态的数据库摘要。OSPF 没有承诺全域在同一微秒完成删除,而是要求每条相关邻接提供足以阻止两个纪元擦肩而过的证据。
重启的路由器可能从邻居那里遇见自己的过去
序列号自然用尽极其遥远,但同一套边界在重启时就有实际意义。路由器丢失易失内存后,邻居可能仍保留它重启前发起的一份 LSA,而且序列号远高于本机刚初始化的值。邻居并没有“过时”:在协议定义下,那份持久副本就是更新。
RFC 2328 要求发起者正视这份外部记忆。如果它仍应发起该 LSA,就把收到的自发 LSA 序列号再加一,并重新发布;如果它已不再拥有这条通告,就把该身份设为 MaxAge 并泛洪撤回。若返回的副本已经位于最大序列号,则进入先清除、再从初始值开始的程序,绝不能直接跨越。
工程实践常把这种反应称为 LSA fight-back。名字带有对抗色彩,事实却可能非常平常:邻居保存了重启者自己忘掉的状态。Advertising Router 身份赋予发起与撤回权,却不允许发起者假装网络中的较高序列从未存在。作者身份与分布式证据同时约束下一步。
新旧判断不只看一个数
序列号是首要比较项,却不是唯一比较项。同一身份的两个版本若序列相等,OSPF 再比较校验和,把数值较大的无符号校验和视为更新。序列与校验和都相等时,MaxAge 状态以及达到规定差距的年龄可以继续裁决;年龄差很小的副本则被视为同一实例。
三组字段分别防守不同边界。序列号表示有意重新发起;校验和辨认意外共享序列号的不同内容;年龄让明确撤回压过仍活跃的孪生副本,同时避免普通传播延迟不停制造“新版本”。
脱离 LSA 身份谈最大序列没有意义。它不是整个链路状态数据库的版本号,更不是物理时间戳。
减少刷新,不等于取消撤回
普通 OSPFv2 会每 30 分钟刷新一次自发 LSA,避免它自然达到一小时的 MaxAge。稳定拓扑也会因此消耗序列号和泛洪带宽。为按需链路设计的 RFC 1793 引入 DoNotAge;RFC 4136 又把稳定拓扑中的刷新与泛洪削减推广到更广场景。
DoNotAge 省掉的是无变化时的周期性更新,不是把 LSA 变成不可撤销的永久产权。内容一变,仍要重新发起并泛洪;需要撤回时,MaxAge 仍然承担明确的否定状态。序列排序、发起权和纪元边界都没有消失。
RFC 5340 把核心的泛洪与新旧判断机制带入面向 IPv6 的 OSPFv3,尽管地址处理与 LSA 范围表达发生了变化。旧最大副本压制新初始副本的问题,来自分布式记忆,不取决于 IP 地址长度。
OSPF 里的“序列号”不是同一种东西
邻居同步数据库时,Database Description 报文另有自己的序列控制;带密码学认证的 OSPF 报文也会使用防重放序列状态。RFC 6863 明确把报文认证的防重放问题与 LSA 内部序列分开分析。
LSA 序列回答的是:“同一条路由事实的哪个版本应当胜出?”认证序列回答的是:“在这一密钥与会话语境下,这个受保护报文是否为旧包重放?”两者的所有者、生命周期与耗尽故障不同。把它们塞进同一告警,只会掩盖真正失效的状态机。
真正的协议动作,是让旧通告有证据地消失
OSPF 没有用更大的数字掩盖有限空间,也没有赌所有邻居迟早会忘。它让最大序列的 LSA 亲自承担撤回,让确认与同步状态证明旧纪元不再流通,再允许最小合法值重新拥有“最新”的含义。
这段设计留下的历史价值不在几个十六进制常量,而在对遗忘的定义:分布式系统里的遗忘不是没有消息,而是一次有发起者、有传播路径、有完成证据的状态变化。两个序列纪元之间看似空白的一刻,其实完成了最重要的控制工作。
来源与证据边界
- RFC 1131 — OSPF specification
- RFC 1247 — OSPF Version 2
- RFC 1793 — Extending OSPF to Support Demand Circuits
- RFC 2178 — OSPF Version 2
- RFC 2328 — OSPF Version 2
- RFC 4136 — OSPF Refresh and Flooding Reduction in Stable Topologies
- RFC 5340 — OSPF for IPv6
- RFC 6863 — Analysis of OSPF Security
这些标准能证明协议规则及其演变,不能证明当前厂商默认值、序列耗尽在现实网络中的发生频率、某个实现缺陷或一次具体事故的原因。MaxAge 是 OSPF 内部针对 LSA 的撤回,不等于全局链路或目的地故障;重启后的自发 LSA 反应也不能单独证明有人恶意注入。
会员简报
档案背景详情
使用相应会员等级登录,即可解锁完整简报与来源注释。
仅限 Strategic Circle
Strategic Circle
所有读者均可浏览。加入并登录后可解锁档案简报。
加入 Strategic Circle仅限 Leadership Alliance
Leadership Alliance
符合条件的 IP 资产所有者和管理层可登录查看 Leadership Alliance 简报。
加入 Leadership Alliance
