OSPF数据库交换过程

●在OSPF中,定义了五类消息用来交换链路状态广播(link-state advertisements,LSA)。交换LSA的过程不论在单域还是多域都差不多。

●OSPF路由器ID
OSPF路由器在发送消息之前,首先要选择一个唯一的32位标识作为其路由器标识(RID)。Cisco路由器通过下列步骤来选择:
1)先看是否在router ospf下用子命令router-id id配置了路由器ID,如果有即选择它。
2)再选择当前 “up and up”(物理和协议均up)的loopback接口上最大IP地址。
3)再选择当前 “up and up”的非loopback接口上最大IP地址。
虽然这个过程很简单,但还是有一些需要引起注意的:
1)获得RID的接口不一定要与OSPF的network命令匹配。
2)OSPF不必广播路由到RID的子网。
3)对IP路由表而言,RID也不必可达。
4)当OSPF进程启动时,都是从当前接口状态来选择RID。
5)如果OSPF进程重启或通过配置改变了RID,路由器会考虑改变OSPF的RID。
6)如果路由器RID改变了,在同一域的其他路由器必须重新进行SPF计算。
7)如果RID是通过router-id命令配置的,那么只要该命令不改变,路由器RID就不会变。

●发现邻接路由器,交换数据库,建立邻接关系
OSPF使用IP包(协议89)来封装五类消息,具体如下:
1)Hello消息:用来发现邻接路由器,建立邻接关系为2路状态,并监测邻接路由器的响应。
2)数据库描述(DD或DBD)消息:用来交换每个LSA的摘要版本,一般出现在初始拓扑交换中,这样路由器可以获悉邻接路由器的LSA列表。
3)链路状态请求(LSR)消息:请求一个或多个LSA,通告邻接路由器提供LSA的详细信息给发送路由器。
4)链路状态更新(LSU)消息:包含LSA的详细信息,一般用来响应LSR消息。
5)链路状态应答(LSAck)消息:用来确认收到LSU消息。
这些消息可以支持路由器发现邻接路由器(Hello),学习它们自己链路状态库(link-state database,LSDB)中没有的LSA(DD),请求并可靠交换LSA(LSR/LSU),以及监测邻接路由器是否有发生拓扑改变(Hello)。注意LSA本身不是OSPF的消息,它是一类数据结构,存放在路由器的LSDB中,并可包含在LSU消息中进行交换。
OSPF的LSDB交换过程:

OSPF路由器为每个邻接路由器维护一个状态机,可以使用show ip ospf neighbor命令显示当前邻接路由器的状态。随着LSDB交换的进行,邻接路由器的状态也会随之改变,最后稳定在完全状态(full state),意味着建立了完全的邻接关系。
LSDB交换进程详解:
1)成为邻接路由器(Hello进程)
Hello消息的三大功能:在子网中发现其他OSPF路由器;检查配置参数是否一致;监测邻接路由器健康状况。
为了发现邻接路由器,Cisco OSPF路由器在其所有激活OSPF的接口上监听发向224.0.0.5的多点传送Hello消息。Hello消息的源地址为路由器接口上的主IP地址。当两台路由器通过Hello消息互相发现之后,路由器会作如下参数检查:必须通过认证;必须在同一主子网内(包括掩码也要相同);必须在同一OSPF域;必须有同样的域类型;必须RID无重复;OSPF的Hello和Dead定时器必须相等。只有所有检查通过,两台路由器才可以建立邻接关系。注意:两台路由器的OSPF进程号(通过router ospf process-id命令配置)不需要匹配。另外,虽然MTU值在传送DD包时需要相等,但其检查并不在Hello消息中出现。
建立邻接关系之后,邻接路由器每隔hello间隔发送Hello消息,如果在长于dead间隔的时间内没有接收到来自邻接路由器的Hello消息,那么即认为该邻接路由器失效。Hello间隔默认在LAN接口是10秒,T1和更慢的WAN接口是30秒;而dead间隔默认为hello间隔的4倍。
2)广播LSA头信息到邻接路由器
当两台路由器建立邻接关系之后,并不急于发送包含LSA的包,而是先创建并发送DD包(其中包含了每个LSA的头信息)。这些头信息可以用来唯一地标识每个LSA。DD消息的传输使用的是OSPF定义的简单错误恢复过程。每个DD包分配一个序列号,接收端通过发送一个与接收到的DD包相同的包来进行确认。发送端使用的窗口大小为1,确认之后再发送下一个DD包。
3)数据库描述交换:主/从关系
在邻接关系建立起来之后(邻接关系的ExStart阶段),邻接路由器需要在数据库交换时确定哪个路由器是主路由器,哪个路由器是从路由器。拥有最高RID的路由器为主路由器,它可以发起数据库交换。此时,主路由器向从路由器发送DD包,而从路由器进行确认,在整个DD交换过程中只有主路由器可以增加序列号。
4)请求、获得并应答LSA
通过LSA头信息的交换,每台路由器获悉了邻接路由器的LSA列表,利用这些信息,路由器可以请求那些其LSDB中没有的LSA的完全版本。
要确定邻接路由器是否拥有一个LSA的更新版本,路由器需要在其LSDB中查看LSA的序列号,并与收到的DD包中的LSA的序列号进行比较。如果DD中LSA头信息的序列号更大,那么路由器就知道邻接路由器拥有更新的LSA,它会请求其发送该LSA的完全版本。(注意:LSA的起始序列号为0x80000001,每次递增1,然后到0x7FFFFFFF又重新从0x80000000开始。如果LSA的序列号为0x80000000,LSA必须在全网重新洪泛一次)
路由器使用LSR来请求LSA。邻接路由器响应包含所需LSA完全版本的LSU。该进程完成,两台路由器进入完全状态,这表示它们之间完整交换过数据库,它们的LSDB记录一致。
LSR/LSU进程使用可靠协议,所以需要进行应答。应答方式有两种:一种是直接使用收到的LSU包应答发送者,另一种是发送LSAck包来应答(其中包含了应答LSA信息头的列表)。

●LAN中的指定路由器
OSPF通过指定路由器(designated router, DR)来优化LSA的洪泛过程。如果不使用DR,共享一条数据链路的每对路由器都会建立完全的邻接关系。例如,如果LAN中有六个路由器,在没有DR的情况下,存在15个路由器对,这意味着要建立15次完全邻接关系,显然这样的效率是无法让人满意的。而DR(或后备DR,即BDR)的使用,可以有效地减少冗余LSA的不必要交换。
(注意:DR还有另一个主要功能,它可以用来创建表示子网的LSA类型2。)

步骤如下:
1)R1发送DD到所有DR多点传送地址(224.0.0.6);
2)DR用同样的DD包应答;
3)DR将同样的DD包再多点传送给所有SPF路由器(224.0.0.5)。
使用show ip ospf neighbor命令可以查看R1的邻接路由器状态,如下:

DR和BDR与所有邻接路由器建立完全邻接关系,而两个非DR(BDR)路由器不能建立这种关系,它们仅停留在2-way状态,这表示它们通过了Hello消息的参数匹配检查,但是不再进行后续DD包的交换。
这里再明确一下两个概念之间的差别:
1)邻接路由器(neighbors):两个路由器互相连通,它们交换Hello消息,且参数匹配。
2)邻接关系(adjacent):两个邻接路由器直接进行完全的DD和LSU包交换。

●DR的选举
DR的选举在路由器成为neighbors之后(2-way状态)开始,在发送DD包并进入ExStart状态之前完成。当在2-way状态时,如果接收到的Hello消息声明DR为0.0.0.0,这意味着现在还没有选举出DR,需要展开选举进程(一般这种情况发生在LAN中断恢复后),为了让所有路由器都参与选举,OSPF会设置一个等待时间,其值与Dead定时器一样。如果接收到Hello消息已经列出DR的RID,那么路由器不用选举,而是保留Hello中所声明的当前DR(一般这种情况发生在单个路由器失去LAN连接后又恢复时)。
DR/BDR的选举规则:
1)所有OSPF优先权在1-255之间的路由器在发送的Hello中将DR字段置为自身RID来参与选举;
2)路由器检查接收的Hello,查看其它路由器的优先权设置、RID以及是否参选;
3)如果在接收到的Hello中发现更有竞争力的DR参选者,路由器就不再参选,而是认为该
参选者应予当选;
4)认为参选者更有竞争力的首要条件是其有更高的优先权;
5)认为参选者更有竞争力的其次条件是其有更高的RID;
6)路由器并未参选DR,但拥有更高的优先权(或在优先权一样时,拥有更高的RID),则成为BDR;
7)如果在选举完后又来了新的路由器参选,或者原路由器提升了其优先权,它不能剥夺已有DR(BDR)并接替其位置。
8)DR选定后如果失效,则BDR接替其位置成为DR,同时选举新的BDR。

●WAN中的DR和OSPF网络类型
DR在LAN中的使用可以提升LSA洪泛的效率(多路由器时)。同样,在非广播式多接入网络(NBMA)中,也可以选择使用DR来提升效率。
对每个接口,Cisco基于OSPF网络类型来配置其是否使用DR以及其他一些关键属性,这主要包括:
1)是否在该接口选举DR;
2)是静态配置邻接路由器(使用neighbor命令),还是通过多点传送Hello包来动态发现邻接路由器;
3)是否允许在同一子网内有两个以上的邻接路由器。
默认情况下,LAN接口使用的OSPF网络类型是broadcast,此时选举DR,动态发现邻接路由器,并允许同一子网有两个以上路由器。对于HDLC和PPP连接,OSPF默认使用point-to-point的网络类型,此时不选举DR(因为没必要),动态发现邻接路由器,同一子网只有两个IP地址。
OSPF网络类型可以通过ip ospf network type接口子命令来设置。OSPF网络类型如下表所示:

●在NBMA网络上的OSPF网络类型
对于帧中继上的OSPF,网络类型可能用起来有点麻烦,主要有如下一些需要注意的地方:
1)确保默认的Hello/Dead定时器不会导致Hello参数匹配性检查失败。
2)一台路由器希望参选DR,而另一台路由器不参选,此时邻接关系可以建立并交换完全的LSA。但是,show命令的输出却可能有问题,下一跳路由器可能不可达。所以,确保在同一NBMA子网中的所有路由器使用的OSPF网络类型要不都使用DR,要不都不使用DR。
3)如果使用DR,DR和BDR到子网中的其他所有路由器必须都有一条PVC连接,否则,它们之间无法学习路由。
4)如果一台路由器使用静态neighbor命令配置了,那么PVC另一端的路由器就不需要再使用neighbor命令,但是为了清晰起见,还是两端同时配置为好。
帧中继上的OSPF有两个非常简单的网络类型选项:point-to-point(默认)和point-to-multipoint,它们都不需要DR和使用neighbor命令。

●OSPF网络类型(NBMA)配置实例

配置说明:
1)R1、R3和R5的配置是正确的,使用的是OSPF网络类型nonbroadcast。
2)R6配置有问题(遗漏了ip ospf priority命令),导致其错误地选为DR。
3)R4仍然用的是默认网络类型point-to-point,用show命令可以看出问题。
配置:
1)R1的配置:
router ospf 1
log-adjacency-changes detail
network 0.0.0.0 255.255.255.255 area 0
neighbor 10.1.111.3
neighbor 10.1.111.4
neighbor 10.1.111.5
neighbor 10.1.111.6
2)R3的配置:
interface Serial0/0.1 multipoint
ip address 10.1.111.3 255.255.255.0
ip ospf priority 0
frame-relay interface-dlci 100
!
router ospf 1
network 0.0.0.0 255.255.255.255 area 0 
3)R4的配置:
router ospf 1
network 0.0.0.0 255.255.255.255 area 0
4)R5的配置:
interface Serial0.1 multipoint
ip address 10.1.111.5 255.255.255.0
ip ospf priority 0
frame-relay interface-dlci 100
!
router ospf 1
network 0.0.0.0 255.255.255.255 area 0
5)R6的配置:
router ospf 1
network 0.0.0.0 255.255.255.255 area 0
注意事项:
1)OSPF的neighbor命令定义的邻接路由器优先权(默认0)被接收到的Hello消息中邻接路由器所声明的优先权所覆盖,这就是上面配置中R6会选举为DR的原因。
2)neighbor命令只需要在一个路由器上配置即可。
3)R4因为配置为point-to-point网络类型,所以它会跟R1建立完全邻接关系,即使如此,它却不能通过帧中继网络路由包到R3、R5和R6,这可能导致问题出现。

●SPF(最短路径优先)计算
SPF算法用于检查LSDB中的LSA来得出路由权值的数据模型。该数据模型包括:
1)路由器
2)链路
3)链路开销
4)链路当前状态

SPF会发现到每个子网的所有可能路由,并对路由器每个外发接口计算路由开销(cost),然后选择开销最小的路径,OSPF再将这些最小开销路由载入路由表。如上图,S2计算两条到子网10.5.1.0/24的可能路径,发现最短的是通过S2的VLAN 1接口(R2为下一跳路由器)。

●稳定状态下的操作
网络稳定下来之后,OSPF会继续保持的操作:
1)每台路由器基于接口hello间隔,发送Hello。
2)每台路由器期待在dead间隔之内接收到邻接路由器的Hello消息,如果没接收到,则认为该邻接路由器失效。
3)每台路由器基于每条LSA的链路状态刷新(LSRefresh)间隔(默认30分钟)重新广播LSA。
4)每台路由器希望在每条LSA的Maxage定时器(默认60分钟)时限内刷新LSA。



  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值