个人认为,理解报文就理解了协议。通过报文中的字段可以理解协议在交互过程中相关传递的信息,更加便于理解协议。
自动换行
OSPFv2:
- 关于 OSPFv2 协议基本原理,可参考RFC2328-OSPF Version 2。
其他相关资料可参考:
- 关于OSPFv2协议基本原理的相关介绍,可参考博客-OSPFv2协议个人理解+报文示例+相关配置-RFC2328。
- 关于OSPFv2协议发展RFC,可参考博客-OSPF/IS-IS RFC历史版本集合。
- 关于OSPFv2-RFC2328的文档翻译,可参考博客-OSPFv2 RFC2328文档翻译1。
- 关于OSPFv2-RFC2328的文档翻译,可参考博客-OSPFv2 RFC2328文档翻译2。
- 关于OSPFv2协议定义的相关参数,可参考IANA发布的Open Shortest Path First v2 (OSPFv2) Parameters。
...
OSPFv2还存在大量其他相关RFC,感兴趣者可查阅相关资料。
个人能力有限,有问题可私信交流。
目录
OSPFv2协议状态(切换状态机)
1.相关术语
1.1.基本概念
Autonomous System:自治系统,通过相同路由协议进行路由信息交换的一组路由器。
Interior Gateway Protocol:属于一个自治系统的路由协议。
Router ID:一个分配给运行OSPF协议的的 32-bit 数字。自治系统内唯一标识。
Point-to-point networks:仅包含一对路由器的网络。
Broadcast networks:支持超过两个路由器连接的网络,同时具备将物理信息广播至所有路由器的能力。
Non-broadcast networks:支持超过两个路由器附着的网络,但是不具有广播能力。
Neighboring routers:都有连接到同一网络接口的路由器。
Adjacency:用于描述邻居路由器交换路由信息的关系。
Flooding:分发和同步 OSPF 路由器之间的 link state database 的行为。
1.2.结构常量
《RFC2328-OSPF Version 2-B.Architectural Constants》中定义了 OSPF 程序所用到的相关参数,这里进行相应介绍。
LSRefreshTime:任何特定 LSA 的重新发送的最长时间。当 LS age 字段达到 LSRefreshTime 时,将重新发送 LSA。LSRefreshTime 的值可取 30min。
MaxAge:LSA 可以达到的最大时间。当 LSA 的 LS age 字段达到 MaxAge 时,它会被重新泛洪以刷新 LSA。LS age = MaxAge 的 LSA 不用于路由表计算。MaxAge 的值可取 1h。
MinLSInterval:区分产生特定 LSA 的最短时间。MinLSInterval 的值可取 5s。
MinLSArrival:对于任何特定 LSA,泛洪期间接收新 LSA 实例之间必须经过的最短时间。在小于该时间接收的 LSA 将被丢弃。MinLSArrival 的值可取 1s。
CheckAge:当 LSDB 中 LSA 的 LS age = N * CheckAge(N取整数) 时,将验证 LSA 的校验和。校验和不正确表示存在严重错误。CheckAge 的值可取 5min。
MaxAgeDiff:LSA 在 OSPF 域中泛洪时由于传输时延或处理时延等情况可能存在时间分散或偏离的情况。如果 两条 LSA 的 LS age 超过了 MaxAgeDiff,认为两条 LSA 为不同 LSA。MaxAgeDiff 的值可取 15min。
LSInfinity:一个标识 LSA 不可达的 metric 值。可以用于 Summary-LSAs 和 AS-external-LSAs 提前老化使用。LSInfinity 的 metric 值可取 2^24^-1 = 16777215。
DefaultDestination:指示默认路由的 Destination ID。 当找不到其他匹配的路由表条目时,使用此路由。DefaultDestination只能在 AS-external-LSAs 和末节区域的 Summary-LSAs 中通告。DefaultDestination 值 IP address 0.0.0.0,与其关联的掩码为 0.0.0.0。
InitialSequenceNumber:产生任何第一个 LSA 时用于 LS Sequence Number的值。其值是有符号的 32 位整数 0x80000001。
MaxSequenceNumber:LS Sequence Number 可达到的最大值。其值是有符号的 32 位整数 0x7FFFFFFF。
1.3.接口/邻居数据结构
interface type:通常是 point-to-point, broadcast, NBMA, Point-to-MultiPoint 或者 virtual link 其中之一。
HelloInterval:接口通告 OSPF Hello 包的时间间隔。
Hello Timer:接口发送 OSPF Hello 包的定时器。每隔 HelloInterval 时间触发。
《RFC2328的附录C.3 Router interface parameters》中定义对于连接到相同网络的所有路由器,HelloInterval必须相同。X.25 PDN 网络的示例值:30 秒。局域网的示例值:10 秒。
RouterDeadInterval:路由器宣告邻居 down 的间隔。
Inactivity Timer:一个单次触发的定时器,用于表明最近未从某个邻居收到 OSPF Hello 包。该定时器长 RouterDeadInterval 秒。
《RFC2328的附录C.3 Router interface parameters》中定义对于连接到相同网络的所有路由器,RouterDeadInterval必须相同。RouterDeadInterval 应当为 HelloInterval 的几倍,可取 4。因此默认情况下 RouterDeadInterval = 40s。
Router Priority:一个 8 位无符号整数,仅针对 broadcast 和 NBMA 接口配置用于选举 Designated Router。
当连接到网络的两个路由器都尝试成为Designated Router时,具有最高Router Priority的路由器优先。 如果仍然存在平局,则 Router ID 最高的路由器优先。Router Priority设置为 0 的路由器没有资格成为所连接网络上的Designated Router。
Wait Timer:接口退出 Waiting 状态的单次定时器。
《RFC2328的9.The Interface Data Structure》中定义 Wait Timer 取值 RouterDeadInterval 秒,也即 40s。
Designated Router:至少连接了 2 个路由器的 broadcast 和 NBMA 网络拥有 1 个 DR。DR 由 Hello 协议选择用于生成 Network-LSA。此外,DR 可以减少广播或 NBMA 网络上所需的 adjacency 数量,反过来又减少了路由协议流量和 link state database 的大小。
Backup Designated Router:DR 的备选路由器。当 DR 发生故障时,BDR 将变为 DR。BDR 初始为 0.0.0.0,表示缺少 BDR。
Interface output cost:在接口上发送数据包的成本,以链路状态 metric 表示。此 cost 在 router-LSA 中作为此接口的链路开销公布。接口的 cost 必须大于零。
RxmtInterval:LSA 重新传输之间的秒数。该值应远高于所连接网络上任意两台路由器之间的预期往返延迟。此值的设置应保守,否则将导致不必要的重新传输。
《RFC2328 的附录C.3 Router interface parameters》中示例RxmtInterval可取 5s。
InfTransDelay:通过此接口传输 OSPF LSU 数据包所需的估计秒数。该值的设计主要用于考虑在传输过程的时延给 LSA age 添加一定非 0 的数值。在传输之前,更新数据包中包含的 LSA 必须将其 age 增加此量。此值应考虑接口的传输和传播延迟。它必须大于 0。局域网的示例值:1 秒。
《RFC2328 的附录C.3 Router interface parameters》中示例InfTransDelay可取 5s。
AuType and Authentication key:标识要在连接的网络上使用的身份验证过程。
关于OSPF所使用的认证类型,可参考IANA发布的OSPF Authentication Codes。
2.协议原理
2.1.接口状态机
2.1.1.OSPF的接口状态
《RFC2328-OSPF Version 2的9.1.Interface states》中定义了可影响 OSPF 接口状态的 event,这里进行相应介绍。
Down:接口状态的初始状态。该状态下所有接口参数都应被设置为初始值,并取消接口定时器。该状态的接口不得具有邻接关系。
Loopback:环回接口,可用于检测链路质量等场景。
Waiting:路由器接口确定 BR/BDR 身份时的等待状态。在此状态下不允许更改 BR/BDR。
《RFC2328的9.The Interface Data Structure》中定义 Wait Timer 取值 RouterDeadInterval 秒。对于非广播型网络无此状态,因此OSPF邻居/邻接状态建立很快。
Point-to-point:进入此状态后,路由器会尝试与相邻路由器形成邻接关系。 Hello 数据包每 HelloInterval 秒向邻居发送一次。
DR Other:广播型/NBMA 网络下,接口既非 DR 也非 DR Other 的角色。
Backup:广播型/NBMA 网络下,接口可以被选举为 BDR,当 DR 故障时升级成为 DR。
DR:广播型/NBMA 网络下,接口可以被选举为 DR。DR 路由器应当为网络生成指向连接到网络的所有路由器 (包含自身) 的 Network-LSA。
DR Other仅与DR/BDR形成邻接关系,DR Other和其他DR Other仅形成邻居关系。DR/BDR与其他设备都形成邻接关系。
2.1.2.造成邻居状态切换的事件
《RFC2328-OSPF Version 2的9.2.Events causing interface state changes》中定义了可影响 OSPF 接口状态的 event,这里进行相应介绍。
InterfaceUp:该事件通常由低级别协议通知网络接口具有可操作性,并使 OSPF 接口脱离 Down 状态。
InterfaceDown:该事件通常由低级别协议通知接口不再工作,并无论接口的当前状态如何都将使其过渡到 Down 状态。
WaitTimer:Wait Timer 定时器触发。可指示选举 DR/BDR 之前的等待周期结束。
BackupSeen:路由器已检测到网络是否存在 BDR 路由器。在于邻居进行双向通信后,可用于指示 Waiting 状态结束。
WaitTimer 事件和 BackupSeen 事件的区别在于:BackupSeen 事件有可能提前触发本地结束等待 DR/BDR选举,但是 WaitTimer 事件只可能在等待 40s 后才能触发。通常,WaitTimer 事件只可能在网络中首次有 OSPF 路由器启动时发生,而 BackupSeen 事件通常发生在一个新的 OSPF 路由器启动。
因此可以发现一个新的 OSPF 路由器启动加入到原有 OSPF 域时,也将很快过渡到 Full 状态。
NeighborChange:接口上的双向邻居状态已更改,需要重新计算 DR/BDR 路由器。
邻居改变导致NeighborChange改变的方式可能有:
1@:邻居的双向交互建立,邻居状态变更为 2-way 或更高状态。
2@:取消邻居的双向交互,邻居的状态已转换为 Init 或更低级别。
3@:通过 OSPF Hello 包发现新的邻居 (已建立双向通信) 宣称自己为 DR/BDR。
4@:通过 OSPF Hello 包发现原来的 DR/BDR 宣称自己不再是 DR/BDR。
5@:通过 OSPF Hello 包发现邻居 (已建立双向通信) 的 DR priority 发生变化。
LoopInd:收到接口具有环回自身功能的指示,该事件可由网络管理或较低级别的协议来触发。
UnloopInd:收到接口不在环回自身的指示,该事件可由网络管理或较低级别的协议来触发。
2.1.3.OSPF的接口状态切换及DR选举
OSPF 的接口状态切换都由事件触发,并且根据当前接口状态来决定事件驱动形成何种新的接口状态。并且,每当接口状态发生改变时都必须形成新的 Router-LSA。
此处以下图为例进行简单介绍:1@:当接口 UP 时,启动 Interval Hello Timer 定时器周期性发送 OSPF Hello 包。如果连接的网络是物理点对点网络、点对多点网络或虚拟链路,则接口状态将转换为 Point-to-Point。
如果连接网络为广播型网络或 NBMA 型网络且有资格成为 DR 时,将启动单次的 Wait Timer。如果无资格成为 DR,接口状态将转换为 DR Other。
2@:在 Waiting 状态发生 BackupSeen 事件时,将根据相应的结果过渡到 DR、BDR 或 DR Other 中的一种状态。
3@:在 Waiting 状态发生 WaitTimer 事件时,将根据相应的结果过渡到 DR、BDR 或 DR Other 中的一种状态。
4@:在 DR、BDR 或 DR Other 中的一种状态发生 NeighborChange 事件时,将根据相应的结果重新计算并过渡到 DR、BDR 或 DR Other 中的一种状态。
自动换行
点击此处回到目录
DR/BDR选举:
《RFC2328-OSPF Version 2的9.4.Electing the Designated Router》中定义了 DR/BDR 选举的相应原则,这里进行相应介绍。
DR/BDR选举基本原则:
1@:路由器首次参与 DR/BDR 选举时,应将 DR/BDR 设置为 0.0.0.0 以表示缺少 DR/BDR。
2@:DR priority 为 0 的路由器不具有 DR/BDR 选举资格。
3@:只有过渡到 2-way 或更高状态的路由器才可参与选举。
记录可参与 DR/BDR 选举的路由器后,按以下步骤进行选择:
- 宣称自己为 DR 的路由器,没有资格成为 BDR。
- 在具有 DR/BDR 选举资格的路由器中,选择 DR priority 最高的路由器成为 BDR。DR priority 相同则选择 router-id 最大的路由器成为 BDR。
- 计算网络中新的 DR 时,如果有路由器宣称自己为 DR,则选择 DR priority 最高的路由器成为 DR。DR priority 相同则选择 router-id 最大的路由器成为 DR。否则由 BDR 成为 DR。
- 当网络中 DR/BDR 角色发生变化时,重复上述步骤后进行下一步。
- 选举完成后,路由器将成为 DR/BDR/DR Other 中的一种。成为 DR/BDR 角色的路由器应当承担相应的职责。
《RFC2328-OSPF Version 2的7.3.The Designated Router》中认为 DR 路由器应当产生 network-LSA,用于描述连接网络的路由器集合。并且 DR 路由器与其他所有路由器具有邻接关系。
并且当路由器的网络接口首次正常工作时,如果当前是有适用于该网络的 DR,则接受该指定路由器而不管其路由器优先级如何。这一方式可以有效降低网络中 DR 改变的概率。
自动换行
《RFC2328-OSPF Version 2的7.4.The Backup Designated Router》中认为 BDR 路由器与其他所有路由器具有邻接关系。当 DR 故障时,BDR 成为 DR。DR/BDR 都由 OSPF Hello 包进行选举。
- NBMA 网络中的 DR/BDR 必须开始向那些没有资格成为指定路由器的邻居发送 OSPF Hello 数据包。这是通过对 DR priority 为 0 的每个邻居调用邻居事件 Start 来完成的。
Start 事件仅在 NBMA 网络中出现,发生后以 HelloInterval 时间为持续向邻居发送 OSPF hello 包。
在 NBMA 网络上,每个有资格成为 DR 的路由器都应通过手工配置或其他方式知道网络上的所有邻居。发送 OSPF Hello 包时,应以单播方式进行发送。
当周期性地向邻居发送 Hello 数据包时,如果邻居处于 Down 状态,则每 PollInterval 秒发送一次 Hello 数据包。否则每 HelloInterval 秒发送一次 Hello 数据包。PollInterval 秒可取 2min。
- 如果上述计算导致 DR/BDR 变化,则需要修改与此接口关联的邻接集。可能触发 AdjOK?事件,并导致重新审查其邻接变化。
2.2.OSPF的邻居状态机
2.2.1.OSPF的邻居状态
《RFC2328-OSPF Version 2的10.1.Neighbor states》中定义了 OSPF 程序的邻居状态,这里进行相应介绍。
Down:邻居对话的初始状态,表示最近没有收到来自邻居的信息。但在 NBMA 网络上,Hello 数据包仍然可以发送到状态为 Down 的邻居。
Attempt:(此状态仅对连接到 NBMA 网络的邻居有效)。它表明最近没有收到来自邻居的信息,但应该做出更协调一致的努力来联系邻居。
Init:收到来自邻居的 Hello 数据包,但未与邻居建立双向通信(未从邻居的数据包中发现本端信息)。处于此状态(或更高状态)的所有邻居都列在从关联接口发送的 Hello 数据包中。
2-Way:该状态下,两台路由器已建立双向通信。这是 adjacency 关系建立前 OSPF 路由器所能到达的最高状态。BDR/DR 只能从状态为 2-Way 或更高状态的路由器中选择。
ExStart:该状态是两台邻居路由器建立 adjacency 关系的第一步。如果首次进入该状态将进行 DBD 传输前的主从选举并确定初始 DD sequence number。处于此状态或更高状态的邻居通信称为 adjacency。
Exchange:该状态下进行 OSPF DD 数据包的交互,以描述其整个 link state database。每个 DD 数据包都有一个 DD 序列号,并被明确确认。任何时候都只允许一个 DD 数据包未完成。
Loading:该状态下进行 OSPF LSU 数据包的交互,以请求最新的 LSA。
Full:该状态下的相邻路由器处于完全 adjacency 关系中。adjacency 关系体现于 Router-LSAs 和 Network-LSAs 中。
2.2.2.造成邻居状态切换的事件
《RFC2328-OSPF Version 2的10.2.Events causing neighbor state changes》中定义了可影响 OSPF 邻居状态的 event,这里进行相应介绍。
Start:(仅在 NBMA 网络邻居中出现) 以 HelloInterval 时间为持续向邻居发送 OSPF hello 包。
HelloReceived:收到邻居的 OSPF Hello 包。
1-WayReceived:收到邻居的 OSPF Hello 包,但其中不包含自己的信息。表明双向交互未实现。
2-WayReceived:收到邻居的 OSPF Hello 包,其中已包含自己的信息。表明双向交互已实现。
NegotiationDone:已完成 OSPF DD 数据包的 Master/Slave 选举及 DD sequence numbers 的交互。
ExchangeDone:已完成全部的 OSPF DD 数据包的交互。每台路由器都知道哪些 link state database 已过时。
Loading Done:已收到 link state database 所有过期部分的链路状态更新。这在 Database Exchange 进程完成后 Link state request (链接状态请求) 列表变为空表示。
AdjOK?:决定是否形成相应的邻居。
以下事件可能使邻居过渡到更低状态:
SeqNumberMismatch:收到 OSPF DD 数据包,但有不期望的 DD sequence number 或不期望的 I-bit option 或 options 字段与在 OSPF DD 数据包中接收的最后一个 options 字段不同。
BadLSReq:收到 OSPF LSR 数据包请求不包含于 link state database 中的 LSA。表明在 link state database 交互过程中出现错误。
SeqNumberMismatch 和 BadLSReq event 总是使状态机过渡到 ExStart 状态。
KillNbr:表示所有的邻居交互都不可能。
InactivityTimer:Inactivity Timer 触发,通常意味着未从邻居收到 OSPF Hello 包。该定时器可由 HelloReceived 事件重启。
LLDown:低级别的协议通知邻居不可达。
KillNbr、InactivityTimer 和 LLDown event 总是使状态机过渡到 Down 状态。
2.2.3.OSPF的邻居状态切换
OSPF 的邻居状态切换都由事件触发,并且根据当前邻居状态来决定事件驱动形成何种新的状态。
此处以下图为例进行简单介绍:
1@:HelloReceived 事件触发时,邻居状态将从 Down 状态转变为 Init 状态。并且启动邻居的 Inactivity Timer。当 Inactivity Timer 定时器触发时,表明邻居已死。
如果邻居已具有 Init 或更高状态,HelloReceived 事件触发时则邻居状态不变同时重启邻居的 Inactivity Timer 定时器。
2@:1-WayReceived 事件触发时,表明收到邻居的 OSPF Hello 包中不包含自己的信息。也即双向交互未实现,邻居状态将转变为 Init 状态。
3@:Init 状态下的 2-WayReceived 事件触发时,新的状态将取决于程序对应的动作过渡到 2-Way 或 ExStart 状态。
2-Way 或更高状态下的 2-WayReceived 事件触发时无动作,这一行动通常表示收到邻居的保活通知。
在路由器的邻居中,点对点、点对多点以及 virtual links 邻居总是具有邻接关系。在广播和 NBMA 网络上,所有路由器都与 DR 和 BDR 建立具有邻接关系。
邻接形成的决策通常发生在邻居的双向通信建立刚完成或者 DR/BDR 角色发生变化。
自动换行在首次过渡到 ExStart 状态时,将发送 OSPF DDB 数据包。DDB 数据包的 Interface MTU 字段应设置为可从发送接口发送的最大不分片 IP 包的大小。但对于 virtual links 发送时,应置为 0。
此外,在 OSPF DDB 的发送过程中应保证 Option 的一致性。如果由于某种原因发生了变化,应将邻居状态过渡到ExStart状态来重新交互 OSPF DDB。ExStart 下的 OSPF DDB 应当每 RxmtInterval = 5s 重新传输一次,并且不包含 LSA 信息。
自动换行
OSPF DDB 的发送应遵循以下逻辑:Master 应在收到 Slave 的正确 OSPF DDB 报文后发送新的 OSPF DDB,或者应在 RxmtInterval = 5 秒内未收到来自 Slave 的正确 OSPF DDB 报文后重传之前的 OSPF DDB。
4@:ExStart 状态下的 NegotiationDone 事件触发时,将过渡到 Exchange 状态。
在此状态下,路由器应准备好自身的链路数据库以便传输 OSPF DDB。在这一过程中,应当合理的排除不相关的 LSA。例如,发送给虚拟邻居以及 Stub 区域的 OSPF DDB 应当排除 AS-external-LSAs。并且 LSA age = MaxAge = 1h 的 LSA 应当放入 Link state retransmission 列表。
应当说明的是,在其他状态下的不合理 OSPF DDB 收发将触发 SeqNumberMismatch 事件,并总是使状态机过渡到 ExStart 状态。
自动换行
OSPF DDB 的接收应遵循以下逻辑:收到多个相同的 OSPF DDB 将被视为重复。
MTU 字段大于自身接口 MTU 将被丢弃。
Init 状态收到 OSPF DDB(OSPF DDB是单播转发,有可能之前的邻居已保留对应信息),将被视为触发 2-WayReceived 事件而过渡到 2-Way 或 ExStart 状态。而本身为 2-Way 状态收到 OSPF DDB 时将丢弃。
Exchange 状态的不合理 OSPF DDB 收发将触发 SeqNumberMismatch 事件,并总是使状态机过渡到 ExStart 状态。
Loading/Full 状态的 OSPF DDB 将总是重复的。(因为 OSPF DDB 已经在 Exchange 交互完成)
自动换行
OSPF DDB 的主从选举,不携带内容:收到邻居 OSPF DDB 的 Router-id 大于自己的 Router-id 时,路由器成为 Slave。并在后续的转发时,将自己发送的 OSPF DDB 的 DD 序列号设置为 master 的 DD 序列号。
收到邻居 OSPF DDB 的 I-bit 和 M-bit 不置位,DD 序列号为自己之前的发送的 DD 序列号,且 Router-id 小于自己的 Router-id 时,路由器成为 Master。这种要求可以确保 Master 设备已知晓 Slave 成为 Slave。
5@:Exchange 状态下的 ExchangeDone 事件触发时,如果 LSR 列表为空则过渡到 Full 状态,反之则进入到 Loading 状态并开始发送 OSPF LSR 报文。
OSPF LSR 的发送应遵循以下逻辑:
链路状态请求列表中已请求收到的 LSA 将从链路状态请求列表中剔除,并发送新的 OSPF LSR 数据包。
链路状态请求列表中已请求但尚未收到的 LSA 会被封装到 OSPF LSR 数据包中,以 RxmtInterval = 5s 的间隔重新传输。任何时候最多应有一个未完成的 OSPF LSR 数据包。
6@:Loading 状态下的 LoadingDone 事件触发时过渡到 Full 状态。
LoadingDone 事件仅在 Loading 状态下链路状态请求列表为空的情况下发生。
3.OSPF状态分析实例
为了进一步了解 OSPF 的相关原理,在此简单介绍几个场景便于理解。仅供参考不具备实际意义。
在一个新建立的 OSPF 广播类型网络中,似乎只要保证每隔 1-30s 有新的更大 DR Priority 路由器加入就将无法过渡到 Full 状态。
3.1.三台广播型OSPF路由器的启动
三台路由器连接到同一个局域网 10.1.1.0/24,AR1 和 AR2 同时以默认参数加入 OSPF 域中。随后 20s 后,AR3 以默认参数加入到 OSPF 域中。
当所有设备 OSPF 邻居状态都转变为 Full 状态时,AR1 引入 1.1.1.1 的直连路由和 11.1.1.1/32 的静态路由。
这里提供的场景仅作为简单分析使用。在网络中一个 DR/BDR OSPF 路由器在其他设备未感知时发生震荡导致重新过渡到 Init 状态进行重新协商时,也可以快速过渡到 Full 状态。这里不在进行介绍。
AR1的Hello交互行为:
AR1-1@:当 AR1 启动时,以 HelloInterval = 10s 持续向邻居发送 OSPF hello 包。
@:当第一次启动时生成 Inactivity Timer 定时器,并在 HelloReceived 事件触发时刷新定时器。
@:当第一次启动时生成单次的 Wait Timer = 40s 定时器,用于记录结束 DR/BDR 选举周期。
@:每当收到来自邻居的 OSPF Hello 包时,记录邻居的 Router-id。随后在下一次发送 OSPF Hello 包时记录至 Active neighbor 字段。由此与邻居相互触发 2-WayReceived 事件,与邻居建立双向通信。
AR1-2@:Wait Timer = 40s 定时器触发,AR1 进入 OSPF 的 Exstart 状态开始主从选举。Exstart 状态的 OSPF DBD 包将 I-bit、M-bit 和 M/S-bit 进行置位。
@:在 AR1 的 Wait Timer = 40s 定时器触发前没有设备声称自己为 DR/BDR。定时器触发后,AR1 认为当前网络应由 AR3 成为 DR。
@:由于没有收到回应,则持续以 RxmtInterval = 5s 重复发送 OSPF DBD 报文。
AR3的Hello交互行为:
当 AR1 启动时,以 HelloInterval = 10s 持续向邻居发送 OSPF hello 包。
@:AR3 首次启动时具有相似的行为。
@:AR1 的 Wait Timer = 40s 定时器触发进入到 Exstart 状态宣称 AR3 为 DR。同时 AR3 监控网络中的 DR/BDR 宣称,未发现有设备宣称自己为 BDR。因此 AR3 不能触发 BackupSeen 事件,而只能等到 WaitTimer 事件触发。随后 AR3 进入 Exstart 状态开始进行 AR1 和 AR3 的主从选举。
@:AR2 设备上则可能触发 Neighborchange 事件。
AR1/AR2/AR3之间的DBD交互:
AR3 宣称自己为 DR(同时宣称 AR2 为 BDR),进入 Exstart 状态开始进行 AR1 和 AR3 的主从选举。此时 AR1 和 AR2 也正式开始进行主从选举。
@:AR3 回应 AR1 完成主从选举的同时,AR1 作为 Slave 需要向 AR3 发送 DBD 进行确认。其中也包含自己的数据库摘要。
@:AR3 作为 Master 继续向 AR1 发送包含自己数据库摘要的 OSPF DBD 包,并将其中的 DBD Seq 值设置为自己先前发送 DBD Seq + 1。AR1 作为 Slave 以相同的 DBD Seq 值再次回应。
@:AR1 与 AR2 之间也经历相似的 DBD 交互过程。
AR1/AR2/AR3之间的链路状态数据库交互:
@:在完成 OSPF DBD 数据库摘要的传递后,便可独立的开始进行数据库的传递。
@:当路由器发现 DBD 中存在自己不包含的 LSA 时,将其放入链路状态请求列表中进行传递。如果无相应的回应,则以 RxmtInterval = 5s 的间隔重新传输。
@:任何时候最多应有一个未完成的 OSPF LSR 数据包。并在收到 OSPF LSR 数据包时,显式的回应 OSPF LSAck 数据包。
由于数据报文较多且存在 LSA 的更新老化,为简化理解此处仅选择一例进行介绍。
3.1.1当网络中存在拓扑变化时
当网络中存在拓扑变化时,所有感知的设备应当触发 NeighborChange 事件做出响应。仅供参考不具备实际意义。
例如,当网络中一台设备退出 OSPF 域时可能有如下变化:
1@:AR2 作为 BDR 向其他所有路由器广播 OSPF LSU 数据包通告新的 Type-1 Router-LSA,表明自己新的连接状态。随后 AR1/AR3 进行广播 OSPF LSAck 数据包回复确认收到该 Type-1 Router-LSA。
2@:AR1 作为 DR Other 向 DR/BDR 路由器广播 OSPF LSU 通告新的 Type-1 Router-LSA,表明自己新的连接状态。AR3 作为 DR 广播 OSPF LSU 数据包通告 AR1 产生了新的 Type-1 Router-LSA。AR2 作为 BDR 广播 OSPF LSAck 数据包确认收到该 Type-1 Router-LSA。
3@:AR3 作为 DR 向其他所有路由器广播 OSPF LSU 数据包通告新的 Type-1 Router-LSA 和 Type-2 Network-LSA,表明自己新的连接状态。随后 AR1/AR3 进行广播 OSPF LSAck 数据包回复确认收到该 Type-1 Router-LSA 和 Type-2 Network-LSA。
3.2.两台点到点型OSPF路由器的启动
仅供参考不具备实际意义。
两台点到点型 OSPF 路由器同时启动寻求建立 OSPF 邻接关系。
1@:两台路由器启动时过渡到 Init 状态。
2@:在下一个 OSPF Hello 周期,AR1 监听到上次 AR2 的 OSPF Hello 包向 AR2 发送携带 Router-ID 的 OSPF Hello 从而触发 AR2 的 2-WayReceived 事件。
AR1 发送的 OSPF Hello 包的 Active Neighbor 字段填充 AR2 的 Router-ID = 2.2.2.2 从而触发 AR2 的 2-WayReceived 事件。
3@:PTP 链路无需进行 DR/BDR 的选举,因此没有 Wait Timer 定时器触发可直接过渡到 Exstart 状态进行主从选举。
4@:主从选举完成后,AR1 和 AR2 先后进入 Exchange/Loading 状态 进行数据库摘要的传递和 LSA 的传递。在双方同步最新的 LSA 后都过渡到 Full 状态。
在交互过程中,由于程序处理顺序及传输延时等原因可能导致路由器本地保存的 LSA 非最新 LSA。此时可能触发路由器主动发送 OSPF LSU 数据包进行更新。
自动换行Type-1 Router-LSA 中只有 StubNet 类型用于描述路由信息,其他三类 PTP、Virtual 以及 Transit 用于描述拓扑信息。
此处AR2 发送的 Type-1 Router-LSA 中包含:
PTP:AR2(2.2.2.2) 以点到点的方式连接到了 AR1(1.1.1.1),其中 AR2 的连接接口地址为 10.1.1.2,开销为 1。
Stub:AR2(2.2.2.2) 上所连接的子网路由为 10.1.1.0/30。