148.每日一练
一、题目
OSPF协议使用哪种状态表示邻居关系已经建立?
A. 2-way
B. Down
C. Ex-Start
D. Full
二、答案
A
三、解析
A选项正确:在OSPF中2-way称为邻居状态
B选项错误:DOWN状态是OSPF中没有收到OSPF的报文的状态,等于没有启动OSPF邻居建立所以错误
C选项错误;Ex-Start状态用于选举主从,不能称为邻居
D选项错误:Full状态在OSPF中称为邻接状态
四、扩展-OSPF的七个邻居状态
OSPF 的邻居建立过程与状态机
邻居建立过程
在初始情况下,R1、R2 之间的接口激活 OSPF 后,都会开始在这个接口上去发组播的 HELLO 包,目的是发现 OSPF 邻居。HELLO 包里,有个 active neighbor 字段,用来存储路由器在某个 OSPF 接口上发现的邻居,当然,初始情况下,这个 HELLO 包里是不包含任何活跃的邻居的(也就没 有 active neighbor 字段),因为他谁也没发现。
当 OSPF 路由器(R2)在某个 OSPF 接口上收到邻居发来的 HELLO 包(里面没有装 active neighbor),它会记录下 R1(在自己的 OSPF 接口数据结构中)并且将 R1 的状态视为 Init,然后 将 R1 的 Router-ID 存储在自己将要发送的 HELLO 包的 active neighbor 字段里发送出去,这样 R1 就会收到这个 HELLO 包,并且在这个 HELLO 包当中找到自己的 RouterID,那么 R1 会认为,与 R2 已经完成了双边关系的建立,因此 R1 会将 R2 的邻居状态置为 2-way。 与此同时,R1 也会继 续发送 HELLO 包,并且将 R2 的 Router-ID 放置于 HELLO 包中,而 R2 收到这个 HELLO 包并看见 了自己的 Router-ID 后,R2 也会将 R1 的状态置为 2-way,至此 OSPF 的第一个稳态就达到了,此 时可以称为邻居。
接下去 R1、R2 会进入 Ex-start 状态并开始进行 master、slave 的协商,协商 M/S 的目的是 为了决定在后续的 LSA 交互中,谁来决定 DBD 的序列号,而 Router-ID 大的那个 OSPF 路由器的接口将会成为 master,由它来决定 DBD seq,对端成为 slave。这里要注意 master 不是 DR,要注 意与 DR 的概念进行区分。这个协商过程,是由交互 DBD 包实现的,注意这里使用的是空的 DBD 包,也就是不包含任何 LSA 头部的 DBD 包,这个包当中,有三个位非常关键:I、M、MS。用于 Ex- start 阶段协商 master、slave 的 DBD 包,即在 Ex-start 状态发送的第一个 DBD,I 位(或叫做 Init 位)都是置 1 的,另外 MS 位如果置 1,表示 DBD 报文始发路由器认为自己的 master,当然 起初大家都这么认为,在一系列 DBD 交换后,就会得到选举结果,被选举为 slave 的 OSPF 接口, 会将发送的 DBD 包 MS 位置为 0;另外 M 位表示 more,如果一个 OSPF 接口发送的 DBD 包 M 位 置 1,在表示这不是最后一个 DBD,后续还有 DBD 包待发送。 当 OSPF 接口收到一个 DBD 包且其 中 M 位置 0 的时候,它就知道与该邻居的 Ex-start 阶段已经过去了,于是将邻居的状态置为 Ex- change,并存储对端发来的 DBD 包所包含的 LSA 头部,当然,他自己也发送关于自己 OSPF DB 的 摘要给邻居。如此一来,双方都能通过 DBD 的交互,了解到对方 OSPF DBD 中的摘要情况。在这个 过程中,可能交互数个 DBD 报文,并要注意,这些报文的 I 位都置 0,且 M 位一般也置 0,除非 这是某个 OSPF 接口发送的非最后一个 DBD 包。
当 R1 收到一个 M 位置 0 的 DBD 包的时候,它就知道,这是邻居发来的最后一个 DBD 包了, 如果它搜集完这个邻居(假设是 R2)发来的 DBD 并且发现,这些 DBD 里有它感兴趣的 LSA,它期 望更详细的 LSA 信息时,它将 R2 置为 Loading 状态,并且开始发送 LSR 报文去请求特定 LSA 的 详细信息。R2 收到这个 LSR 后,会以 LSU 进行回应,其中就包含了对方请求的 LSA 详细信息,因 此,只有在 LSU 报文中,才能看到 LSA 的完整信息。收到 LSU 后,R1 将 LSU 中所包含的 LSA 放 进自己的 LSDB,并且给 R2 发一个 Lsack 进行确认。当 OSPF 接口上所有的待请求的 LSA 全部收 到更新后,它会将邻居置为 FULL。至此,OSPF 邻接关系的建立达到 Full 邻接。
状态机
1.Down
在 DOWN 状态下,OSPF 接口仍然有尝试发现邻居的意愿,因此会不断的发送组播 hello 包。
2.Init
当 OSPF 接口收到链路上某个邻居发来的第一个 HELLO 包的时候,它会在接口上将该邻居置为 init 状态,注意这个 hello 包中可能并未包含任何的邻居信息。但是这至少证明,我这个 OSPF 接 口在这个链路上,至少有个活的邻居。
下面是一个没有发现任何 active neighbor 的 hello 包:
3.Two-way
当 OSPF 路由器在某个链路上发现了邻居后,它自己发送的 hello 包里就会增加 active neighbor 字段,用于存储在该链路上发现的 OSPF 邻居。当一台 OSPF router 看到自己(的 RouterID)出现在邻居发过来的的 hello 分组中,它就会将该邻居置为 Two-way。该状态是 OSPF 邻居之间可以具有的最基本的关系,也是第一个稳态,但是此时两者还不能共享路由信息。
下面是一个已经在链路上发现了邻居 1.1.1.1 的 hello:
4.Ex-Start
一台 OSPF 路由器在将某个邻居置为 2way 状态后,就开始发送空的 DBD 包,用于协商 Master/Slave。这个
就是 ex-start 状态。两台 Router 间用空的 DBD 分组确定 Master 和 Slave 关系(注意不是 DR 和 BDR),在 DBD 包中有 3 个标记位用来管理邻接关系的建立过程:
I 位或称为初始位(Initial bit) 用于 Ex-Start 协商主从关系的初始化协商的 DBD 包,该 位置 1 代表此报文用于协商主从;
M 位 或称为后继位(More bit) 如果这不是 OSPF Router 发送的最后一个 DBD,该位置 1; MS 位 或称为主/从位(Master/Slave bit) 如果始发路由器是 Master,则该位置 1; 如果某台 OSPF Router 收到邻居发来的 DBD,I 位也就是 Init 位置 0,则意味着 Ex-Start 状态
结束,并且 MS/Slave 已经选出来了,那么该路由器会将邻居置为 Ex-change 状态,开始用包含 LSA 头部的 DBD 交换各自的 LSBD。
下面是一个用于初始化协商的 DBD 消息:
5.Ex-change
这个过程,双方使用包含自己 LSA 头部的 DBD 报文进行交互,并且将对方发过来的 LSA 头 部、并且自己感兴趣的 LSA(或自己没有的 LSA)存储在一个本地 OSPF 接口的队列里,以便在下一 个阶段进行 LSA 详细信息的请求。当某个 OSPF 接口收到邻居发来的 DBD,M 位置 0,则表示对方 已经发完 DBD 了,与此同时,如果该路由器的这个 OSPF 接口上存在待请求的 LSA,那么它会将这 个邻居置为 Loading 状态。
下面是一个装载了 LSA 头部的 DBD 消息:
6.Loading
OSPF Router 使用 LSR 去请求 LSA 的详细信息,对方使用 LSU 发来更新,因此只有 LSU 里才 有 LSA 的完整信息。在收到 LSU 后,一方面本地使用 LSAack 进行确认,另一方面将 LSU 中包含 的 LSA 装载进自己的 LSDB。
以下是一个 LSR 消息,非常的简单:
接着是一个 LSU 消息,里头包含了 LSA 的完整信息,LSA 这里暂时不做详细介绍,请看后续知 识点;
7. Full 邻接状态
Loading 状态结束后,也就是本地 OSPF 接口上再没有待更新的 LSA 队列后,将邻居置为 FULL。