OSPF几个小问题

 · 2020-2-20 · 次阅读


OSPF的几个小问题

[TOC]

一、邻居状态机反向

ospf_1

1、 任何状态下。接口down,InactivityTimer(周期内没有从邻居接收到Hello包),KillNbr(现在不可能与该邻居有任何通讯);都会转换邻居状态到Down

2、 2-Way或更高状态下。1-WayReceived(从邻居接收到Hello包,但并不包含路由器自身);转换邻居状态到init状态

3、 Exchange或更高状态下。SeqNumberMismatch(在建立邻接的过程中出现了错误),BadLSReq(接收到的连接状态请求中,包含有并不存在于数据库中的LSA);转换到Exstart状态

4、 ExStart或更高状态。AdjOK?(是否需要与邻居路由器继续保持邻接),如果是,没有改变。如果否,邻居状态转换为2-Way。

二、DR/BDR选举

(1)记录网络上当前的DR和BDR数值,以用于以后的比较。

(2)按如下计算网络上的BDR:列表上的路由器中,只有那些不宣告自己为DR的才可能成为BDR。如果有一台或多台这样的路由器宣告自己为BDR(也就是说,在其Hello包中将自己列为BDR,而不是DR),选择其中拥有最高路由器优先级的成为BDR;如果相同,选择拥有最大路由器标识的。如果没有路由器宣告自己为BDR,选择列表中路由器拥有最高优先级的成为BDR,(同样排除宣告自己为DR的路由器),如果相同,再根据路由器标识。

(3)按如下计算网络上的DR。如果有一台或多台路由器宣告自己为DR(也就是说,在其Hello包中将自己列为DR),选择其中拥有最高路由器优先级的成为DR;如果相同,选择拥有最大路由器标识的。如果没有路由器宣告自己为DR,将新选举出的BDR设定为DR

在邻居状态机中有两处需要作出是否形成邻接的判断。第一,当与邻居的双向通讯初次建立;第二,当所接入网络上的DR(BDR)发生改变。如果决定不形成邻接,邻居状态就停留在2-Way。

因此DR、BDR有变化的时候,接口状态会相应改变,邻居状态如果已经处于full状态,需要继续保持邻接,则没有改变。

三、邻居状态到full的时间

ospf_2

两个路由,相连。在不同网络/情况下,到达full的时间,LSA少量。

1.P2P网络

当两个路由器端口同时UP的时候,启动Hello记时器,开始从接口上周期性地发送Hello包。如果接入的是物理点对点网络、点对多点网络或虚拟通道,接口状态转换为Point-to-Point. 由点对点网络、点对多点网络和虚拟通道连接的路由器始终形成邻接。从down转换为full的时间很快速,LSA少的情况下 几秒钟就可以

2.广播网络

如果是广播网络下,端口同时UP,启动Hello记时器,开始从接口上周期性地发送Hello包。邻居状态进入2-way状态。其接口状态成为Waiting,并开始Wait记时器,以试图发现所接入网络中的DR。在此状态时,路由器试图判定网络上DR和BDR。为此,路由器对其接收到的Hello包进行监听。在结束等待前,路由器不能被选举为DR或BDR。这可以避免不必要地改变DR和BDR。Wait记时器为40秒。选举出所接入网络的BDR和DR。按照选举的结果,接口的状态可能成为DR Other、Backup或DR。邻居状态此时才收到AdjOK?。广播环境下从DOWN到full,要几十秒,至少大于40秒以上

3.一个端口先UP,另外一个端口再UP

先起来的端口,发现只有自己一个路由的时候,会选举自己为DR,没有BDR。等另外一个端口起来的时候,启动Hello记时器,开始从接口上周期性地发送Hello包。邻居状态进入2-way状态。接口状态进入waitting状态。BackupSeen(收到邻居的Hello包,标明自己是DR,但没有BDR)事件触发进行选举。开始进行选举出所接入网络的BDR和DR。按照选举的结果,接口的状态可能成为DR Other、Backup或DR。邻居状态此时才收到AdjOK?。从DOWN到full,比广播情况,时间要快,估计几秒钟。

4.两台设备通过vlan接口建立full的邻居后,其中一台接口快速shutdown、undo shutdown一次,另一台上邻居状态会怎么变化?

本端口快速shutdown、undo shutdown,本端口状态在shutdown的时候,本端就会把邻居状态转换为DOWN,对端此时还是full。

1.undo shutdown之后,本端口开始发送hello报文,对端收到hello报文后,没有在hello报文中看到自己的router ID,也就是1-way事件。对端就会从full进入到init状态。然后两端开始重新建立邻接关系。

2.undo shutdown之后,本端先收到了对端 的hello报文,本端进入2-way状态,开始发送DD报文确认主从关系。对端收到后从full转换为Exstart

OSPF中有4种基本的网络类型:BMA,NBMA,P2P,P2MP。在这4种网络里,OSPF的5种报文所采取的单播或者多播的发送方式是不同的,分别如下:

  1. BMA网络:一般情况下,以组播形式发送Hello报文、LSU报文和LSAck报文,以单播形式发送DD报文和LSR报文。

  2. NBMA网络:所有报文都以单播形式发送。

  3. P2P网络:所有报文都以多播形式发送。

  4. P2MP网络:Hello报文以多播形式发送,其他报文以单播形式发送。

其中BMA网络也就是广播类型的网络,这种网络类型最为常见,报文的发送形式也稍微复杂一些,下面也着重介绍一下广播类型网络下的报文发送形式。

上面说到在BMA网络里“一般情况下”是这样的,那么不一般的情况下是什么样的呢?这里面以LSU报文最为特殊,如果大家抓包分析一下应该会发现,LSU报文有的时候是单播的,有的时候是多播的,那么什么时候是单播的什么时候是多播的呢?

当路由器主动发送LSU来更新网络的链路信息时,发送的LSU是多播的,因为如果是DR/BDR主动发送LSU,肯定是希望网络中所有的DRother都能收到,如果是DRother主动发送LSU,也肯定希望网络中的DR和BDR都能收到,而DR/BDR和DRother的地址都是多播地址。

当路由器是响应LSR来发送LSU时,发送的LSU的单播的,因为此时路由器已经知道具体是哪个路由器向自己请求的LSA,所以回复时采用单播LSU,发送LSR的路由器收到LSU后,再以组播的方式将汇总的LSU泛洪到网络里。

这里再补充一下LSAck为什么是组播的。

LSAck是对LSU中LSA的确认,分两种情况:

  1. DR/BDR连接的链路发生变化。(这里以DR连接的链路发生变化举例子)此时DR将LSU以224.0.0.5的组播地址泛洪给DRother和BDR,而后DR和BDR都需要DRother发送LSAck以确认收到了LSU报文,从而DR和BDR都知道DRother收到了LSU。而DRother也会要求BDR发送LSAck以确保BDR收到了DR发送的LSU,进而知道DR和BDR的链路状态数据库是一致的,所以DRother以224.0.0.6的组播地址发送LSAck,BDR以224.0.0.5的组播地址发送LSAck。
  2. DRother连接的链路发生变化。此时DRother A将LSU以224.0.0.6的组播地址发送给DR和BDR,DR收到后会把LSU重新封装后发给网络内的DRother,最初发送LSU的DRother A也会收到这个新的LSU,此LSU内包含之前A发过的LSA信息,从而使得DR向A隐含确认了。BDR收到A发来的LSU,会发送目标地址为224.0.0.5的LSAck报文来向所有的DRother确认,以说明BDR和DR都有A发的LSU里的LSA的信息,从而保证了链路状态数据哭 库的一致性。