●
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
网络类型如下表所示:
接口类型
|
是否使用
DR/BDR
?
|
默认
Hello
间隔
|
是否需要
neighbor
命令?
|
同一子网是否允许两台以上的主机
|
broadcast
|
是
|
10
|
否
|
是
|
point-to-point
|
否
|
10
|
否
|
否
|
nonbroadcast
(
NBMA
)
|
是
|
30
|
是
|
是
|
point-to-multipoint
|
否
|
30
|
否
|
是
|
point-to-multipoint nonbroadcast
|
否
|
30
|
是
|
是
|
loopback
|
否
|
|
|
否
|
●在
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
。