OSPF深度解析之邻居邻接

路由器ID是OSPF路由器的唯一标识

选择loopback接口上数值最高的IP地址
    比任何接口都稳定,路由器不换接口不倒
    在预先分配和识别ID地址有更多回旋余地
选择物理接口上数值最高的IP地址
选择IP地址的接口不一定需要运行OSPF协议

邻居和邻接

Hello报文协议

协议服务于以下几个目的:

发现邻居路由器的方法
成为邻居前,通过Hello报文协商参数,两台路由器必须相互认可的几个参数
Hello报文在邻居路由器之间担当Keepalive角色
确保了邻居路由器之间的双向通信
用来在广播网络或非广播多址NBMA网络上选定DR和BDR

每一个Hello报文都包含以下信息:

    始发路由器的路由器ID RID
    始发路由器接口的区域ID Area ID
    始发路由器接口的地址掩码
    始发路由器接口的认证类型和认证信息
    始发路由器接口的Hello时间间隔
    始发路由器接口的路由器无效时间间隔
        Cisco 缺省Hello间隔10s 无效时间间隔是Hello间隔的4倍
        NBMA 缺省Hello间隔30s
    路由器的优先级
    DR和BDR
    标识可选的性能的5个标记位
    始发路由器的所有有效邻居的路由器ID

路由器收到Hello报文,进行校验,所有参数匹配,认为报文有效。如果事发路由器的路由器ID在接受该Hello报文的接口的邻居表中列出了,那么路由器无效时间间隔计时器重置。如果始发路由器的路由器ID没有在邻居表中列出,那么就把这个路由器ID加入它的邻居表中。

无论何时,路由器发送一个Hello报文,都会在这个报文中列出传送该报文的链路上所出现的所有邻居的路由器ID。如果一台路由器收到了一个有效Hello报文,并在这个Hello报文中发现了它自己的路由器ID,那么这台路由器就认为双向通信(2-way communication)建立成功。

一旦双向通信成功建立,邻接关系就有了建立的基础。但并不是所有邻居路由器都会成为邻接对象,还取决于它们两所连网络的类型

网络类型

OSPF协议定义了5种网络类型

点到点 PTP
广播型 Broadcast
非广播多址 NBMA
点到多点 PTMP
虚链路 Virtual Links

1.点到点 PTP

总是能形成邻接。在这些网络上的OSPF报文的目的地址总是保留的D类地址224.0.0.5,这个组播地址称为 AllSPFRouters

2.广播型 broadcast

以太网,令牌环网和FDDI(“光纤分布式数据接口”),更确切的定义是广播型多址网络。它们可以连接多于两台的设别,而且由于它们是广播型,因而连接在这种网络上的所有设备都可以接收到个别传送的报文。

在广播型网络上的OSPF路由器会选举一个DR和BDR。Hello报文像所有始发于DR和BDR的OSPF报文一样,是以组播方式发送到 AllSPFRouters的。携带这些报文的数据帧的目的MAC地址是 0100.5E00.0005其他所有路由器都将以组播方式发送LSU和LSAck到保留的D类地址 224.0.0.6,这个组播地址称为 AllDRouters携带这些报文的数据帧的目的MAC地址是 0100.5E00.0006

3.非广播多址 NBMA 网络

X.25,帧中继和ATM等,可以连接两台以上的路由器,但没有广播数据包的能力。一个在NBMA网络上的路由器发送的报文将不能倍其他与之相连的路由器收到。导致,在这些网络上的路由器有必要增加另外的配置来获取它们的邻居。NBMA网络上的OSPF路由器需要选举DR和BDR,并且所有的OSPF报文都是单播的。

X.25,帧中继,ATM详解

4.点到多点 PTMP

是NBMA网络的一个特殊配置,可以看作一群点到点链路的集合,不需要选举DR和BDR,因为这些网络可以被看作点到点链路,而且OSPF报文组播

5.虚链路

后面补充,可以看作是 没有编号的点到点网络的一种特殊配置。单播发送

指定路由器和备份指定路由器

存在意义:
减少不必要的LSA通告。比如5台路由器会形成10个邻接关系,产生25条LSA通告,每台路由器都会收到重复的LSA通告。

在多址网络上选举一个指定路由器,它将完成以下工作:
描述这个多址网络和该网络上其他的路由器,
管理这个多址网络的泛洪过程

网络本身也将指定路由器看作是网络上的一个伪节点,或者一个虚拟路由器。网络上的每一台路由器都会和DR构成一个邻接关系。只有DR才发送LSA到网络中其他的路由器。指定路由器是一个路由器接口的特性,而不是整个路由器的特性。

BDR是DR的冗余,网络上的所有路由器也将和BDR形成邻接关系,DR和BDR也将形成邻接关系。

DR和BDR的选举是通过一个接口状态机的方式触发的,为了能够使选取的处理过程可以进行,需要满足以下一些前提条件:

1)每台路由器的每一个多点访问的接口都有一个路由器的优先级Router Priority,用一个8位的无符号整数表示,范围0-255。Cisco缺省优先级为1,通过ip ospf priority修改。具有0优先级的路由器不能成为DR或BDR
2)Hello报文包含了表示始发路由器指定的路由器优先级的字段,也包含了表示路由器认为可能是DR和BDR的相关接口的IP地址的字段
3)当一个接口在一个多址网络上开始有效时,它将把它的DR和BDR的地址设置为0.0.0.0。同时它也设置等待计时器Wait Timer 的值等于路由器无效时间间隔
4)在多址网络上已经存在的接口将把DR和BDR的地址记录进一个接口数据结构表中

选举过程

1.路由器和它的邻居路由器之间首先建立成功2-way,接着检查每台邻居路由器发送的Hello报文的优先级、DR和BDR等字段。列出所有具有DR和BDR选取资格的路由器列表(优先级大于0,邻居状态2-way);接着,所有路由器将宣称自己是DR路由器(Hello报文的DR字段是它们自身接口的地址);所有路由器也将宣称自己是BDR路由器(Hello报文的BDR字段是它们自身接口的地址)

2.从具有选取资格的路由器列表中,创建一个还没有宣告为DR路由器的所有路由器的子集(宣告自己为DR路由器的路由器不能被选取为BDR路由器)

3.子集中多个邻居路由器,它们在Hello报文中的BDR字段包含了自己接口地址,那么具有最高优先级的邻居路由器将被宣告为BDR路由器

4.在优先级相同的条件下,具有最高路由器ID的邻居路由器将被选为BDR路由器

5.如果多个具有选取资格的路由器在Hello报文的DR字段包含它们自己的接口地址,那么具有最高优先级的邻居路由器将被宣告为DR路由器。优先级相同的情况下,具有最高的路由器ID的里邻居路由器被选作DR路由器

6.如果没有路由器宣称自己是DR路由器,那么新选举的BDR路由器将成为DR路由器

7.如果正在执行计算的路由器是新选取的DR或BDR路由器,或者它不再是DR或BDR路由器了,那么重复以上2-6步骤

简单来说,当一台OSPF路由器有效active启动并去发现它的邻居路由器时,它将去检查有效的DR和BDR路由器。如果DR和BDR路由器存在的话,这台路由器将接受已经存在的DR和BDR路由器。如果BDR路由器不存在,将执行一个选取过程,选出具有最高优先级的路由器作为BDR路由器。如果存在多个路由器存在相同的优先级,那么在数值上具有最高的路由器ID的路由器将被选中。如果没有有效的DR路由器存在,那么BDR路由器将被推举为DR路由器,然后再执行一个选取过程选取BDR路由器。

注意的是,路由器的优先级可以影响一个选取过程,但它不能强制更换已经有效的DR或者BDR路由器。就是说在一个多址网络上,最先初始化启动的两台具有DR选取资格的路由器将成为DR和BDR(不能抢占)

一旦DR和BDR路由器选举成功,其他路由器DRothers将只和DR和BDR路由器之间形成邻接关系。所有路由器将继续以组播方式发送Hello报文到AllSPFRouters(224.0.0.5),因此它们能跟踪它们的邻居路由器,但是DRothers路由器只能以组播方式发送更新报文到AllDRouters(224.0.0.6)。只有DR和BDR路由器去侦听这个地址,反过来,DR路由器将使用组播地址224.0.0.5泛洪更新报文到DRothers

如果只有一台具有选取资格的路由器相连,那么这台路由器成为DR路由器,而且这个网络上没有BDR路由器。其他所有路由器都将只和这个DR路由器建立邻接关系。如果没有具有选取资格的路由器和一个多址网络相连,那么这个网络上将没有DR或者BDR路由器,而且也不建立任何邻接关系。在这种情况下,网络上所有路由器的邻居状态都将停留在“2-way”状态 (后面的“邻居状态机”细讲)

OSPF接口

接口数据结构:

Show ip ospf interface

接口数据结构

1.IP Address and Mask
2.Area ID
3.Process ID : 思科特有,区分不同OSPF进程
4.Router ID
5.Network Type
6.Cost
7.InfTransDelay (图中是Transmit Delay):LSA通告从路由器接口发送后经历的时间,以秒数计算,当LSA通告从接口发出后参数值将不断增大
8.State (OSPF接口状态机中讲)
9.Router Priority : 选举DR和BDR 0-255 ,思科缺省为1
10.Designed Router + Interface Address
11.Backup Designed Router + Interface Address
12.HelloInterval,RouterDeadInterval,Wait Time,RxmtInterval(图中是retransmit) :

--Hello报文间隔,      
--宣告邻居无效时间,
--开始选取DR和BDR之前路由器等待邻居路由器的Hello报文通告DR和BDR的时长,
--在没有得到确认的情况下,路由器重传OSPF报文要等待的时间长度。

13.Hello Timer : 当它超时后,路由器将从接口上发送一个Hello报文
14.Neighboring Routers : 在RouterDeadInterval的时间内可以收到来自于它们的Hello报文的那些邻居路由器
15.AuType : 认证类型。可以是NULL,简单口令或MD认证方式,图中是MD认证
16.Authentication Key : 简单认证——64位口令;加密认证——消息摘要密钥

OSPF接口状态机

一个启用OSPF协议的接口在它变成完全有效之前,将会在几种接口状态中间发生转换。这些接口状态是失效、点到点、等待、DR、备份、DRother和Loopback等
1.失效:初始化的接口状态。啥都没有
2.点到点:仅适用于和点到点、点到多点、虚电路等网络类型相连的接口。当切换到这个状态将开始每隔HelloInterval的时间发送一次Hello报文,并尝试建立邻接关系
3.等待:仅适用于和广播型、NBMA等网络类型相连的接口。当切换到这个状态将开始发送和接受Hello报文,并设置等待计时器的值。接口在这个状态,试图去识别DR和BDR
4.DR:在这种状态下,该路由器是所连网络的DR,并将和所有多址网络上的路由器建立邻接关系
5.BDR:在这种接口状态下,该路由器是所连网络的BDR,并将和所有多址网络上的路由器建立邻接关系
6.DRother:在这种接口状态下,该路由器将跟踪网络上所有的路由器,但仅仅和DR,BDR建立邻接关系
7.Loopback:在这种接口状态下,路由器的接口通过软件或硬件的方式成为环回端口。接口在这种状态不能发送报文,但接口的地址还是可以通过LSA通告出去

OSPF邻居

成功建立邻接四阶段

  • 邻居路由器发现阶段
  • 双向通信阶段
  • 数据库同步阶段
  • 完全邻接阶段

邻居关系的建立和维持都是通过交换Hello报文实现的。在广播和点到点网络里,Hello报文以组播方式发送给组播地址AllSPFRouters(224.0.0.5)。在NBMA类型、点到多点和虚链路类型的网络里,Hello报文是以单播方式发送给每个单独的邻居路由器。
在NBMA类型的网络中,路由器每经PollInterval(Cisco缺省60s)的时间给它邻居状态为Down的邻居发送一次Hello报文。在其他的网络类型中,路由器每经过HelloInterval的时间给它的邻居路由器发送一次Hello报文。

邻居数据结构

Show ip ospf neighbor

邻居数据结构

1.Neighbor ID : 此处为192.168.30.105
2.Neighbor IP Address : OSPF报文以单播方式发送给邻居路由器时,这个地址就是目的地址,此处为192.168.16.41
3.Area ID : 收到的报文区域ID必须和接受接口配置的区域ID匹配,此处为0
4.Interface : 与邻居路由器所在的网络相连的接口,此处邻居路由器通过s0接口到达的
5.Neighbor Priority : 选举DR和BDR过程中使用,此处为缺省值1
6.State : 邻居路由器的状态,此处为FULL 完全建立邻接关系
7.PollInterval : 只用于NBMA网络上的相关路由器。因为在NBMA上,邻居路由器可能无法自动地被本地路由器发现,因此,如果邻居状态是失效Down 的,每经过一个PollInterval时间就会发送一个Hello报文给它的邻居路由器,此处为60s
8.Neighbor Options : 这是邻居路由器支持的一些可选的OSPF性能
9.Inactivity Timer : 这是一个时长RouterDeadInterval(在接口数据结构中定义)的计时器。从邻居那收到Hello报文,计时器重制;超时了还没从邻居收到Hello报文,那么邻居路由器将被宣告为失效Down。此处用Dead Timer表示,将在100s后超时

邻居状态机

失效状态 Down
  邻居会话的初始状态,指明在最近一个RouterDeadInterval时间内还没收到来自于邻居路由器的Hello报文。除非在NBMA网络,否则Hello报文是不会发送给失效的邻居路由器的。当邻居路由器转换到了失效状态,路由器将清空链路状态重传列表,数据库摘要列表和链路状态请求列表
尝试状态 Attempt
  仅适用于NBMA网络上的邻居,在NBMA网络上邻居路由器是手工配置的。当NBMA网络上具有DR选取资格的路由器和邻居路由器相连的接口开始变为有效Active时,或者当这台路由器成为DR或BDR时,这台DR会把邻居路由器的状态转换到Attempt状态。在此状态,路由器将用HelloInterval的时间代替PollInterval的时间来作为向邻居发送Hello报文的时间间隔
初始状态 Init
  表明在最近的RouterDeadInterval时间内路由器收到了来自邻居路由器的Hello报文,但双向通信还没建立起来。路由器将会在Hello报文的邻居字段中包含这种状态下或更高状态的所有邻居路由器的路由器ID
双向通信状态 2-Way
  表明本地路由器已经在来自于邻居路由器的Hello报文的邻居字段中看到了它自己的路由器ID,成为了2-Way状态。在多址网络中,此状态进行DR和BDR选举。如果在Init状态下从邻居路由器收到一个DBD报文,也可以引起邻居状态直接转换到2-Way状态
信息交换初始状态 ExStart
  在这一状态,本地路由器和邻居将建立主/从关系,并确定数据库描述报文DBD的序列号,为DBD的信息交换做好准。在这里具有最高的接口地址的邻居路由器将成为主路由器
信息交换状态 Exchange
  在这一状态,本地路由器将向邻居路由器发送可以描述它整个链路状态数据库信息的DBD报文。同时在这个状态下,本地路由器会通过对方发来的DBD,发现最新的LSA通告
信息加载状态 Loading
  在这一状态下,本地路由器会向邻居路由器发送LSR报文,来请求最新的LSA通告。虽然在Exchange状态下发现了这些最新的LSA通告,但本地路由器还没收到这些LSA通告
完全邻接状态 Full
  在这一状态,邻居路由器之间建立完全邻接关系,这种邻接关系出现在路由器LSA和网络LSA中

在数据库描述报文(DBD)里有3个标记位用来管理邻接关系的建立过程:

I位,初始位,当需要指明所发送的是第一个DBD报文时,该位设置为1
M位,后继位,当需要指明所发送的还不是最后一个DBD时,该位设置为1
MS位,主/从位,当DBD报文始发于一个主路由器时,该位设置为1

同步OSPF数据库过程:

  当两台邻居路由器在ExStart状态开始主/从关系协商时,它们都将通过发送一个MS位为1的空的DBD报文来宣称自己是主路由器。具有较低路由器ID的邻居路由器成为从路由器,并恢复一个MS位为0的DBD报文——这个DBD报文的序列号设置为主路由器的序列号。同时,这个DBD报文也将是第一个携带LSA摘要信息的报文。协商完主/从关系后转换到Exchange状态
  在Exchange状态,开始同步它们的LSDB,同步LSDB的操作是通过描述它们各自的LSDB的所有条目来实现的。数据库摘要列表由路由器的LSDB中所有的LSA通告头部组成,而本地路由器将向它的邻居路由器发送包含这些LSA头部列表的DBD报文