OSPF基本工作原理详解


邻居关系的建立

在接口激活运行OSPF路由器会以组播(组播地址为224.0.0.5)的形式发送Hello包来发现和维护邻居关系。

       那么邻居关系是如何建立的呢?下面以一个点对点链路为例来讲解。(如下图)

  R1的接口激活OSPF后开始发送组播的Hello报文(目的IP地址为224.0.0.5),在该报文的OSPF头部信息中,填写着R1的Router-ID以及该接口的区域ID。另外,该Hello报文中,填写着该接口的网络掩码、Hello间隔、路由失效间隔,以及R1在该接口上所发现的邻居,由于此时R1并未在该接口上发现任何邻居,因此“邻居”字段为空。

(Hello报文格式)

  R2收到这个Hello报文后,首先会对这个Hello报文进行检查。由于双方使用以太网接口互联,在这种接口类型上,OSPF首先会检查双发的掩码是否一致,如不一致,则忽略该报文。此外R2还会检查接口的Hello间隔、路由失效间隔与收到的报文中的对应字段上是否一致,如不一致则忽略该报文(实际上R2对Hello报文的检查项并不局限于上述内容)。当Hello报文检查通过之后,R2将自己邻居表中的R1状态置为Init。

接下来,R2在自己发送的Hello报文的“邻居”字段中写入R1的Router-ID。而当R1收到R2发送过来的Hello报文并且在“邻居”字段中发现自己的Router-ID时,它意识到邻居R2已经发现自己了,并且认可了自己所发送的Hello报文中的相关参数,于是它将R2添加到自己的邻居表并把让R2的状态设置成2-way。

随后R1在自己发送的Hello报文的“邻居”字段加入R2的Router-ID,R2收到该报文后,在其邻居表中将R1的状态切换到2-way。

       至此,R1和R2形成了邻居关系。

       如果路由器的接口接入了一个多路访问的网络,那么OSPF邻居关系达到2-way之后,将开始进DR和BDR的选举。

DR和BDR的选举

       在广播网络和NBMA网络中,任意两台路由器之间都要传递路由信息。如果网络中有n台路由器,则需要建立n(n-1)/2个邻居关系。这使得如果有任何一台路由器的路由发生变化都会导致多次传递,浪费带宽资源。为解决这一个问题,OSPF定义了DR(Designated Router,指定路由器),所有路由器都只将信息发送给DR,由DR将网络链路状态发送出去,如下图所示。 

 

  如果DR由于某种故障而失效,则网络中的路由器必须重新选举DR,再与新的DR同步。这需要较长的时间,在这段时间内,路由计算是不正确的。为了能够缩短这个时间,OSPF提出了BDR(Backup Designated Router,备份指定路由器)的概念。

 

在多路访问的网络环境中(如广播网络,像普通的以太网)需要选举出一台DR和一台BDR,以下是DR/BDR的选举规则。

  1. OSPF priority最高者为DR。(默认所有路由器优先级为1,可以通过 ip ospf priority 接口命令修改)
  2. 如果优先级相同,则Router-ID最高的路由器为DR。(Router-ID为最大的接口IP地址,如果配置了loopback地址,则使用loopback地址作为Router-ID;如果配置了多个loopback,则以最高的loopback地址作为Router-ID;也可以通过router-id <address> 命令强制某个IP地址作为Rouer-ID)

 

PS:

  1.其中BDR的选择,是优先级仅次于DR的路由器。

  2.如果路由器的优先级设置为“0”,则该路由器不参与DR/BDR的选举,为DRother

  3.OSPF的DR(指定路由器)指的是路由器的一个活动接口,并非整台路由器。(DR和BDR只是一个接口概念

  4.DR不能抢占(若在一个OSPF多路访问网络中已经存在一台DR和BDR,如果DR down掉或重启,则BDR自动升级为DR,同时在该网络中重新选举一台BDR.当原DR重启后,虽然检测到目前运行的BDR的Router-ID比自己的低,但也只能作为BDR或DRother运行(如果已经选举了另一台BDR),这样在一定程度上确保了链路状态的稳定性)

 

DD报文的交互

  在ExStart(交换初始)状态下,路由器发送空的DD报文以便协商Master/Slave, Router-ID最大的路由器会成为Master路由器,DD序列号就是由Master路由器决定的.用于Master/Slaver协商的报文是空的、不携带任何LSA头部的DD报文,在这些报文中,I比特位被置为1。

开始时两者都认为自己是Master,因此各自都在DD报文中将MS比特位被设置为1。R1在自己发送的DD报文中写入自己设定的DD序列号——200,并且将MS比特位设置为1以向对端宣告自己的身份是Master。R2收到这个DD报文显然是不同意的,因为它 的Router-ID比R1更大,因此在它发送的DD报文中,MS比特位也被设置为1,DD序列号则被设置为它自己使用的序列号——300。

  在Exchange(交换)状态下,路由器向邻居发送描述自己LSDB的DD报文,DD报文中包含LSA头部信息(而不是完整的LSA数据),DD报文逐个发送,每个报文中都包含着DD序列号,DD序列号是由Master路由器决定的。这个序列号在DD报文交互的过程中被递增,以确保DD报文交互过程的有序性和可靠性。

  R1收到DD报文后接受了自己并非Master路由器的事实(因为自己的Router-ID确实要更小),然后将R2的状态切换到Exchange并发送带有LSA头部信息的DD报文,这个DD报文的序列号为300(也就是R2发送过来的序列号),M比特位置为1表示后续还有更多的DD报文,而MS比特位置为0(表示自己不是Master路由器)。

  接着R2收到了R1发送过来的DD报文,于是将R1的状态切换为Exchange,随后自己也开始发送携带LSA头部的DD报文,此时DD报文的序列号为301(在上一个序列号300的基础上加1),M及MS比特位均设置为1。由于双方的LSDB中都包含较多的LSA,因此需要交互多个DD报文,而在该过程中,Master路由器R2将DD报文序列号逐次加1,Slave路由器R1则使用前者的DD序列号来发送自己的DD报文,如此这般的有序进行。

  如下图所示,经过数次DD报文交互,R2发送的DD报文达到308,它继续在DD报文中发送自己剩余的LSA头部,R1收到该DD报文后,使用该DD报文发送了自己最后一个DD报文,在该报文中,它将M比特位置为0。

R2收到该DD报文后,继续发送自己的DD报文,描述剩余的LSA头部信,而恰好这也是它最后一个DD报文,它在该报文中将M比特位设置为0。

该报文到达R1后,虽然R1此时已经完全描述完了自己的LSDB,但是R1依然需要确认R2发送的最后一个DD 报文,于是它向R2发送了一个空的DD报文,该报文的序列号是309。

 

请求交互LSA

  R1及R2收到对方发送的最后一个DD报文后,便彻底了解了对方的LSDB中所包含的LSA头部,此时它们需要从对方获取感兴趣的LSA的完整数据,因此R1将R2的另据状态切换为Loading,R2同理。

       接下来便是数据库同步的过程。在Loading状态下,路由器向邻居发送LSR以便请求LSA的完整数据。对方使用LSU报文进行回复,因此只有LSU报文中才有LSA的完整信息。在收到LSU报文后,路由器需要发送LSAck对其中的LSA进行确认。

       R1向R2发送LSR报文,用于请求感兴趣的LSA,而R2则使用包含LSA完整数据的LSU报文进行回应。

同理,R2也向R1发送用于请求LSA的LSR报文,而R1也使用LSU报文进行回应。

双方可能会交互多个LSR及LSU报文,直到LSDB实现同步。

形成邻接关系

  R1和R2收到对方的LSU报文后,将报文中所包含的LSA加载到自己的LSDB中,并使用LSAck确认这些LSA。当R1或R2发现自己没有其他的LSA需要从邻居获取后,便将另据状态切换为Full。

至此,形成邻接关系。

       LSA交换完成之后,路由器获得完整的LSDB,运用SPF算法计算出最优路由加入OSPF协议中的路由表中。

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM