在网段上(广播或非广播网络类型),所有非指定/后备指定路由器,都将与指定路由器与选出的后备指定路由器(若有选出后备指定路由器)建立临接关系,而不会与网段上的其它非指定/后备指定路由器形成临接关系。这些非指定/后备指定路由器,将往全指定路由器多播组地址(the AllDRRouters Multicast group address)`224.0.0.6`发出报文与更新。只有指定路由器与后备指定路由器才会收听发到此组地址的多播报文。随后指定路由器将通告报文给全SPF路由器多播组地址(the AllSPFRouters Multicast group address)`224.0.0.5`。这就令到网段上的所有其它OSPF路由器接收到更新。
重要的是记住在OSPF下,一旦指定路由器与后备指定路由器被选出,那么在进行另一次选举之前,它们都将始终作为指定/后备指定路由器。比如,在某个多路访问网络上已存在一台指定路由器与一台后备指定路由器的情况下,一台有着更高优先级或IP地址的路由器被加入到该同一网段时,既有的指定与后备指定路由器将不会变化。在指定路由器失效时,接过指定路由器的角色的是后备指定路由器,而不是新加入的有着更高优先级或IP地址的路由器。此外,一次新的选举将举行,而那台路由器极有可能被选举为后备指定路由器(Instead, a new election will be held and that router will most likely be elected BDR)。而为了让那台路由器成为指定路由器,就必须将后备路由器移除,或使用`clear ip ospf`命令对OSPF进程进行重置,以强制进行一次新的指定/后备指定路由器选举。一旦完成选举,OSPF像下面这样来使用指定与后备指定路由器:
- 用于减少网段上所要求的临接关系(To reduce the number of adjacencies required on the segment)
- 用于对多路访问网段上的路由器进行通告(To advertise the routers on the Multi-Access segment)
- 用于确保所有更新送达网段上的所有路由器
为了更好地掌握这些基础概念,这里参考下图39.2中的基本OSPF网络拓扑:
![OSPF指定与后备指定路由器基础](images/3902.png)
*图 39.2 -- OSPF 指定与后备指定路由器基础*
在图39.2中,网段上的各台路由器与指定及后备指定路由器之间建立临接关系,但相互之间并不建立临接关系(Referencing Figure 39.2, each router on the segment establishes an adjacency with the DR and the BDR but not with each other)。也就是说,非指定/后备指定路由器之间不会建立临接关系。这一特性阻止网段上的路由器形成相互之间的`N(N-1)`个临接关系,从而降低过多的OSPF数据包在网段上泛滥。
对于第二点,OSPF将一条链路,视为两台路由器或两个节点之间的连接。在多路访问网络,比如以太网中,多台路由器可处于同一网段上,就如同图39.2中所演示的那样。在这样的网络中,OSPF使用网络链路状态通告(Network Link State Advertisement, Type 2 LSA, 类型2的链路状态通告),来对多路访问网段上的路由器进行通告。这种链路状态通告是由指定路由器生成,并仅在该区域传播。因为其它非指定/后备指定路由器并不在各自之间建立临接关系,所以此类链路状态通告就令到那些路由器知悉在该多路访问网段上的其它路由器了。
为进一步说明这一点,这里参考图39.2, 假定该网段上的所有路由器都具有默认的OSPF优先级`1`(并同时加载OSPF进程),因为`R4`有着最高的路由器ID而被选为指定路由器。`R3`因为有着第二高的路由器ID而被选为后备指定路由器。因为`R2`与`R1`既不是指定也不是后备指定路由器,因此它们为称为思科命名法中的`DROther`路由器。可在所有路由器上使用`show ip ospf neighbour`命令对此进行验证,如下所示:
> **注意:** 那些`DROther`路由器之所以处于`2WAY/DROTHER`状态,是因为它们仅与指定及后备指定路由器交换它们的数据库。那么就因为`DROther`路由器之间没有完整的数据库交换,所以它们绝不会达到OSPF完整临接状态(The DROther routers remain in the `2WAY/DROTHER` state because they exchange their databases only with the DR and BDR routers. Therefore, because there is no full database exchange between the DROther routers, they will never reach the OSPF FULL adjacency state)。
因为`R4`已被选为指定路由器,它就生成网络链路状态通告(the Network LSA),这类链路状态通告,是就该多路访问网段上的其它路由器进行通告的。可在网段上的任意路由器上,使用`show ip ospf database network [link state ID]`命令,或在指定路由器上使用`show ip ospf database network self-originate`命令,对此加以验证。下面演示了在指定路由器(`R4`)上命令`show ip ospf database network self-originate`命名的输出:
```console
R4#show ip ospf database network self-originate
OSPF Router with ID (4.4.4.4) (Process ID 4)
Net Link States (Area 0)
Routing Bit Set on this LSA
LS age: 429
Options: (No TOS-capability, DC)
LS Type: Network Links
Link State ID: 192.168.1.4 (address of Designated Router)
Advertising Router: 4.4.4.4
LS Seq Number: 80000006
Checksum: 0x7E08
Length: 40
Network Mask: /24
Attached Router: 4.4.4.4
Attached Router: 1.1.1.1
Attached Router: 2.2.2.2
Attached Router: 3.3.3.3
```
参考上面的输出,指定路由器(`R4`)发起了表示`192.168.1.0/24`子网的类型2(网络)链路状态通告(the Type 2(Network) LSA)。因为该子网上存在多台路由器,所以该`192.168.1.0/24`子网被称作OSPF命名法中的一条传输链路(a transit link in OSPF terminology)。输出中的通告路由器字段(the Advertising Router field)显示了生成此链路状态通告的那台路由器(`4.4.4.4`, `R4`)。网络掩码字段(the Network Mask field)则显示了该传输网络的子网掩码,也就是24位,或`255.255.255.0`。
区域边界路由器(An Area Border Router, ABR),是一台将一个或多个OSPF区域,连接到OSPF骨干的OSPF路由器。这就意味着其必须有一个接口在`Area 0`中,同时有其它接口在某个不同的OSPF区域中。区域边界路由器是所有其归属区域的成员,且它们保有着每个其所归属区域的一个单独链路状态数据库(ABRs are members of all areas to which they belong, and they keep a seperate Link State Database for every area to which they belong)。参考图39.5, `R3`就应被认为是一台区域边界路由器,因为它将`Area 2`连接到了OSPF骨干`Area 0`。
而传统意义上的自治系统边界路由器,则是位处路由域的边沿,且定义了内部与外部网络的边界(An Autonomous System Boundary Router(ASBR), in the traditional sense, resides at the edge of the routing domain and defines the boundary between the internal and the external networks)。参考图39.5, `R2`将被认为是一台自治系统边界路由器。除了注入来自其它协议(比如BGP)的路由信息外,在某台路由器将静态路由或是所连接的子网,注入到OSPF网络时,也可将其划分为自治系统边界路由器。
OSPF路由器发出的不同类型数据包,包含在这些数据包共有的、24字节的OSPF头部(The different types of packets sent by OSPF routers are contained in the common 24-byte OSPF header)。尽管对该OSPF头部细节的深入,超出了CCNA考试要求的范围,但对该头部中所包含的各个字段,以及它们各自用途的基本掌握,仍然重要。下图39.6对此各种数据包共有的24个八位OSPF头部,进行了演示:
- 类型5 = 链路状态确认数据包(Link State Acknowledgement packet)
### OSPF `Hello` 数据包
`Hello`数据包用于发现其它直接相连的OSPF路由器,以及在OSPF路由器之间建立OSPF临接关系(OSPF adjacencies between OSPF routers)。对于广播及点对点网络,OSPF使用多播来发送`Hello`数据包。这些数据包被投送到`AllSPFRouters`多播组地址`224.0.0.5`。对于非广播链路(比如帧中继),OSPF使用单播(Unicast)来将`Hello`数据包直接发送给那些静态配置的邻居。
在各台OSPF路由器对其本地数据库信息进行通告时,于数据库交换期间,就要用到数据库描述数据包。这些数据包通常被称作DBD数据包或DD数据包。第一个DBD数据包用于数据库交换过程的主从选举。DBD数据包还包含了由主路由器选定的初始序列编号(The first DBD packet is used for the Master and Slave election for database exchange. The DBD packet also contains the initial sequence number selected by the Master)。有着较高路由器ID的路由器,成为主路由器并发起数据库同步过程。只有主路由器才能增加DBD数据包中的序列编号。主路由器开启数据库交换,并对从路由器进行信息轮询。数据库交换中的主从选举,是在邻居对的基础上进行的。
明白主从选举过程不同于指定与后备指定路由器的选举过程,尤为重要。通常后错误地假定它们一致(This is commonly incorrectly assumed)。主从选举过程只基于有着最高IP地址的路由器(两台邻居路由器之间)一条原则;但指定与后备指定路由器选举过程,则由IP地址或优先级值两个因素决定。
在选出了主从路由器后,本地路由器就通过往对方路由器发送LSA头部,而使用DBD数据包对本地数据库进行概括(After the Master and Slave have been elected, DBD packets are used to summarise the local database by sending LSA headers to the remote router. LSA,Link-State Advertisement, 链路状态通告)。远端路由器分析这些头部,以判断在其自己的LSDB拷贝中是否缺少什么信息。下图39.9中对数据库描述数据包进行了演示:
![OSPF的数据库描述数据包](images/3909.png)
*图 39.9 - OSPF的数据库描述数据包*
在DBD数据包中,两字节的接口MTU字段包含了发出接口的8位二进制的MTU值(the 2-byte Interface MTU field contains the MTU value, in octets, of the outgoing interface)。也就是说,该字段包含了通过相关接口所能发送的最大数据大小(以字节计)。当在虚拟链路上使用接口时,该字段就被设置为值`0x0000`。有了成功建立OSPF的邻居临接关系,所有路由器上的MTU必须一致。如在一台路由器上修改了这个值,就必须在相同子网的所有其它路由器上配置同样的值(或使用`ip ospf mtu-ignore`命令)。
其后的数据库描述或标志字段,是一个1字节的、在临接关系形成过程中,提供某台OSPF路由器可否就多个DBD数据包,与邻居进行交换的能力的字段(The Database Description or Flags field is a 1-byte field that provides an OSPF router with the capability to exchange multiple DBD packets with a neighbour during an adjacency formation)。
接着的4字节DBD序列号字段(The 4-byte Sequence Number field),通过使用一个序列号,而用于确保所有DBD数据包在同步过程中,得以接收与处理。主路由器在第一个DBD数据包中,将该字段初始化为一个独特值,其后的每个数据包的序列号都增加`1`。序列号的增加,仅由主路由器进行。
链路状态更新(LSU)数据包是由路由器用于对链路状态通告进行通告的数据包(advertise Link State Advertisements)。链路状态更新数据包可以是到OSPF邻居的单播,作为从邻居处接收到链路状态请求的回应。然而最为常见的是,它们被可靠地在整个网络中泛洪到`AllSPFRouters`多播组地址`224.0.0.5`,直到所有路由器都有一份数据库的拷贝位置。所泛洪的更新,于随后在链路状态通告的确认数据包中加以确认。如链路状态通告未被确认,就会默认每隔5秒加以重传。下图39.11展示了一个发送给某个邻居的、作为LSR响应的链路状态更新数据包:
![单播的LSU数据包](images/3911.png)
*图 39.11 - 单播的LSU数据包*
下图 39.12 演示了一个可靠地泛洪到多播组地址`224.0.0.5`的LSU:
![多播LSU数据包](images/3912.png)
*图 39.12 - 多播LSU数据包*
链路状态更新数据包由两部分构成。第一部分是4字节的链路状态通告数目字段(the 4-byte Number of LSAs field)。该字段显式了LSU数据包中所运送的LSA条数。第二部分则是一条或多条的链路状态通告。此可变长度字段包含了完整的LSA。每种类型的LSA都有共同的头部格式,与其各自特定的用来描述各自信息的数据字段。一个LSU数据包可包含单一的LSA或多条的LSA。
在思科IOS软件中,可使用`show ip ospf traffic`命令来查看OSPF数据包的统计信息。该命令展示了发送及接收道德OSPF数据包的总数,并将这些OSPF数据包细分到单独的OSPF进程,最终又细分到具体进程下开启了OSPF进程的各个接口上。该命令也可用于对OSPF临接关系建立的故障排除,其作为调试用途时,不是处理器占用密集的方式。下面的输出中演示了该命令所打印的信息:
```console
R4#show ip ospf traffic
OSPF statistics:
Rcvd: 702 total, 0 checksum errors
682 hello, 3 database desc, 0 link state req
12 link state updates, 5 link state acks
Sent: 1378 total
1364 hello, 2 database desc, 1 link state req
5 link state updates, 6 link state acks
OSPF Router with ID (4.4.4.4) (Process ID 4)
OSPF queue statistics for process ID 4:
InputQ UpdateQ OutputQ
Limit 0 200 0
Drops 0 0 0
Max delay [msec] 4 0 0
Max size 2 2 2
Invalid 0 0 0
Hello 0 0 1
DB des 2 2 1
LS req 0 0 0
LS upd 0 0 0
LS ack 0 0 0
Current size 0 0 0
Invalid 0 0 0
Hello 0 0 0
DB des 0 0 0
LS req 0 0 0
LS upd 0 0 0
LS ack 0 0 0
Interface statistics:
Interface Serial0/0
OSPF packets received/sent
Invalid Hellos DB-des LS-req LS-upd LS-ack Total
Rx: 0 683 3 0 12 5 703
Tx: 0 684 2 1 5 6 698
OSPF header errors
Length 0, Auth Type 0, Checksum 0, Version 0,
Bad Source 0, No Virtual Link 0, Area Mismatch 0,
No Sham Link 0, Self Originated 0, Duplicate ID 0,
Hello 0, MTU Mismatch 0, Nbr Ignored 0,
LLS 0, Unknown Neighbor 0, Authentication 0,
TTL Check Fail 0,
OSPF LSA errors
Type 0, Length 0, Data 0, Checksum 0,
Interface FastEthernet0/0
OSPF packets received/sent
Invalid Hellos DB-des LS-req LS-upd LS-ack Total
Rx: 0 0 0 0 0 0 0
Tx: 0 682 0 0 0 0 682
OSPF header errors
Length 0, Auth Type 0, Checksum 0, Version 0,
Bad Source 0, No Virtual Link 0, Area Mismatch 0,
No Sham Link 0, Self Originated 0, Duplicate ID 0,
-`Down`状态就是所有OSPF路由器的开始状态。然而,即便在所指定的路由器死亡间隔,那个接口尚未接收到`Hello`数据包,本地路由器仍可在此状态中显示出一个邻居(However, the local router may also show a neighbour in this state when no Hello packets have been recieved within the specified router dead interval for that interface)。
- 在OSPF路由器接收到来自邻居的`Hello`数据包,而本地路由器ID并未在接收到的邻居字段(the received Neighbor field)中列出时,就到了`Init`状态。如OSPF`Hello`数据包的参数不匹配,比如各种计时器值等,那么OSPF路由器就再也不会进到此状态之后的状态了。
-`Exchange`状态就是路由器使用DBD数据包对它们的数据库内容进行描述的地方。各个DBD序列被显式的确认,同时一次只允许一个突出的DBD。在此期间,LSR数据包已被发出,以请求LSA的一个新的实例(Each DBD sequence is explicitly acknowledged, and only one outstanding DBD is allowed at a time. During this phase, LSR packets are also sent to request a new instance of the LSA)。在此阶段,`M`(更多)位被用于请求缺失的信息(The `M`(More) bit is used to request missing information during this stage)。在两台路由器都完成了其完整数据库的交换后,它们将把该`M`位设置为`0`。
在思科IOS软件中,要查看链路状态数据库的内容,就使用`show ip ospf database`命令。在不带关键字使用此命令时,将打印出路由器连接的所有区域的LSA汇总。该命令支持几个有着更高的粒度的关键字,从而允许管理员将输出限制到仅特定类型LSA、仅由本地路由器通告的LSA,甚至OSPF中其它路由器通告的LSA。
尽管对每个关键字用法的输出进行演示是不现实的,但下面的小节仍对不同类型的LSA,以及与`show ip ospf database`命令结合使用从而查看到这些LSA的详细信息的一些常见关键字,进行了介绍。该命令所支持的关键字,在下面的输出中进行了演示:
```console
R3#show ip ospf database ?
adv-router Advertising Router link states
asbr-summary ASBR Summary link states
database-summary Summary of database
external External link states
network Network link states
nssa-external NSSA External link states
opaque-area Opaque Area link states
opaque-as Opaque AS link states
opaque-link Opaque Link-Local link states
router Router link states
self-originate Self-originated link states
summary Network Summary link states
| Output modifiers
<cr>
```
### 路由器链路状态通告(类型1)
**Router Links State Advertisements(Type 1)**
类型1的LSA,是由各台路由器为其所属的各个区域所生成的。路由器LSA列出了始发路由器的路由器ID(The router LSA lists the originating router's router ID)。每台单个的路由器都将为其所处的区域,生成一条类型1的LSA。路由器LSA是`show ip ospf database`命令输出中最先打印出的LSA类型。
### 网络链路状态通告(类型2)
**Network Link State Advertisements(Type 2)**
OSPF使用网络链路状态通告(类型2的LSA),来在多路访问网段上对路由器进行通告(OSPF uses the Network Link State Advertisement(Type 2 LSA) to advertise the routers on the Multi-Access segment)。此类LSA是由指定路由器生成的,且仅在区域中传播(flooded)。因为其它非指定/后备指定路由器并不在相互之间建立临接关系,所以网络LSA就令到这些路由器对该多路访问网络上的其它路由器有所知悉。
### 网络汇总链路状态通告(类型3)
**Network Summary Link State Advertisement(Type 3)**
网络汇总LSA是一条本地区域之外,但仍出于OSPF域中的目的(网络)的汇总。也就是说,此类LSA同时对区域间及区域内的路由信息进行通告(The Network Summary(Type 3) LSA is a summary of destinations outside of the local area but within the OSPF domain. In other words, this LSA advetises both inter-area and intra-area routing information)。网络汇总LSA没有携带任何的拓扑信息。而是在该类型的LSA中唯一包含的信息,就是一个IP前缀(an IP prefix)。类型3的LSA是由区域边界路由器生成的,并被泛洪到所有临接区域(adjacent areas)。默认情况下,每条类型3的LSA都与一条单独的路由器或网络LSA,以一一对应的形式相匹配(By default, each Type 3 LSA matches a single Router or Network LSA on a one-for-one basis)。也就是说,对于每条单独的类型1及类型2的LSA,都存在着一条类型3的LSA。特别要留意这些LSA是如何在与OSPF骨干(区域)的联系下被传播的。此种传播或泛洪,按照下面这样进行(Special attention must be paid to how these LSAs are propagated in relation to the OSPF backbone. This propagation or flooding is performed as follows):
- 对于区域内的路由(也就是对于类型1及类型2的LSAs),网络汇总(类型3)的LSA自非骨干区域被通告至OSPF骨干(区域,Network Summary(Type 3) LSAs are advertised from a non-backbone area to the OSPF backbone for intra-area routes(i.e., for Type 1 and Type 2 LSAs))
**ASBR Summary Link State Advertisements(Type 4)**
类型4的LSA对有关自治系统边界路由器的信息进行描述(The Type 4 LSA describes information regarding the Autonomous System Boundry Router(ASBR))。此类LSA包含了与类型3 LSA的相同数据包格式,并以一些显著的差异,完成同样的基本功能。与类型3的LSA类似,类型4的LSA是由区域边界路由器生成的。两种LSAs的通告路由器字段(the Advertising Router field)都包含着生成该汇总LSA的区域边界路由器的路由器ID。但是,类型4的LSA使用区域边界路由器,为仅有某条路由器LSA可达的各台自治系统边界路由器所创建的。随后该区域边界路由器将该类型4的LSA注入到相应区域。此类LSA提供到有关该自治系统边界路由器本身的可靠性信息。你应熟知的类型3与类型4 LSAs的关键不同,在下表39.2中有列出:
| 链路状态ID字段(The Link State ID field)包含了真实的网络编号。 | 链路状态ID字段包含了自治系统边界路由器的路由器ID。 |
### 自治系统外部链路状态通告(类型5)
**AS External Link State Advertisements(Type 5)**
外部链路状态通过用于对那些该自治系统的外部目的网络进行描述(The External Link State Advertisement is used to describe destinations that are external to the autonomous system)。也就是说,类型5的LSAs提供了要抵达外部网络的必要信息。除了外部路由外,某个OSPF路由域(an OSPF routing domain)的默认路由,也可作为类型5的链路状态通告,而加以注入。
- 它们不允许网络汇总LSAs(They do not allow Network Summary LSAs)
- 它们不允许外部LSAs
- 默认路由是以一条汇总LSA被注入的
### 末梢区域(Stub Areas)
末梢区域与NSSAs有些类似,主要的例外就是不允许外部路由(类型5或类型7)进入到末梢区域(Stub areas are somewhat similar to NSSAs, with the major exception being that external routes(Type 5 or Type 7) are not allowed into Stub Areas)。重要的是对末梢在OSPF何EIGRP中的功能是完全不同的。在OSPF中,某个区域作为末梢区域的配置,通过阻止外部LSAs被通告到这些区域,在无需额外配置下,就可减小这些区域中路由器的路由表及OSPF数据库的大小。末梢区域有着以下特性:
- 默认路由是通过区域边界路由器,以一条类型3的LSA注入到末梢区域的
- 来自其它区域的类型3的LSAs允许进入到这些区域
- 外部路由的LSAs(也就是类型4及类型5的LSAs)不被允许
### 完全末梢区域(Totally Stubby Areas)
完全末梢区域是末梢区域的一个扩展。但与末梢区域不同的是,完全末梢区域通过限制外部LSAs外,还限制了类型3的LSAs,从而进一步地减小了完全末梢区域中路由器上的链路状态数据库(Link State Database, LSDB)的大小。通常将TSAs配置在那些有着到网络,比如在传统的分支网络,的单个入口及出口点的路由器上(TSAs are typically configured on routers that have a single ingress and egress point into the network, for example in a traditional hub-and-spoke network)。该区域的路由器将所有外部流量转发到区域边界路由器。同时该区域边界路由器也是所有骨干区域及区域间流量到完全末梢区域的出口点(The ABR is also the exit point for all backbone and inter-area traffice to the TSA),其有着以下特性:
- 默认路由是作为类型3的网络汇总LSA注入到末梢区域的
- 自其它区域的类型3、类型4及类型5 LSAs不被允许进入到这些区域
## 路由度量值与最优路由选取
**Route Metrics and Best Route Selection**
在以下小节中,将学到有关OSPF度量值及其运算的知识。
### OSPF度量值的计算(Calculating the OSPF Metric)
OSPF度量值通常被成为开销(The OSPF metric is commonly referred to as the cost)。开销是从链路的带宽,使用公式`10^8 / 带宽`(其中“带宽”以`bps`计)得到的。这就意味着依据不同链路的带宽,而赋予了它们不同的开销值。使用此公式,一个`10Mbps`的以太网接口的OSPF开销,将像下面这样计算出来:
在对EIGRP的度量值计算进行讨论时的先前课程模块中,对`bandwidth`命令的使用进行了介绍。如先前指出的那样,默认OSPF的开销,是通过以参考带宽`10^8`,也就是`100Mbps`除以链路带宽计算出来的。那么不论是提升还是降低链路带宽,都直接影响到该特定链路的OSPF开销。这是一种典型的用于确保某条路径优先于另一路径而被选用的 **路径控制机制**(a path control mechanism)。
其所使用的`default-information originate`命令,将把该路由器配置为仅在路由表中已出现一条默认路由的情况下,通告一条默认路由(The `default-information originate` command used by itself will configure the router to advertise a default route only if a default route is already present in the routing table)。但可将`[always]`关键字追加到该命令,从而强制该路由器在路由表中尚不存在默认路由的情况下,生成一条默认路由。应小心使用这个关键字,因为它可能导致OSPF域中的流量黑洞,或者导致将所有位置目的地的数据包,转发到所配置的路由器。
关键字`[metric <value>]`用于指定所生成的默认路由的路由度量值。而关键字`[metric-type <1|2>]`可用于修改默认路由的度量值类型(the metric type for the default route)。最后,`[route-map <name>]`关键字将路由器配置为仅在该命名的路由器地图中所指定的条件满足时,生成一条默认路由。
R4(config-router)#network 172.16.4.0 0.0.0.255 Area 2
R4(config-router)#default-information originate
R4(config-router)#exit
```
默认情况下,默认路由是作为类型5的LSA进行通告的。
## OSPF的配置(Configuring OSPF)
以一行配置,就可以在路由器上开启基本的OSPF,并于随后通过添加 **网络语句**,来指明希望在哪些接口上运行OSPF,对于那些不打算通告的网络,则不予添加(Basic OSPF can be enabled on the router with one line of configuration, and then by adding the network statement that specifies on which interfaces you want to run OSPF, not necessarily networks you wish to advertise):
对于邻居表可能为空的原因(也就是为何`show ip ospf neighbor`命令可能不产生任何输出),有好几种。常见的原因如下所示:
- 基础的OSPF错误配置(misconfigurations)
- 1层与2层故障
- 访问控制清单过滤掉了(ACL filtering)
- 接口的错误配置
基本的OSPF错误配置,涵盖了很多东西。其可以包括比如不匹配的计时器、区域IDs、认证参数及末梢配置等。思科IOS中有大量的工具,可用于对基本的OSPF错误配置进行故障排除。比如,可使用`show ip protocols`命令来判断信息(比如有关那些开启了OSPF的网络);可使用`show ip ospf`命令,来判断区域配置及各区域的接口;以及使用`show ip ospf interface brief`命令来判断哪些接口位处哪些区域中,以及在假定接口已开启了OSPF时,判断出这些接口已对哪些OSPF进程开启了。
另一个常见的错误配置就是将接口指定为了被动接口(Another common misconfiguration is specifying the interface as passive)。如果真这样做了,那么该接口就不会发出`Hello`数据包,同时使用那个接口就不会建立邻居关系。既可使用`show ip protocols`,也可使用`show ip ospf interface`命令,来检查哪些接口被配置或指定为了被动接口。下面是在某个被动接口上的后一个命令的示例输出:
```console
R1#show ip ospf interface Serial0/0
Serial0/0 is up, line protocol is up
Internet Address 172.16.0.1/30, Area 0
Process ID 1, Router ID 10.1.0.1, Network Type POINT_TO_POINT, Cost: 64
访问控制清单过滤,是另一种常见的造成临接关系建立失败的原因。为排除此类故障,重要的是熟悉网络拓扑。比如,在建立某个临接关系失败的路由器是通过不同物理交换机进行连接的时,就可能为ACL过滤是以先前为安全目的,而已配置在交换机上的VACL(VLAN ACL)的形式部署的。`show ip ospf traffic`命令,就是一个可找出OSPF数据包是被阻塞了还是被丢弃了的有用工具,其会打印出如下输出所演示的,有关发出的OSPF数据包的信息:
```console
R1#show ip ospf traffic Serial0/0
Interface Serial0/0
OSPF packets received/sent
Invalid Hellos DB-des LS-req LS-upd LS-ack Total
Rx: 0 0 0 0 0 0 0
Tx: 0 6 0 0 0 0 6
OSPF header errors
Length 0, Auth Type 0, Checksum 0, Version 0,
Bad Source 0, No Virtual Link 0, Area Mismatch 0,
No Sham Link 0, Self Originated 0, Duplicate ID 0,
就像EIGRP的情况一样,有的时候可能会注意到OSPF没有对某些路由进行通告。大多数情况下,这都是由于一些错误配置,而非协议故障造成的(For the most part, this is typically due to some misconfigurations versus a protocol failure)。此类故障的一些常见原因包括下面这些:
- 接口上没有开启OSPF
- 接口宕掉了
- 接口地址出于不同的区域
- OSPF的错误配置
OSPF之所以不对路由器进行通告的一个常见原因,就是该网络未通过OSPF进行通告。在当前的思科IOS软件中,使用路由器配置命令`network`或接口配置命令`ip ospf`,就可使网络得以通告。不管使用哪种方式,都可以使用`show ip protocols`命令,来查看将OSPF配置为对哪些网络进行通告,就如同下面的输出中所看到的:
```console
R2#show ip protocols
Routing Protocol is “ospf 1”
Outgoing update filter list for all interfaces is not set
Incoming update filter list for all interfaces is not set
Router ID 2.2.2.2
Number of areas in this router is 1. 1 normal 0 stub 0 nssa
Maximum path: 4
Routing for Networks:
10.2.2.0 0.0.0.128 Area 1
20.2.2.0 0.0.0.255 Area 1
Routing on Interfaces Configured Explicitly (Area 1):
Loopback0
Reference bandwidth unit is 100 mbps
Routing Information Sources:
Gateway Distance Last Update
1.1.1.1 110 00:00:17
Distance: (default is 110)
```
此外,请记住还可以使用`show ip ospf interfaces`命令来找出那些接口开启了OSPF,及其它一些信息。除了网络配置,若接口宕掉,OSPF也不会对路由器进行通告。可使用`show ip ospf interfaces`命令,来确定接口状态,如下所示:
```console
R1#show ip ospf interface brief
Interface PID Area IP Address/Mask Cost State Nbrs F/C
默认情况下,因为`R1`上的次要子网已被放入到一个不同的OSPF区域,所以它们不会被该路由器通告。这一点在`R2`上可以看到,在执行了`show ip route`命令时,就显示下面的输出:
```console
R2#show ip route
Codes: C - connected, S - static, R - RIP, M - mobile, B - BGP
D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
E1 - OSPF external type 1, E2 - OSPF external type 2
i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
ia - IS-IS inter area, * - candidate default, U - per-user static route
o - ODR, P - periodic downloaded static route
Gateway of last resort is not set
10.0.0.0/24 is subnetted, 1 subnets
C 10.0.0.0 is directly connected, FastEthernet0/0
```
为解决这个问题,就必须将那些次要子网,指派到`Area 0`,如下所示:
```console
R1(config)#router ospf 1
R1(config-router)#network 10.0.1.1 0.0.0.0 Area 0
*Mar 18 20:20:37.491: %OSPF-6-AREACHG: 10.0.1.1/32 changed from Area 1 to Area 0
R1(config-router)#network 10.0.2.1 0.0.0.0 Area 0
*Mar 18 20:20:42.211: %OSPF-6-AREACHG: 10.0.2.1/32 changed from Area 1 to Area 0
R1(config-router)#end
```
在此配置改变之后,那些网络就被通告给路由器`R2`了,如下所示:
```console
R2#show ip route
Codes: C - connected, S - static, R - RIP, M - mobile, B - BGP
D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
E1 - OSPF external type 1, E2 - OSPF external type 2
i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
ia - IS-IS inter area, * - candidate default, U - per-user static routeo - ODR, P - periodic downloaded static route
Gateway of last resort is not set
10.0.0.0/24 is subnetted, 3 subnets
O 10.0.2.0 [110/2] via 10.0.0.1, 00:01:08, FastEthernet0/0
C 10.0.0.0 is directly connected, FastEthernet0/0
O 10.0.1.0 [110/2] via 10.0.0.1, 00:01:08, FastEthernet0/0
```
除了上书三种常见原因,不良的设计、实现,以及错误配置,也是导致OSPF不如预期的那样对网络进行通告的一个原因。导致此类故障常见的设计问题,包括一个不连续或分区的骨干区域(a discontiguous or partitioned backbone)以及区域类型的错误配置,比如将区域配置为完全末梢的区域。对于这种原因,就要对OSPF的工作原理及其在自己的环境中如何部署有扎实掌握。这样的掌握将极大地简化故障排除过程,因为在故障排除之前,就已经赢得了战斗的一半了。
### OSPF路由故障的调试(Debugging OSPF Routing Issues)
在本课程模块的最后一节,将看看一些较为常用的OSPF调试命令。OSPF的调试,是通过使用`debug ip ospf`命令来开启的。该命令可结合下面这些额外关键字一起使用:
```console
R1#debug ip ospf ?
adj OSPF adjacency events
database-timer OSPF database timer
events OSPF events
flood OSPF flooding
hello OSPF hello events
lsa-generation OSPF lsa generation
mpls OSPF MPLS
nsf OSPF non-stop forwarding events
packet OSPF packets
retransmission OSPF retransmission events
spf OSPF spf
tree OSPF database tree
```
命令`debug ip osfp adj`将打印有关临接事件的实时信息。在对OSPF的邻居临接故障进行故障排除时,这是一个有用的故障排除工具。下面是一个由该命令打印的信息示例。下面的示例演示了如何使用该命令,来判断MTU不匹配而导致的无法到达`Full`状态,从而阻止了邻居临接的建立:
```console
R1#debug ip ospf adj
OSPF adjacency events debugging is on
R1#
*Mar 18 23:13:21.279: OSPF: DR/BDR election on FastEthernet0/0
3. Any router which connects to Area 0 and another area is referred to as an `_______``_______``_______` or `_______`.
4. If you have a DR, you must always have a BDR. True or false?
5. The DR/BDR election is based on which two factors?
6. By default, all routers have a default priority value of `_______`. This value can be adjusted using the `_______``_______``_______``<0-255>` interface configuration command.
7. When determining the OSPF router ID, Cisco IOS selects the highest IP address of configured Loopback interfaces. True or false?
8. What roles do the DR and the BDR carry out?
9. Which command would put network `10.0.0.0/8` into `Area 0` on a router?
10. Which command would set the router ID to `1.1.1.1`?
11. Name the common troubleshooting issues for OSPF.
## 第39天答案
1.`89`.
2. False.
3. Area Border Router or ABR.
4. False.
5. The highest router priority and the highest router ID.
6. 1, `ip ospf priority` .
7. True.
8. To reduce the number of adjacencies required on the segment; to advertise the routers on the Multi-Access segment; and to ensure that updates are sent to all routers on the segment.
9. The `network 10.0.0.0 0.255.255.255 area 0` command.
10. The `router-id 1.1.1.1` command.
11. Neighbour relationships and route advertisement.