一、 OSPF消息封装

OSPF 消息的数据部分封装在数据包内。此数据字段可能包含五种 OSPF 数据包类型之一。下一主题将简要介绍每种数据包类型。
无论每个 OSPF 数据包的类型如何,都具有 OSPF 数据包报头。随后,OSPF 数据包报头和数据包类型特定的数据被封装到 IP 数据包中。在该 IP 数据包报头中,协议字段被设为 89 以代表 OSPF,目的地址则被设为以下两个组播地址之一:224.0.0.5 或 224.0.0.6。如果 OSPF 数据包被封装在以太网帧内,则目的 MAC 地址也是一个组播地址:01-00-5E-00-00-05 或 01-00-5E-00-00-06。 

二、 OSPF数据包类型

在上一章中,我们介绍了链路状态数据包 (LSP)。图示为 OSPF LSP 的五种类型。每种数据包在 OSPF 路由过程中发挥各自的作用:
1. Hello — Hello 数据包用于与其它 OSPF 路由器建立和维持相邻关系。Hello 协议将在下一主题中详细讨论。
2. DBD — DBD(数据库说明) 数据包包含发送方路由器的链路状态数据库的简略列表,接收方路由器使用本数据包与其本地链路状态数据库对比。
3. LSR — 随后,接收方路由器可以通过发送链路状态请求 (LSR) 数据包来请求 DBD 中任何条目的有关详细信息。
4. LSU — 链路状态更新 (LSU) 数据包用于回复 LSR 和通告新信息。LSU 包含七种类型的链路状态通告 (LSA)。LSU 和 LSA 将在下一主题中简略讨论。
5. LSAck - 路由器收到 LSU 后,会发送一个链路状态确认 (LSAck) 数据包来确认接收到了 LSU。

三、Hello协议

图示为 OSPF 数据包报头和 Hello 数据包。我们将在本章后续内容中更加详细地论述带有蓝色阴影的字段。现在,我们着重关注 Hello 数据包的用法。
第一种类型的 OSPF 数据包 1 是 OSPF Hello 数据包。Hello 数据包用于:
  • 发现 OSPF 邻居并建立相邻关系。
  • 通告两台路由器建立相邻关系所必需统一的参数。
  • 在以太网和帧中继网络等多路访问网络中选举指定路由器 (DR) 和备用指定路由器 (BDR)。
图中所示的重要字段包括:
  • 类型:OSPF 数据包类型:Hello (1)、DD (2)、LS 请求 (3)、LS 更新 (4) 或 LS 确认 (5)
  • 路由器 ID:始发路由器的 ID
  • 区域 ID:数据包的始发区域
  • 网络掩码:与发送方接口关联的子网掩码
  • Hello 间隔:发送方路由器连续两次发送 hello 数据包之间的秒数
  • 路由器优先级:用于 DR/BDR 选举(稍后讨论)
  • 指定路由器 (DR):DR 的路由器 ID(如果有的话)
  • 备用指定路由器 (BDR):BDR 的路由器 ID(如果有的话)
  • 邻居列表:列出相邻路由器的 OSPF 路由器 ID

(1)、建立相邻关系

在 OSPF 路由器可将其链路状态泛洪给其它路由器之前,必须确定在其每个链路上是否存在其它 OSPF 邻居。在图中,OSPF 路由器正在通过所有启用了 OSPF 的接口发送 Hello 数据包,以确定那些链路上是否存在邻居。OSPF Hello 中的信息包括发送方路由器的 OSPF 路由器 ID(路由器 ID 将在本章后续部分中讨论)。如果通过一个接口收到 OSPF Hello 数据包,即可确认该链路上存在另一台 OSPF 路由器。随后,OSPF 即与该邻居建立相邻关系。例如,在图中,R1 将与 R2 和 R3 建立相邻关系。

(2)、 OSPF Hello 间隔和 Dead 间隔

两台路由器在建立 OSPF 相邻关系之前,必须统一三个值:Hello 间隔、Dead 间隔和网络类型。OSPF Hello 间隔表示 OSPF 路由器发送其 Hello 数据包的频度。默认情况下,在多路访问网段和点对点网段中每 10 秒钟发送一次 OSPF Hello 数据包,而在非广播多路访问 (NBMA) 网段(帧中继、X.25 或 ATM)中则每 30 秒钟发送一次 OSPF Hello 数据包。
在多数情况下,OSPF Hello 数据包都会通过组播发送给ALLSPFRouters 的专用地址 224.0.0.5 。由于使用了组播地址,设备的接口如果未启用为接收 OSPF 数据包,则会忽略这些数据包。这样可节省非 OSPF 设备的 CPU 处理时间。
Dead 间隔是路由器在宣告邻居进入 down(不可用)状态之前等待该设备发送 Hello 数据包的时长,单位为秒。Cisco 所用的默认断路间隔为 Hello 间隔的四倍。对于多路访问网段和点对点网段,此时长为 40 秒;而对于 NBMA 网络,则为 120 秒。
如果 Dead 间隔已到期,而路由器仍未收到邻居发来的 Hello 数据包,则会从其链路状态数据库中删除该邻居。路由器会将该邻居连接断开的信息通过所有启用了 OSPF 的接口以泛洪的方式发送出去。
网络类型的具体内容将在本章后续部分加以论述。

(3)、 选举 DR 和 BDR

为减小多路访问网络中的 OSPF 流量,OSPF 会选举一个指定路由器 (DR) 和一个备用指定路由器 (BDR)。当多路访问网络中发生变化时,DR 负责使用该变化信息更新其它所有 OSPF 路由器(称为 DROther)。BDR 会监控 DR 的状态,并在当前 DR 发生故障时接替其角色。
图中,R1、R2 和 R3 通过点对点链路相互连接。因此,不会执行 DR/BDR 选举。DR/BDR 选举及其过程将在后续主题中讨论,届时,拓扑将变为一个多路访问网络。
注:Hello 数据包及其它类型的 OSPF 数据包等内容在 CCNP 课程中有更详细的论述。 

四、OSPF链路状态更新

链路状态更新 (LSU) 数据包用于 OSPF 路由更新。一个 LSU 数据包可能包含十种类型的链路状态通告 (LSA),如图所示。术语“链路状态更新 (LSU)”和“链路状态通告 (LSA)”之间的差异有时较难分清。有时,它们可以互换使用。一个 LSU 包含一个或多个 LSA,这两个术语中的任何一个都可用于表示由 OSPF 路由器传播的链路状态信息。
注:LSA 的各种类型将在 CCNP 课程中加以论述。

五、OSPF算法

每台 OSPF 路由器都会维持一个链路状态数据库,其中包含来自其它所有路由器的 LSA。一旦路由器收到所有 LSA 并建立其本地链路状态数据库,OSPF 就会使用 Dijkstra 的最短路径优先 (SPF) 算法创建一个 SPF 树。随后,将根据 SPF 树,使用通向每个网络的最佳路径填充 IP 路由表。

六、基本OSPF配置

图中所示为本章的拓扑。请注意该地址方案不连续。OSPF 是一种无类路由协议。因此,OSPF 配置中含有掩码的配置。我们已经学过的,这样可克服不连续地址所带来的问题。还请注意,在本拓扑中有三个带宽各不相同的串行链路,且每台路由器都具有多条路径通向远程网络。

  • router ospf命令

OSPF 通过 router ospf process-id 全局配置命令启用。process-id 是一个介于 1 和 65535 之间的数字,由网络管理员选定。process-id仅在本地有效,这意味着路由器之间建立相邻关系时无需匹配该值。这一点与 EIGRP 不同。EIGRP 进程 ID(即自治系统编号)必须 匹配,两个 EIGRP 邻居才能建立相邻关系。

在我们的拓扑中,将使用相同的进程 ID 1 在全部三台路由器上启用 OSPF。之所以使用相同的进程 ID,只是为了取得一致。
R1(config)#router ospf 1

R1(config-router)#

  • network 命令

OSPF 中的 network 命令与其它 IGP 路由协议中的 network 命令具有相同的功能:

路由器上任何符合 network 命令中的网络地址的接口都将启用,可发送和接收 OSPF 数据包。
此网络(或子网)将被包括在 OSPF 路由更新中。
network 命令在路由器配置模式中使用。
Router(config-router)#network network-address wildcard-mask areaarea-id
OSPF network 命令所用的network-address 和wildcard-mask参数与 EIGRP 所用的参数相似,不同的是,OSPF 需要通配符掩码。网络地址和通配符掩码一起,用于指定此 network 命令启用的接口或接口范围。
就像在 EIGRP 中一样,通配符掩码可配置为子网掩码的反码。例如,R1 的 FastEthernet 0/0 接口位于 172.16.1.16/28 网络中。此接口的子网掩码为 /28,即 255.255.255.240。该子网掩码的反码即为通配符掩码。
注:某些 IOS 版本的 OSPF 与 EIGRP 一样,只需输入子网掩码,而不用通配符掩码。随后,IOS 会将子网掩码转换为通配符掩码格式。
255.255.255.255
- 255.255.255.240 减去子网掩码
---------------
0. 0. 0. 15 通配符掩码
area area-id 指 OSPF 区域。OSPF 区域是共享链路状态信息的一组路由器。相同区域内的所有 OSPF 路由器的链路状态数据库中必须具有相同的链路状态信息,这通过路由器将各自的链路状态泛洪给该区域内的其它所有路由器来实现。在本章中,我们将配置一个区域内的所有 OSPF 路由器,这称为单区域 OSPF。
OSPF 网络也可配置为多区域。将大型 OSPF 网络配置为多区域有很多好处,例如,可减小链路状态数据库,还可以将不稳定的网络问题隔离在一个区域之内。多区域 OSPF 是 CCNP 课程中的内容。
如果所有路由器都处于同一个 OSPF 区域,则必须在所有路由器上使用相同的 area-id 来配置 network 命令。尽管可使用任何 area-id,但比较好的做法是在单区域 OSPF 中使用area-id 0。此惯例便于以后将该网络配置为多个 OSPF 区域,从而使区域 0 变成主干区域。
图示为在所有三台路由器的所有接口上启用 OSPF 时所用的 network 命令。此时,所有路由器应该能够成功地 ping 所有网络。
  • OSPF路由器ID
a) 确定路由器 ID
OSPF 路由器 ID 用于唯一标识 OSPF 路由域内的每台路由器。一个路由器 ID 其实就是一个 IP 地址。Cisco 路由器按下列顺序根据下列三个条件确定路由器 ID:
1. 使用通过 OSPF router-id 命令配置的 IP 地址。
2. 如果未配置 router-id,则路由器会选择其所有环回接口的最高 IP 地址。
3. 如果未配置环回接口,则路由器会选择其所有物理接口的最高活动 IP 地址。
b) 最高活动 IP 地址
如果 OSPF 路由器未使用 OSPF router-id 命令进行配置,也未配置环回接口,则其 OSPF 路由器 ID 将为其所有接口上的最高活动 IP 地址。该接口并不需要启用 OSPF,就是说不需要将其包括在 OSPF network 命令中。然而,该接口必须活动 — 它必须处于工作状态。
c) 检验路由器 ID
因为我们未在这三台路由器上配置路由器 ID 和环回接口,所以每台路由器的路由器 ID 通过列表中的第三个条件确定:路由器的所有物理接口的最高活动 IP 地址。如图所示,每台路由器的路由器 ID 为:
R1:192.168.10.5,该地址比 172.16.1.17 和 192.168.10.1 高
R2:192.168.10.9,该地址比 10.10.10.1 和 192.168.10.2 高
R3:192.168.10.10,该地址比 172.16.1.33 和 192.168.10.6 高
您可用于验证路由器 ID 的一个命令为 show ip protocols。某些 IOS 版本并不象图中所示那样显示路由器 ID。在那些情况下,请使用 show ip ospf 或 show ip ospf interface 命令检验路由器 ID。
d) 环回地址
如果未使用 OSPF router-id 命令,但配置了环回接口,则 OSPF 将选择其所有环回接口的最高 IP 地址。环回地址是一种虚拟接口,配置后即自动处于工作状态。您已经学过用于配置环回接口的命令:
Router(config)#interface loopback number
Router(config-if)#ip address ip-address subnet-mask
e) 单击图中的“拓扑”按钮。
在本拓扑中,所有的三台路由器均配置有环回地址以代表 OSPF 路由器 ID。使用环回接口的优点在于,不会像物理接口那样发生故障。环回接口无需依赖实际电缆和相邻设备即可处于工作状态。因此,使用环回地址作为路由器 ID 给 OSPF 过程带来了稳定性。因为 OSPF router-id 命令(随后讨论)是最近刚加入到 IOS 中的,所以使用环回地址来配置 OSPF 路由器 ID 的现象更常见。
OSPF router-id 命令
OSPF router-id 命令在 IOS 12.0(T) 中引入,且在用于确定路由器 ID 时优先于环回接口和物理接口 IP 地址。命令语法为:
Router(config)#router ospf process-id
Router(config-router)#router-id ip-address
f) 修改路由器 ID
路由器 ID 在您使用第一个 OSPF network 命令配置 OSPF 时选定。如果配置了 OSPF router-id 命名或环回地址(在 OSPF network 命令之后),路由器 ID 将来自具有最高活动 IP 地址的接口。
路由器 ID 可使用来自后续 OSPF router-id 命令的 IP 地址来修改,但必须通过重新加载路由器或使用下列命令来实现:
Router#clear ip ospf process
注:使用新的环回接口或物理接口 IP 地址修改路由器 ID 可能需要重新加载路由器。
g) 重复的路由器 ID
当同一个 OSPF 路由域内的两台路由器具有相同的路由器 ID 时,将无法正常路由。如果两台相邻路由器的路由器 ID 相同,则无法建立相邻关系。当出现重复的 OSPF 路由器 ID 时,IOS 将显示一条类似下列的消息:
%OSPF-4-DUP_RTRID1:Detected router with duplicate router ID
要纠正此问题,请配置所有路由器,使得每台路由器都具有唯一的 OSPF 路由器 ID。
h) 单击图中的“新路由器 ID”。
因为某些 IOS 版本不支持 router-id 命令,所以我们将使用环回地址的方法分配路由器 ID。通常只有在重新加载路由器后,来自环回接口的 IP 地址才能取代当前 OSPF 路由器 ID。在图中,路由器已重新加载。show ip protocols 命令用于验证每台路由器现在是否使用环回地址作为其路由器 ID。

  • 验证OSPF
show ip ospf neighbor 命令可用于验证 OSPF 相邻关系并排除相应的故障。此命令为每个邻居显示下列输出:
Neighbor ID — 该相邻路由器的路由器 ID。
Pri — 该接口的 OSPF 优先级。这将在后续部分讨论。
State — 该接口的 OSPF 状态。FULL 状态表明该路由器和其邻居具有相同的 OSPF 链路状态数据库。OSPF 状态在 CCNP 课程中讨论。
Dead Time — 路由器在宣告邻居进入 down(不可用)状态之前等待该设备发送 Hello 数据包所剩余的时间。此值在该接口收到 Hello 数据包时重置。
Address — 该邻居用于与本路由器直连的接口的 IP 地址。
Interface — 本路由器用于与该邻居建立相邻关系的接口。
当排除 OSPF 网络故障时,show ip ospf neighbor 命令可用于验证该路由器是否已与其相邻路由器建立相邻关系。如果未显示相邻路由器的路由器 ID,或未显示 FULL 状态,则表明两台路由器未建立 OSPF 相邻关系。如果两台路由器未建立相邻关系,则不会交换链路状态信息。链路状态数据库不完整会导致 SPF 树和路由表不准确。通向目的网络的路由可能不存在或不是最佳路径。
注:在诸如以太网等多路访问网络中,相邻的两台路由器可能将它们的状态显示为 2WAY。这将在后续部分讨论。
在下列情况下,两台路由器不会建立 OSPF 相邻关系:
子网掩码不匹配,导致该两台路由器分处于不同的网络中。
OSPF Hello 计时器或 Dead 计时器不匹配。
OSPF 网络类型不匹配。

存在信息缺失或不正确的 OSPF network 命令。

其它功能强大的 OSPF 故障排除命令包括:

show ip protocols
show ip ospf
show ip ospf interface
如图所示,show ip protocols 命令可用于快速验证关键 OSPF 配置信息,其中包括 OSPF 进程 ID、路由器 ID、路由器正在通告的网络、正在向该路由器发送更新的邻居以及默认管理距离(对于 OSPF 为 110)。
单击图中的 show ip ospf。
show ip ospf 命令也可用于检查 OSPF 进程 ID 和路由器 ID,此外,还可显示 OSPF 区域信息以及上次计算 SPF 算法的时间。您在示例输出中可看到,OSPF 是一种非常稳定的路由协议。在过去的十一个半小时中,R1 所参与的唯一一个与 OSPF 相关的事件是向其邻居发送了一些小型 Hello 数据包。
注:show ip ospf 命令所显示的其它信息在 CCNP 课程中讨论。
命令输出包含重要的 SPF 算法信息,其中包括 SPF 计划延时:
Initial SPF schedule delay 5000 msecs
Minimum hold time between two consecutive SPFs 10000 msecs
Maximum wait time between two consecutive SPFs 10000 msecs
路由器每次收到有关拓扑的新信息(链路添加、删除或修改)时,必须重新运行 SPF 算法,创建新的 SPF 树,并更新路由表。SPF 算法会占用很多 CPU 资源,且其耗费的计算时间取决于区域大小。区域大小通过路由器数量和链路状态数据库来衡量。
状态在 up 和 down 之间来回变化的网络称为链路不稳。链路不稳会导致区域内的 OSPF 路由器持续重新计算 SPF 算法,从而无法正确收敛。为尽量减轻此问题,路由器在收到一个 LSU 后,会等待 5 秒(5000 毫秒)才运行 SPF 算法。这称为 SPF 计划延时。为防止路由器持续运行 SPF 算法,还存在一个 10 秒(10000 毫秒)的保留时间。路由器运行完一次 SPF 算法后,会等待 10 秒才再次运行该算法。
单击图中的 show ip ospf interface。
用于检验 Hello 间隔和 Dead 间隔的最快方法为使用 show ip ospf interface 命令。如图所示,将接口名称和编号添加到该命令中即可显示特定接口的输出。这些间隔包括在邻居之间相互发送的 OSPF Hello 数据包中。OSPF 在不同接口上可能具有不同的 Hello 间隔和 Dead 间隔,但要使 OSPF 路由器建立相邻关系,它们的 OSPF Hello 间隔和断路间隔必须相同。例如,在图中,R1 在其 Serial 0/0/0 接口上所用的 Hello 间隔为 10,Dead 间隔为 40。R2 也必须在其 Serial 0/0/0 接口上使用相同的间隔,才能和 R1 建立相邻关系。 

  • 检查路由表
我们已经学过,检验 OSPF 收敛情况最快捷的方法是查看拓扑中每台路由器的路由表。
单击图中的 R1、R2 和 R3 查看 show ip route 输出。

show ip route 命令可用于检验路由器是否正在通过 OSPF 发送和接收路由。每条路由开头的 O 表示路由来源为 OSPF。路由表和 OSPF 将在下一节更详细地讨论。然而,您应该很容易注意到 OSPF 路由表与之前章节中的路由表相比存在两个明显区别。首先,可注意到每台路由器具有四个直连网络,原因在于环回接口被计为第四个网络。OSPF 不会通告这些环回接口。因此,每台路由器列出了七个已知网络。其次,与 RIPv2 和 EIGRP 不同的是,OSPF 不会自动在主网络边界总结。无类是 OSPF 的固有属性。

七、OSPF度量

OSPF 度量称为开销。RFC 2328 中有下列描述:“开销与每个路由器接口的输出端关联。系统管理员可配置此开销。开销越低,该接口越可能被用于转发数据流量。”

请注意,RFC 2328 并未指定使用哪些值来确定开销。

Cisco IOS 使用从路由器到目的网络沿途的传出接口的累积带宽作为开销值。在每台路由器上,接口的开销通过 10 的 8 次幂除以以 bps 为单位的带宽值算得。该被除数称为参考带宽。通过使用 10 的 8 次幂除以接口带宽,可使带宽较高的接口算得的开销值较低。请记住,在路由度量中,开销最低的路由是首选路由(例如,在 RIP 中,3 跳比 10 跳好)。图示为各种接口的默认 OSPF 开销。

参考带宽

参考带宽默认为 10 的 8 次幂,即 100,000,000 bps,亦即 100 Mbps。这使带宽等于或大于 100 Mbps 的接口具有相同的 OSPF 开销 1。可使用 OSPF 命令 auto-cost reference-bandwidth 修改参考带宽值以适应链路速度高于 100,000,000 bps (100 Mbps) 的网络。如果需要使用此命令,则建议同时用在所有路由器上,以使 OSPF 路由度量保持一致。

  • OSPF 累计开销

OSPF 路由的开销为从路由器到目的网络的累计开销值。例如,在图中,R1 的路由表显示到 R2 上的网络 10.10.10.0/24 的开销为 65。因为 10.10.10.0/24 连接到以太网接口,R2 将 10.10.10.0/24 的开销指定为 1。R1 随后加上在 R1 和 R2 之间通过默认 T1 链路发送数据所需的开销值 64。

  • 串行接口的默认带宽

在第 9 章 "EIGRP" 中学过,可使用 show interface 命令查看接口所用的带宽值。在 Cisco 路由器上,许多串行接口的带宽值默认为 T1 (1.544 Mbps)。然而,某些串行接口可能默认为 128 kbps。因此,切勿假定 OSPF使用的带宽为某一特定值,而应使用 show interface 命令检查默认值。

请记住,此带宽值实际上并不影响链路速度,而是由某些路由协议用来计算路由度量。在串行接口上,链路的实际速度很可能不同于默认带宽。带宽值必须反映链路的实际速度,路由表才具有准确的最佳路径信息。例如,Internet 服务提供商为您提供的可能是一个部分 T1 连接,其带宽为全 T1 连接带宽的四分之一 (384 kbps)。然而,出于路由协议的目的,即使接口实际上是以全 T1 连接带宽的四分之一 (384 kbps) 发送和接收数据,IOS 也会假定为 T1 带宽值。

图示为 R1 的 Serial 0/0/0 接口的输出。现在拓扑也显示了这两台路由器间的链路的实际带宽。请注意,R1 的命令输出中的默认带宽值为 1544 kbps。然而,此链路的实际带宽值却为 64 kbps。这意味者路由器上的路由信息并未反映网络拓扑的实际情况。

单击图中的 show ip route。

图示为 R1 的路由表。R1 认为其两个串行接口都连接到了 T1 链路,实际上一条是 64 kbps 的链路,另一条是 256 kbps 的链路。这导致 R1 的路由表中具有通向网络 192.168.8.0/30 的两条开销相等的路径,而实际上 Serial 0/0/1 路径更好一些。

O 192.168.10.8 [110/128] via 192.168.10.6, 00:03:41, Serial0/0/1
[110/128] via 192.168.10.2, 00:03:41, Serial0/0/0

单击图中的 show ip ospf interface。

可使用 show ip ospf interface 命令验证算得的接口 OSPF 开销。在图中,我们可验证,R1 实际上为 Serial 0/0/0 接口指定了开销值 64。尽管您可能认为这是正确的开销值,原因在于此接口连接到 64 kbps 的链路,但请记住,开销值是由开销公式算得的。64 kbps 链路的开销值为 1562 (100,000,000/64,000)。所显示的值 64 是 T1 链路的开销值。在下一主题中,您将学习如何修改拓扑中所有链路的开销。

  • 修改链路的开销

如果串行接口的实际工作速率不是默认 T1 速率,则需要手动修改该接口的速率。链路的两端应该配置为相同值。bandwidth 接口命令或 ip ospf cost 接口命令都可用于达到此目的 — 使 OSPF 在确定最佳路由时使用准确的值。

bandwidth 命令

bandwidth 命令用于修改 IOS 在计算 OSPF 开销度量时所用的带宽值。该接口命令的语法与您在第 9 章 "EIGRP" 中所学的语法一样:

Router(config-if)#bandwidth bandwidth-kbps

图示为用于修改拓扑中所有串行接口开销值的 bandwidth 命令。对于 R1,show ip ospf interface 命令现在显示 Serial 0/0/0 链路的开销值为 1562,此值由 Cisco OSPF 开销计算而得 (100,000,000/64,000)。

ip ospf cost 命令

除 bandwidth 命令外,另一种方法是使用 ip ospf cost 命令,该命令可用于直接指定接口开销。例如,我们可以在 R1 上使用下列命令配置 Serial 0/0/0 接口:

R1(config)#interface serial 0/0/0
R1(config-if)#ip ospf cost 1562

显然,这不会改变 show ip ospf interface 命令的输出,该输出仍会显示开销为 1562。这与您将带宽配置为 64 时由 IOS 算得的开销相同。

bandwidth 命令与 ip ospf cost 命令比较

ip ospf cost 命令适用于使用了多个厂商的设备的环境,在该环境中,非 Cisco 路由器所用的度量并非用于计算 OSPF 开销的带宽值。这两个命令之间的主要差异在于 bandwidth 命令使用开销计算的结果确定链路开销。ip ospf cost 命令则直接将链路开销设置为特定值并免除了计算过程。

图示为可用于修改拓扑中串行链路开销的两种可选方案。图中右侧显示 ip ospf cost 命令方案,左侧显示 bandwidth 命令方案。

八、OSPF和多路访问网络

  • 多路访问网络中的挑战

在多路访问网络中,相同的共享介质上连接有两台以上设备。在图的上半部分,R1 所连接的以太网 LAN 展开并显示了网络 172.16.1.16/28 所连接的多台设备。以太网 LAN 就是一种广播多路访问网络。因为该网络中的所有设备会看到所有广播帧,所以它属于广播网络。因为该网络可能包括许多主机、打印机、路由器和其它设备,所以属于多路访问网络。

相比之下,点对点网络中只有两台设备,它们分处网络两端。R1 和 R3 之间的 WAN 链路就属于点对点链路。图中下半部分即为 R1 和 R3 之间的点对点链路。

OSPF 定义了五种网络类型:

点对点
广播多路访问
非广播多路访问 (NBMA)
点对多点
虚拟链路

NBMA 和点对多点网络包括帧中继、ATM 和 X.25 网络。NBMA 网络的详情在另一门 CCNA 课程中有所论述。点对多点网络的详情在 CCNP 课程中有所涉及。虚拟链路是一种特殊链路,可用于多区域 OSPF 中。OSPF 虚拟链路的详情也在 CCNP 课程中涉及。

LSA 泛洪

我们在第 10 章“链路状态路由协议”中已学过,链路状态路由器会在 OSPF 初始化以及拓扑更改时泛洪其链路状态数据包。

解决方案:指定路由器

用于在多路访问网络中管理相邻关系数量和 LSA 泛洪的解决方案是指定路由器 (DR)。继续讨论上一个例子,此解决方案可比喻为在房间里选举出一个人,由该人员向所有人逐个询问姓名,然后将这些姓名一次性通告给所有人。

在多路访问网络中,OSPF 会选举出一个指定路由器 (DR) 负责收集和分发 LSA。还会选举出一个备用指定路由器 (BDR),以防指定路由器发生故障。其它所有路由器变为 DROther(这就表示该路由器既不是 DR 也不是 BDR)。

多路访问网络中的路由器会选举出一个 DR 和一个 BDR。DROther 仅与网络中的 DR 和 BDR 建立完全的相邻关系。这意味着 DROther 无需向网络中的所有路由器泛洪 LSA,只需使用组播地址 224.0.0.6(ALLDRouters — 所有 DR 路由器)将其 LSA 发送给 DR 和 BDR 即可。在动画中,R1 将 LSA 发给 DR,BDR 也收到该通信。DR 负责将来自 R1 的 LSA 转发给其它所有路由器。DR 使用组播地址 224.0.0.5(AllSPFRouters — 所有 OSPF 路由器)。最终结果是,多路访问网络中仅有一台路由器负责泛洪所有 LSA。

拓扑变化

DR/BDR 选举不会发生在点对点网络中。因此,在标准的三路由器拓扑中,R1、R2 和 R3 不需要选举 DR 和 BDR,原因在于这些路由器之间的链路不是多路访问网络。

  • DR/BDR选举过程

DR/BDR 选举

DR 和 BDR 是如何选出的呢?选举过程遵循以下条件:

1. DR:具有最高 OSPF 接口优先级的路由器

2. BDR:具有第二高 OSPF 接口优先级的路由器

3. 如果 OSPF 接口优先级相等,则取路由器 ID 最高者。

在本例中,默认的 OSPF 接口优先级为 1,因此,根据上述选举条件,采用 OSPF 路由器 ID 来选举 DR 和 BDR。如您所见,RouterC 成为 DR,RouterB 具有第二高的路由器 ID,因此成为 BDR。因为 RouterA 未被选举为 DR 或 BDR,所以成为 DROther。

DROther 仅与 DR 和 BDR 建立完全的相邻关系,但也会与该网络中的任何其它 DROthers 建立相邻关系。这意味着多路访问网络中的所有 DROther 路由器仍然会收到其它所有 DROther 路由器发来的 Hello 数据包。通过这种方式,它们可获悉网络中所有路由器的情况。当两台 DROther 路由器形成相邻关系后,其相邻状态显示为 2WAY。不同的相邻状态将在 CCNP 课程中有所论述。

单击图中的 show ip ospf neighbor。

命令输出显示了该多路访问网络中各台路由器之间的相邻关系。请注意,RouterA 的输出显示 DR 是 RouterC,路由器 ID 为 192.168.31.33;BDR 是 RouterB,路由器 ID 是 192.168.31.22。

单击图中的 show ip ospf interface。

因为 RouterA 显示的两个邻居分别为 DR 和 BDR,所以 RouterA 是一个 DROther。这一点可通过在 RouterA 上运行 show ip ospf interface fastethernet 0/0 命令来验证,命令输出如图所示。此命令将显示此路由器的状态是 DR、BDR 还是 DROTHER,还将显示此多路访问网络中 DR 和 BDR 的路由器 ID。

DR/BDR 选举的时间安排

当多路访问网络中第一台启用了 OSPF 接口的路由器开始工作时,DR 和 BDR 选举过程随即开始。这可能发生在路由器开机时或配置 OSPF network 命令时。选举过程仅需几秒钟。如果多路访问网络中仍有部分路由器未完成启动过程,则成为 DR 的路由器可能具有较低的路由器 ID,原因可能在于具有较低路由器 ID 的路由器所需的启动时间较短。

DR 一旦选出,将保持 DR 地位,直到出现下列条件之一为止:

DR 发生故障。
DR 上的 OSPF 进程发生故障。
DR 上的多路访问接口发生故障。

在图中,红色的 X 表示出现上述一条或多条故障。

单击图中的“DR 发生故障”。

如果 DR 发生故障,BDR 将接替 DR 角色,随即进行选举,选出新的 BDR。在图中,RouterC 发生故障,原 BDR (RouterB) 成为 DR。仅存的另一个路由器 RouterA 则成为 BDR。

单击图中的“新路由器”。

RouterD 加入该网络。如果在选出 DR 和 BDR 后有新路由器加入网络,即使新路由器的 OSPF 接口优先级或路由器 ID 比当前 DR 或 BDR 高,也不会成为 DR 或 BDR。如果当前 DR 或 BDR 发生故障,则新路由器可被选举为 BDR。如果当前 DR 发生故障,则 BDR 将成为 DR,新路由器可被选为新的 BDR。当新路由器成为 BDR 后,如果 DR 发生故障,则该新路由器将成为 DR。当前 DR 和 BDR 必须都发生故障,该新路由器才能被选举为 DR 或 BDR。

单击图中的“旧 DR 返回”。

前任 DR 返回网络后不会重新取得 DR 的地位。在图中,RouterC 已完成重新启动,尽管它的路由器 ID (192.168.31.33) 高于当前 DR 和 BDR,也只能成为 DROther。

单击图中的“BDR 发生故障”。

如果 BDR 发生故障,则会在 DRother 之间选出新的 BDR。在图中,BDR 路由器发生故障。选举在 RouterC 和 RouterD 之间进行。RouterD 的路由器 ID 较高,因此获胜。

单击图中的“新 DR 发生故障”。

在图中,RouterB 故障。因为 RouterD 是当前 BDR,因此晋升为 DR,RouterC 则成为 BDR。

那么,您怎样确保所需的路由器在 DR 和 BDR 选举中获胜呢?无需进一步配置,解决方案有两种:

首先启动 DR,再启动 BDR,然后启动其它所有路由器;
关闭所有路由器上的接口,然后在 DR 上执行 no shutdown 命令,再在 BDR 上执行该命令,随后在其它所有路由器上执行该命令。

您可能已经猜到,我们可以通过更改 OSPF 优先级来更好地控制 DR/BDR 选举。

由于 DR 成为 LSA 的集散中心,所以它必须具有足够的 CPU 和存储性能才能担此重责。与其依赖路由器 ID 来确定 DR 和 BDR 结果,不如使用 ip ospf priority 接口命令来控制选举。

Router(config-if)#ip ospf priority {0 - 255}

在前述讨论中,各台路由器的 OSPF 优先级相等,原因在于所有路由器接口的优先级值默认为 1,因此通过路由器 ID 来确定 DR 和 BDR。但如果将该值从默认值 1 改为更高的值,则具有最高优先级的路由器将成为 DR,具有第二高优先级的路由器将成为 BDR。若该值为 0,则该路由器不具备成为 DR 或 BDR 的资格。

因为优先级是特定于具体接口的值,因此可用于更好地控制 OSPF 多路访问网络。它们还可以使一台路由器在一个网络中充当 DR,同时在另一个网络中充当 DROther。

单击图中的 show ip ospf interface。

为方便讨论,我们从拓扑中删除了 RouterD。可使用 show ip ospf interface 命令查看 OSPF 接口优先级。在图中,我们可看到 RouterA 上的优先级被设为默认值 1。

单击图中的“修改优先级”。

如图所示,RouterA 和 RouterB 的 OSPF 优先级被修改,因此具有最高优先级的 RouterA 成为 DR,RouterB 则成为 BDR。RouterC 上的 OSPF 接口优先级保持为默认值 1。

单击图中的“强制选举”。

当在所有三台路由器的 FastEthernet 0/0 接口上按顺序执行 shutdown 和 no shutdown 命令后,即可看到 OSPF 接口优先级改变所带来的结果。RouterC 上的 show ip ospf neighbor 命令现在显示 RouterA(路由器 ID 为 192.168.31.11)是 DR,其 OSPF 接口优先级最高,为 200;RouterB(路由器 ID 为 192.168.31.22)仍是 BDR,其 OSPF 接口优先级第二高,为 100。请注意 RouterA 的 show ip ospf neighbor 命令输出中未显示 DR,因为 RouterA 就是此网络中的 DR。

 九、更多OSPF配置

  • 拓扑

让我们恢复使用之前的拓扑,并添加一条通向 ISP 的链路。就象在 RIP 和 EIGRP 中一样,连接到 Internet 的路由器用于向 OSPF 路由域内的其它路由器传播默认路由。此路由器有时也称为边缘路由器、入口路由器或网关路由器。然而,在 OSPF 术语中,位于 OSPF 路由域和非 OSPF 网络间的路由器称为自治系统边界路由器 (ASBR)。在本拓扑中,Loopback1 (Lo1) 代表一条通向非 OSPF 网络的链路。我们不会将网络 172.30.1.1/30 配置为 OSPF 路由过程的一部分。

  • 单击图中的“R1 静态默认配置”。

如图所示,ASBR (R1) 配置有 Loopback1 IP 地址和静态默认路由,可向 ISP 路由器转发通信:

R1(config)#ip route 0.0.0.0 0.0.0.0 loopback 1

注:该静态默认路由使用环回接口作为送出接口,原因在于本拓扑中的 ISP 路由器实际上并不存在。我们可以通过使用环回接口来模拟与其它路由器的连接。

与 RIP 相似的一点是,OSPF 需要使用 default-information originate 命令来将 0.0.0.0/0 静态默认路由通告给区域内的其它路由器。如果未使用 default-information originate 命令,则不会将默认的“全零”路由传播给 OSPF 区域内的其它路由器。

命令语法为:

R1(config-router)#default-information originate

单击图中的 R1、R2 和 R3。

R1、R2 和 R3 的路由表中现在设置了 "gateway of last resort"。请注意,R2 和 R3 的默认路由的路由来源为 OSPF,但带有一个额外代码 E2。对于 R2,该路由为:

O*E2 0.0.0.0/0 [110/1] via 192.168.10.10, 00:05:34, Serial0/0/1

E2 表示此路由为一条 OSPF第 2 类外部路由。

OSPF 外部路由分为以下两类:第 1 类外部 (E1) 和第 2 类外部 (E2)。两种类型的差异在于路由的 OSPF 开销在每台路由器上的计算方式不同。当 E1 路由在整个 OSPF 区域内传播时,OSPF 会累计路由的开销。此过程与普通 OSPF 内部路由的计算过程相同。然而,E2 路由的开销却始终是外部开销,而与通向该路由的内部开销无关。在本拓扑中,因为路由器 R1 的默认路由的外部开销是 1,所以 R2 和 R3 默认 E2 路由显示的开销也是 1。对 OSPF 来说,E2 路由的默认开销为 1。这些默认值以及其它外部路由信息的更改方法在 CCNP 课程中讨论。

  • 参考带宽

您应该记得,Cisco OSPF 开销使用累积带宽。每个接口的带宽值根据“100,000,000/带宽”算得。100,000,000(即 10 的 8 次幂)称为参考带宽。

因此,当将实际带宽转换为开销度量时,100,000,000 是默认的参考带宽。前面学过,现在出现了比快速以太网快得多的链路,例如千兆以太网和 10GigE(10 千兆以太网)。使用 100,000,000 作为参考带宽会导致带宽值等于或大于 100 Mbps 的接口具有相同的 OSPF 开销值 1。

为获得更准确的开销计算结果,可能需要调整参考带宽值。可使用 OSPF 命令 auto-cost reference-bandwidth修改参考带宽,以适应这些更快链路的要求。如果需要使用此命令,请同时用在所有路由器上,以使 OSPF 路由度量保持一致。

R1(config-router)#auto-cost reference-bandwidth ?
1-4294967 The reference bandwidth in terms of Mbits per second

请注意该值的单位为 Mbps。因此,默认值等于 100。要将其增大到 10GigE 的速率,需要将参考带宽更改为 10000。

R1(config-router)#auto-cost reference-bandwidth 10000

同样,请确保在 OSPF 路由域内的所有路由器上配置此命令。IOS 也会提醒您这一点,如图所示。

单击图中的“R1 更改前”和“R1 更改后”。

R1 的路由表显示出 OSPF 开销度量的改变。请注意,现在 OSPF 路由的开销值大得多了。例如,在R1 更改前中,到 10.10.10.0/24 的开销为 1172。配置新的参考带宽后,相同路由的开销为 65635。

修改 OSPF 间隔
单击图中的“R1 邻居 1”。

R1 上的 show ip ospf neighbor 命令确认 R1 与 R2 和 R3 相邻。请注意,在输出中,Dead 间隔从 40 秒开始倒计时。默认情况下,当 R1 收到邻居每隔 10 秒发来的 Hello 时,此值被重置。

可能需要更改 OSPF 计时器以使路由器更快地检测到网络故障。这样做会增加流量,但有时需要快速收敛,即使导致额外的流量也在所不惜。

可使用下列接口命令手动修改 OSPF Hello 间隔和 Dead 间隔:

Router(config-if)#ip ospf hello-intervalseconds
Router(config-if)#ip ospf dead-intervalseconds

单击图中的“修改 R1 计时器”。

如图所示,R1 的 Serial 0/0/0 接口上的 Hello 间隔和 Dead 间隔分别被修改为 5 秒和 20 秒。更改 Hello 间隔之后Cisco IOS 立即自动将 Dead 间隔修改为 Hello 间隔的四倍。然而,最好是明确修改该计时器,而不要依赖 IOS 的自动功能,因为手动修改可使修改情况记录在配置中。

20 秒之后,R1 上的 Dead 间隔到期。R1 和 R2 失去了相邻关系。我们仅在 R1 和 R2 之间串行链路的一端修改了间隔值。

%OSPF-5-ADJCHG:Process 1, Nbr 10.2.2.2 on Serial0/0/0 from FULL to DOWN, Neighbor Down:Dead timer expired

单击图中的“R1 邻居 2”。

请记住,邻居的 OSPF Hello 间隔和 Dead 间隔必须相同。您可在 R1 上使用 show ip ospf neighbor 命令验证相邻关系已失去。请注意,邻居 10.2.2.2 已不再出现。但 10.3.3.3(即 R3)仍是邻居。Serial 0/0/0 接口上的计时器设置不影响与 R3 的相邻关系。

单击图中的“R2 计时器”。

可在 R2 上使用 show ip ospf interface serial 0/0/0 命令验证 Hello 间隔和 Dead 间隔不匹配的情况。R2(路由器 ID 为 10.2.2.2)上的间隔值仍然设为:Hello 间隔为 10 秒,Dead 间隔为 40 秒。

单击图中的“修改 R2 计时器”。

要恢复 R1 和 R2 的相邻关系,请在 R2 的 Serial 0/0/0 接口修改 Hello 间隔和 Dead 间隔,使其与 R1 的 Serial 0/0/0 接口上的相应间隔值匹配。IOS 显示一条消息,表明已建立相邻关系,且状态变为 FULL。

14:22:27: %OSPF-5-ADJCHG:Process 1, Nbr 10.1.1.1 on Serial0/0 from LOADING to FULL, Loading Done

单击图中的“R1 邻居 3”。

在 R1 上使用 show ip ospf neighbor 命令验证相邻关系已恢复。请注意,Serial 0/0/0 接口的 Dead 间隔现在低得多了,因为它现在从 20 秒钟而非默认的 40 秒钟开始倒计时。Serial 0/0/1 仍然使用默认计时器工作。

注:OSPF 要求两台路由器匹配 Hello 间隔和 Dead 间隔才能形成相邻关系。这与 EIGRP 不同,两台路由器的 Hello 计时器和抑制计时器无需匹配,即可形成 EIGRP 相邻关系。

十、EIGRP

十一、NAT

静态NAT、动态NAT、PAT

【参考资料】
1、51cto的ospf专题

【CCNA Exploration 4.0 路由协议和概念3】相关推荐

  1. 超级微商系统开发,社交电商3.0时代的概念

    超级微商系统概况 社交电商3.0时代 社交电商"新"在哪,微商未来的出路在何方? 微商兴起到至今已经有6个年头,经历6年的起起伏伏,模式一直在更新迭代,适应时代的发展需求. 格力. ...

  2. 新版思科CCNA认证1.0 零基础入门技术VTP协议解析-ielab网络实验室

     新版思科CCNA认证1.0 零基础入门技术VTP协议解析-ielab网络实验室 VTP(VLAN Trunking Protocol):VLAN中继协议,是Cisco专用协议.也被称为虚拟局域网干道 ...

  3. isis宣告网络_ISIS路由协议的概念及实验配置

    一.IS-IS(中间系统(路由器)间的路由协议) IS-IS最初是国际化标准组织ISO为它的无连接网络协议CLNP设计的一种动态路由协议 IS-IS是ISO定义的OSI协议栈中无连接网络服务CLNS( ...

  4. CCNA 学习笔记(四)--路由协议(RIP)

    现在我们先复习下,什么是路由? 答:当路由器(或者其它三层设备)收到一个IP数据包时,会查看数据包的IP头部中的目的IP地址,并在路由表中进行查找,在匹配到最优路由后,将数据包扔向路由条目所批的下一跳 ...

  5. 0.《新概念51单片机C语言教程》(郭天祥)学习笔记

    看到之前的阅读量,有标题党的嫌疑,再接再厉,加油坚持自己的文风,相信会写的越来越好:) 继续更(一个人,一个记事本,一个PDF阅读器,装备全靠打) <新概念51单片机C语言教程>(郭天祥) ...

  6. 基于python/scipy学习概率统计(0):基础概念

    目录 0. 前言 1. 随机变量 1.1 随机事件 1.2 概率 1.2 随机变量 1.3 离散随机变量 1.4 连续随机变量 1.5 随机变量的概率分布 2. 概率函数 2.1 概率质量函数¶ 2. ...

  7. 「自控元件及线路」0 电磁学基本概念与定律

    本节介绍在本课中会用到的一些概念和定律,如安培环路定律.磁路欧姆定律等 本节分析圆柱面磁场间的力矩的周期性 文章目录 概念和定律 磁感应强度B 磁通量Φ\PhiΦ 磁场强度H 磁导率μ\muμ 电磁感 ...

  8. localhost与127.0.0.1的概念和工作原理之不同

    2019独角兽企业重金招聘Python工程师标准>>> localhost:也叫local ,正确的解释是:本地服务器 127.0.0.1:在windows等系统的正确解释是:本机地 ...

  9. SMGP3.0协议的概念知识

    该项目主页在https://code.google.com/archive/p/smgp/,可以使用VPN进去看看,该项目是开源的,根据SMGP3.0协议写的API,我们要用的话直接调用就好了,这里主 ...

最新文章

  1. Unity中创建本地多人游戏完整案例视频教程 Learn To Create A Local Multiplayer Game In Unity
  2. You're AllSet! 以多重集函数角度重新检视超图GNN
  3. DNS隧道之DNS2TCP实现——dns2tcpc必须带server IP才可以,此外ssh可以穿过墙的,设置代理上网...
  4. 引入 ServletContextListener @Autowired null 解决办法
  5. Platform.Uno介绍
  6. 前端学习(1288):nodejs模块化开发
  7. 面试题: 找出二叉树上任意两个结点的最近共同父结点。
  8. Android Multimedia框架总结(三)MediaPlayer中创建到setDataSource过程
  9. 软件项目经理应具备的素质和条件_项目经理应具备的素质和能力
  10. swift 图片压缩
  11. ipadpro尺寸的html,iPad Pro屏幕尺寸是多少?iPad Pro分辨率是多少?
  12. MySQL8.0安装踩坑记录
  13. 页面在微信端禁止缩放
  14. php写前端还是nodejs,javascript - 新手想在短期内写一个个人博客,是用php还是用nodejs?...
  15. 从事软件行业的第759天,人还是要经常审视自己
  16. 解决ps不能直接把文件拖进去的问题
  17. Fritzing软件绘制Arduino面包板接线图传感器模块库文件174
  18. Oracle-opatchauto自动安装补丁失败导致RAC集群异常问题
  19. python 内建排序 HOW TO
  20. 一个使用LABVIEW将16进制字符串分割转化的办法

热门文章

  1. 讣告 | ACL终身成就奖得主Aravind Joshi去世
  2. 中国无人车第一案!百度状告景驰王劲:窃取机密,不还电脑,索赔5000万
  3. 《Java8实战》-第五章读书笔记(使用流Stream-02)
  4. Nopcommerce主要用到的技术及特点
  5. 企业级应用的前端思考。
  6. [老老实实学WCF] 第一篇 Hello WCF
  7. JavaScript ES5之Object.create函数详解
  8. Android字数限制的EditText实现方案研究
  9. 在QT中CXDVA视频组件的例子
  10. We change lives !