●
在
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
信息头的列表)。