1. 链路状态通告LSA
LSA是Link-State Advertisements的缩写。在第一部分中,我们介绍了路由器之间进行LSA的传递和交换。而LSA包括路由器接口信息,邻居信息,链路开销等数据。路由器则靠着这些LSA来构建链路状态数据库并生成路由表。它一共有如下的11种LSA。
LSA Type | Name | |
---|
LSA Type 1 | OSPF Router LSA | |
LSA Type 2 | OSPF Network LSA | |
LSA Type 3 | OSPF Summary LSA | |
LSA Type 4 | OSPF ASBR Summary LSA | |
LSA Type 5 | OSPF ASBR External LSA | |
LSA Type 6 | OSPF Group Membership LSA | |
LSA Type 7 | OSPF Not So Stubby Area (NSSA) External LSA | |
LSA Type 8 | OSPF External Attributes LSA (OSPFv2) / Link Local LSA (OSPFv3) | |
LSA Type 9 | OSPF Link Scope Opaque (OSPFv2) / Intra Area Prefix LSA (OSPFv3) | |
LSA Type 10 | OSPF Area Scope Opaque LSA | |
LSA Type 11 | OSPF AS (Autonomous System) Scope Opaque LSA | |
1.1 Type 1 - Router LSA

- 区域内每台路由器有一个Router LSA,只在区域内泛洪,并不跨越ABR。
- 由始发路由器的Router ID来区分。
- 包括直连的所有接口及其分配的IP前缀和链路类型。
通过查看LSDB来分析下面的输出。
- 首先是在OSPF进程1下的R3(RID为3.3.3.3)上查看2.2.2.2的Router LSA。
- 可以看出来这个路由器是在Area 1。
- 直连的有两个链路,
- 一个为点到点的链路到RID为3.3.3.3的邻居,链路的地址为10.10.10.5。
- 另一个是末节网络,前缀为10.10.10.4/30。

在链路的信息部分,根据连接到的网络类型不同,Link ID的值也是不同的。
Link Type | Description | Link ID |
---|
1 | 点到点连接到另一台路由器 | 邻居的RID |
2 | 连接到多路访问网络 | 指定路由器的IP地址 |
3 | 连接到末节网络 | 网段的网络地址 |
4 | 虚链路 | 邻居的RID |
1.2 Type 2 - Network LSA

- 区域内每个多路访问网络有一个Network LSA,只在区域内泛洪,并不跨越ABR。
- 由多路网络选举的指定路由器DR来产生这条Network LSA。
- 包括连接到这个网络的所有路由器,DR,以及网络的前缀包含掩码。
通过查看LSDB来分析下面的输出。
- 产生这条Network LSA的DR的RID为3.3.3.3,在这个多路网络内的链路地址是192.168.123.3,网络的掩码是/24。
- 有3台路由器在这个多路网络中及其各自的RID。

1.3 Type 3 - Summary LSA

- 1类和2类LSA只在本区域内传播,当需要跨区域传播时,ABR负责将它们转化为3类的Summary LSA。这个3类LSA会传播到所有其他区域。
- 当生成的3类LSA再跨越到其他区域时,则由新的区域的ABR再重新这个3类LSA,这时的通告路由器则会变成这个新的区域的ABR。只是相当于告诉一个区域内的路由器,可以通过我来到达3类LSA的目标网络。
- 虽然名字是Summary LSA,但是实际上在生成3类LSA的时候,ABR默认不会汇总网络。
- 包括到从通告路由器的ABR到目标网络的开销。如果跨越多个ABR,开销值是累计的。在路由表中显示为 O IA。
通过查看LSDB可以看出在这个Area 1的网络中宣告3类LSA的路由器的RID是10.23.23.2。

1.4 Type 4 - ASBR Summary LSA

- 用来通告自治系统内所有其他区域可以通过我来到达ASBR。
- ASBR所在区域的ABR将ASBR的1类LSA生成4类LSA。在跨区域其他其他区域时,由该区域的ABR再重新生成这条4类LSA,并将通告路由器改成这个新的ABR。
- 包括到从通告路由器的ABR到ASBR的开销。如果跨越多个ABR,开销值是累计的。在路由表中显示为 O IA。

1.5 Type 5 - ASBR External LSA

- 用于宣告外部引入的路由,由引入此路有的ASBR发布,并在整个自治系统内传播。
- 在跨区域传播中并不会更改通告路由器ASBR的RID,需要通过4类LSA来找到ASBR。

1.6 Type 7 - NSSA External LSA

- 因为在NSSA区域不允许5类LSA的存在,所以引入了7类路由来承载一样的信息。
- 在区域ABR处,将重新转换为5类LSA。

1.7 其他LSA
- 6类LSA原计划是用于支持组播的,但是大部分厂商都不支持,事实上组播协议都是使用的PIM。
- 8类LSA在OSPFv2中计划用于携带重分布BGP路由的属性,但并不是标准的特性,大部分厂商并不支持。在OSPFv3中,用于在本地链路上通告Link-Local的IPv6地址。
- 9类LSA在OSPFv3中用于在区域内通告网络前缀,约等于OSPFv2的1类和2类LSA。
- 在OSPFv2中,9类(本地链路),10类(本区域),11类(本自治系统)都是Opaque LSA,用于携带非标准路由信息。不同厂商对Opaque LSA的支持程度也存在差异。
1.8 LSA序列号及更新
OSPF路由器每30分钟会更新其产生的LSA。LSA的序列号会增加,通过序列号来比较谁是最新的条目。每条LSA都有一个老化的计时器,设置为60分钟。如果60分钟内,LSA没有被更新,则会被从LSDB移除。如果收到了更新,则计时器重置。
在不连续的区域之间会用到虚连接,通过虚连接学到的SLA会被打上DNA(DoNotAge)的标识。这是因为虚链路被认为是demand circuit。这时,通过虚链路学到的SLA不会老化。

1.9 LSA操作

2. 邻居关系的建立
路由器通过交换Hello包来发现邻居关系。在检查Hello包中的特定参数或是选项后,路由器才可以宣布邻居起来了。
2.1 邻接属性
Hello包里携带的邻接属性直接影响链路两端的路由器能否建立起邻居关系。
- 路由器ID (唯一的)
- 接口IP地址(唯一的)
- 接口区域ID
- Hello和Dead间隔
- 接口网络地址
- 接口MTU
- 网络类型
- 认证
- 末节区域标识
- 其他的可选能力
当邻接属性不一致的情况下,大概略邻居关系不会起来,列举一些案例。
- 两端地址的掩码不同,也就是网络地址不同,会有如下的debug信息。
*Oct 1 14:54:57.432: OSPF-1 HELLO Gi1: Rcv hello from 1.1.1.1 area 0 10.0.13.1
*Oct 1 14:54:57.432: OSPF-1 HELLO Gi1: Mismatched hello parameters from 10.0.13.1
*Oct 1 14:54:57.432: OSPF-1 HELLO Gi1: Dead R 40 C 40, Hello R 10 C 10 Mask R 255.255.255.252 C 255.255.255.0
- 当两端的网络类型不配置时,如果广播和非广播网络,广播和点到多点等,这种情况下邻居关系都无法建立起来。要么是根本无法收到对端的Hello包,或是收到Hello包后显示参数不匹配。但是在广播网络和点到点网络的情况下,邻居是可以建立起来的,只不过是一边选举DR/BDR,另一端没有DR的选举。
- 两端的MTU不一致的时候,邻居关系会卡在EXSTART的阶段。
*Oct 1 15:12:19.019: OSPF-1 ADJ Gi1: Route adjust notification: UP/UP
*Oct 1 15:12:19.019: OSPF-1 ADJ Gi1: Interface going Up
*Oct 1 15:12:19.020: OSPF-1 ADJ Gi1: Interface state change to UP, new ospf state P2P
*Oct 1 15:12:47.692: OSPF-1 ADJ Gi1: 2 Way Communication to 1.1.1.3, state 2WAY
*Oct 1 15:12:47.692: OSPF-1 ADJ Gi1: Nbr 1.1.1.3: Prepare dbase exchange
*Oct 1 15:12:47.692: OSPF-1 ADJ Gi1: Send DBD to 1.1.1.3 seq 0x1120 opt 0x52 flag 0x7 len 32
*Oct 1 15:12:47.693: OSPF-1 ADJ Gi1: Rcv DBD from 1.1.1.3 seq 0x18E0 opt 0x52 flag 0x7 len 32 mtu 3000 state EXSTART
*Oct 1 15:12:47.693: OSPF-1 ADJ Gi1: Nbr 1.1.1.3 has larger interface MTU
2.2 建立邻居关系的过程
首先双方都要意识到对方的存在,也就是要达到一个2-Way的邻居。其次,双方同步LSDB信息完成后形成Full的邻居。

以直连的R1和R2为例,两个阶段的详细步骤如下:

- 最开始,R1和R2的邻居表都是空的,因为都没有收到对方的Hello包。这时候就是 Down 的状态。
- 当R2收到了R1的Hello包之后,但是在Hello包的Neighbor字段里没有看见自己的RID,这时会过渡到 Init 状态。R2会记录R1的RID,并附到给R1发送的Hello包里的Neighbor字段。
- 当R1收到了R1的Hello包之后,并发现Neighbor字段里有自己RID,这时就达到了 2-WAY 的状态。同理再返回给R2新的Hello包之后,R2也会到2-WAY 的状态。

- R1通过DBD包来向R2发送LSDB的摘要,并进入到了 Exstart 的状态。
- R2收到R1的DBD包后,也将自己的LSDB的摘要发送给R1,并进入到了 Exchange 的状态。
- R1和R2各自对比自己的LSDB和收到的对方的LSDB摘要。R1向R2通过LSR包请求其缺失的或过时的LSA,并进入到 Loading 的状态。
- R2通过LSU包将R1所需的全部LSA发送给R1,每个LSU包可以包含多个LSA,也可能需要发送多个LSU包。
- R1和R2通过LSAck确认从对方收到了相应的LSA,双方的LSDB同步成功,最终达到 Full 的状态。
2.3 DR的选举机制
对于多路访问网络,譬如以太网的广播网络,网络内的所有路由器会先选择DR(指定路由器)和BDR(备份指定路由器)。DR/BDR的选择机制是基于Hello包内携带的优先级参数(0-255),其规则如下:
- 默认值是1。如果优先级设置为0,则在DR/BDR选举中忽略这个路由器。
- 优先级高的成为DR,其次的成为BDR。
- 如果优先级相同,则RID大的成为DR/BDR。
- 每台路由器都在本地根据上述的选举规则选取DR/BDR。因为规则是一样的,所有路由器都会有同样的结果。
DR/BDR的行为:
- DR/BDR的选择没有抢占机制。当DR/BDR选举完成后,即使是更改或新加一台优先级更高的路由器,DR/BDR也不会改变。直到DR/BDR的OSPF进程重启或是DR/BDR挂掉了,才会重新按优先级重新选举DR。
- DR/BDR和所有的其他的路由器保持Full的邻居关系,其他的路由器之间保持2-Way的邻居关系。
- DR作为整个网络的枢纽,搜集所有的路由器的1类LSA,并分发给所有的路由器。DR负责生成网络的2类LSA。
- BDR只是同步DR的LSDB信息,在DR挂了之后才会接替DR的工作。
DR的选举过程:

- 在40秒的等待期内,不选举DR/BDR,所有的路由器发送自己的Hello包并监听收到其他路由器的Hello包。这时候的Hello包的DR/BDR地址为0.0.0.0,意味着还有DR/BDR。
- 如果路由器的优先级不是0,则会参加DR/BDR的选举,每个路由器都有参加选举的路由器列表。
- 在等待期,每台路由器都会跟其他路由器形成2-Way的邻居。
R1# sh ip ospf neighbor
Neighbor ID Pri State Dead Time Address Interface
2.2.2.2 1 2WAY/DROTHER 00:00:38 10.1.1.2 Ethernet0/0
3.3.3.3 1 2WAY/DROTHER 00:00:39 10.1.1.3 Ethernet0/0
4.4.4.4 1 2WAY/DROTHER 00:00:38 10.1.1.4 Ethernet0/0
- 在选举结束之前,并不会开始交换LSDB的过程。

- 40秒之后,每个路由器开始选举DR/BDR,并将其放入到Hello包之中。

- DR和BDR的选择结束后,邻居会变FULL的状态。
R1# sh ip ospf neighbor
Neighbor ID Pri State Dead Time Address Interface
2.2.2.2 1 2WAY/DROTHER 00:00:39 10.1.1.2 Ethernet0/0
3.3.3.3 1 FULL/BDR 00:00:32 10.1.1.3 Ethernet0/0
4.4.4.4 1 FULL/DR 00:00:31 10.1.1.4 Ethernet0/0