详解OSPF路由器完全邻接关系的建立过程

发布时间:2016-11-12 08:14

运行OSPF协议的路由器,如果你想正常运转的话,那么就得和其他的路由器建立完全邻接的关系。因为这种状态下,同一个区域中的所有的路由器的LSDB都是完全同步的、一致的。其实呢,应该反过来说,当同一个区域中的所有的路由器的LSDB的完全同步、一致的情况下,OSPF路由器才算是达到了这个完全邻接的状态!

有这么几个过程:

OSPF 处于 down 状态----à Init状态-----à 双向(two—way)状态-----à 邻接状态--à 预启动( exstart )状态 ------à 交换(exchange )状态----à 完全( full )邻接状态!

当配置了OSPF的路由器刚刚启动的时候,这个协议还是处于down的状态的,为什么呢?因为还没有其他的路由器和他交换信息啊。所以他接下来要做的就是通过所有的OSPF接口向外发送HELLO分组,并且分组的目标地址是224.0.0.5 (这个地址代表的是哪些路由器呢?我认识吧,他代表的是与发送HELLO分组的路由器直接相连的那些路由器,就是指的那些直连路由器。并且在这里需要说明的是,HELLO分组不会被路由,这个HELLO分组的行程只有一跳。那我们看到的“HELLO分组在整个区域中的多个路由器之间进行扩展”又该如何解释呢?HELLO分组在同一个区域中的多个路由器之间进行扩展,运用的不是路由功能,而是一个路由器发送这个HELLO分组到了直接相连的所有的路由器后,这些路由器就复制一个副本,并且将自己的信息添加进去后,就还是运用目标地址为224.0.0.5来分发这个HELLO分组到与自己直接相连的各个路由器上。就这样一直下去,以此类推!)

所有的直连OSPF路由器接收到这个路由器发送来的HELLO分组后,就将这个路由器加入到邻居列表中。这就是Init状态!(这里说的这个“邻居列表”说的是HELLO分组中的数据部分。如果不理解的话,可以去看看5种类型的OSPF分组的格式)。

所有的这些收到HELLO分组的路由器,都会向发送这个HELLO分组的路由器发送一个单播应答分组;其中包含着自己的信息(因为人家这个路由器也不是死的啊,人家也同时在进行这个过程啊,人家也有自己的一些邻居啊),这个发回去的应答分组中的“邻居列表”中自然是包含那个开始发送这个HELLO分组的路由器了。现在这个应答分组就是返回给他的。

原来那个路由器接收到这个应答分组后,先看看这个邻居列表中是否包含自己。如果包含自己的话,就说明一个问题:即对方已经知道我的存在了。并且接下来就将这个HELLO分组中带来的那些邻居表中包含的路由器ID加入到自己的LSDB中。这样一来呢,这些路由器就建立了双向( two-way )状态。到此为止,所有的路由器之间都建立了双向状态,即路由ID彼此出现在对方的邻居列表中;

接下来,要看看网络类型,确定下是否有必要进行DR与BDR的选举。如果这个网络属于广播类型的网络(如以太网),那么就需要进行选举。具体的选举过程可以自己去查阅相关的资料。选择了DR与BDR后,那么网络中的路由器都只与这种身份的路由器建立双向邻接关系,然后路由器之间才能进行交换链路状态信息。

注:当一个路由器加入到已经有DR与BDR的广播网络时,将同所有的路由器(包括DR、BDR、DROTHER)建立双向状态,但是只与DR与BDR建立双向邻接关系!并且我们需要知道的是,网络中的所有的路由器都会定期的进行HELLO包的交换,以确保通信不中断。默认的时间间隔是10S。这个HELLO分组中包含DR、BDR与一个路由器列表,其实他们都是邻居,也可以说是已经相互建立了双向状态的路由器。

还想来分析下这个“双向状态”与“邻接”状态的不同之处:

双向状态:这个状态下的路由器之间定期进行交换的是HELLO分组,通过这个HELLO分组可以学习到的是所有可能存在的邻居。这个定期的交换,指的是10S一次,并且这个对象说的是同一个区域中的所有的路由器,他们相互之间都会定期的进行这个动作,而不是某些具备特定条件的路由器才进行定期的交换!

邻接状态:这种状态是在“双向状态”状态下的一种提升。且,这种状态下进行交换的已经不是HELLO分组了,而是LSU了。并且,这种动作并不是定期的,而是触发式的,即只要有链路状态的改变,就会进行相应的LSU的建立、发送。并且这个动作也不是发生在同一个区域中的所有路由器之间了。而是发生具有特定身份的路由器之间的。即发生在一个普通的路由器(DROTHER)与一个特殊角色路由器(DR/BDR)之间。

上面是选举了DR、BDR,各个路由器与DR、BDR建立了双向邻接关系,此时路由器就是处于预启动(exstart)状态了。这个状态下,路由器已经做好了发现有关互联网络的链路状态信息并建立LSDB的准备。

处于预启动状态后,DR与BDR之间建立主从关系。接下来他们就开始互相交换DBD(此时就算是进入了交换状态),这个就是5种OSPF分组中的第二种。里面包含的是LSDB中LSA条目的摘要信息。LSA是关于链路或者网络的。摘要信息包括链路状态类型、通告LSA的路由器的IP地址、链路的成本和序列号。当路由器收到DBD后并不是将其中的包含的内容全部的收下,而是一步一步的采取下面的步骤:

1、首先给对方一个LSACK,来确认下已经收到了这个分组;

2、将收到的信息同本身的LSDB中信息进行比较。如果有更新的条目的话,那么就向发送方发送一个LSR(这时候你就想了,他知道这个LSR发给谁吗?只要想要的是什么吗?呵呵、当然知道了,因为这些信息都在发送来的LSA摘要信息中包含着呢。尤其是那个“通告LSA的路由器的地址”。)

3、对方用LSU分组进行响应,该LSU中包含着有关被请求的条目的完整信息。同样呢,收到这个LSU分组后,也要给对方一个LSACK进行确认下!

4、路由器将提供来的新的完整的LSA条目加入到自己的LSDB中。

彼此给对方提供所需要的全部LSA后相邻路由器就处于同步和完全的邻接状态了。

上面说的是DR与BDR之间完全邻接的这么一个过程,那么其他的互为邻接关系的路由器达到完全邻接的状态也是这么一个过程。其实说的就是DRother 与 DR之间的完全邻接过程!

那么如何来判定条目的新旧呢?通过摘要信息中的序列号字段就可以了,这个序列号是个长32位的字段,最小的一个序列号是0X80000001,最大的是0X8FFFFFFF。当序列号越大的时候,就表示越新!

路由器想转发数据流的话,必须处于完全邻接状态。至此,区域内所有路由器的LSDB都相同。

详解OSPF路由器完全邻接关系的建立过程的评论条评论