CCNA非常不错的学习笔记,我总结如下:
开放最短路径优先 (OSPF) 协议是一种链路状态路由协议,旨在替代距离矢量路由协议 RIP。OSPF 是一种无类路由协议,它使用区域概念实现可扩展性。RFC 2328 将 OSPF 度量定义为一个独立的值,该值称为开销。 Cisco IOS 使用带宽作为 OSPF 开销度量。
OSPF背景
Internet 工程工作小组 (IETF) 的 OSPF 工作组于 1987 年着手开发 OSPF。当时,Internet 基本是由美国政府资助的学术研究网络。以下是发展历程:
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 数据包 1 是 OSPF Hello 数据包。Hello 数据包用于:
l 发现 OSPF 邻居并建立相邻关系。
l 通告两台路由器建立相邻关系所必需统一的参数。
l 在以太网和帧中继网络等多路访问网络中选举指定路由器 (DR) 和备用指定路由器 (BDR)。
重要字段包括:
l 类型:OSPF 数据包类型:Hello (1)、DD (2)、LS 请求 (3)、LS 更新 (4) 或 LS 确认 (5)
l 路由器 ID:始发路由器的 ID
l 区域 ID:数据包的始发区域
l 网络掩码:与发送方接口关联的子网掩码
l Hello 间隔:发送方路由器连续两次发送 hello 数据包之间的秒数
l 路由器优先级:用于 DR/BDR 选举
l 指定路由器 (DR):DR 的路由器 ID(如果有的话)
l 备用指定路由器 (BDR):BDR 的路由器 ID(如果有的话)
l 邻居列表:列出相邻路由器的 OSPF 路由器 ID
建立相邻关系
在 OSPF 路由器可将其链路状态泛洪给其它路由器之前,OSPF首先要建立邻居。OSPF Hello 中的信息包括发送方路由器的 OSPF 路由器 ID。如果通过一个接口收到 OSPF Hello 数据包,即可确认该链路上存在另一台 OSPF 路由器。随后,OSPF 即与该邻居建立相邻关系。
OSPF Hello 间隔和 Dead 间隔
两台路由器在建立 OSPF 相邻关系之前,必须统一三个值:Hello 间隔、Dead 间隔和网络类型。OSPF Hello 间隔表示 OSPF 路由器发送其 Hello 数据包的频度(默认情况下,在多路访问网段和点对点网段中每 10 秒钟发送一次 OSPF Hello 数据包,而在非广播多路访问 (NBMA) 网段(帧中继、X.25 或 ATM)中则每 30 秒钟发送一次 OSPF Hello 数据包。)Hello数据包使用组播发送给ALLSPFRouters 的专用地址 224.0.0.5 。
Dead 间隔是路由器在宣告邻居进入 down(不可用)状态之前等待该设备发送 Hello 数据包的时长,单位为秒。Cisco 所用的默认断路间隔为 Hello 间隔的四倍。如果 Dead 间隔已到期,而路由器仍未收到邻居发来的 Hello 数据包,则会从其链路状态数据库中删除该邻居。
选举 DR 和 BDR
为减小多路访问网络中的 OSPF 流量,OSPF 会选举一个指定路由器 (DR) 和一个备用指定路由器 (BDR)。当多路访问网络中发生变化时,DR 负责使用该变化信息更新其它所有 OSPF 路由器(称为 DROther)。BDR 会监控 DR 的状态,并在当前 DR 发生故障时接替其角色。
(点对点链路相互连接,不会执行 DR/BDR 选举。)
OSPF链路状态更新
链路状态更新 (LSU) 数据包用于 OSPF 路由更新。一个 LSU 数据包可能包含11类型的链路状态通告 (LSA),术语“链路状态更新 (LSU)”和“链路状态通告 (LSA)”之间的差异有时较难分清。有时,它们可以互换使用。一个 LSU 包含一个或多个 LSA,这两个术语中的任何一个都可用于表示由 OSPF 路由器传播的链路状态信息。
以下是LAS的11种类型:
OSPF算法
每台 OSPF 路由器都会维持一个链路状态数据库,其中包含来自其它所有路由器的 LSA。一旦路由器收到所有 LSA 并建立其本地链路状态数据库,OSPF 就会使用 Dijkstra 的最短路径优先 (SPF) 算法创建一个 SPF 树。随后,将根据 SPF 树,使用通向每个网络的最佳路径填充 IP 路由表。
管理距离:OSPF的管理距离(AD)是“110”。
身份验证:
与对其它路由协议一样,OSPF 也可进行身份验证配置。对传输的路由信息进行身份验证是好的做法。此做法可确保路由器仅接受配置有相同的口令和身份验证信息的其它路由器所发来的路由信息。
OSPF基本配置
Router ospf 命令:
process-id 是一个介于 1 和 65535 之间的数字,由网络管理员选定。process-id仅在本地有效,这意味着路由器之间建立相邻关系时无需匹配该值。
配置方法:
R1#conf t
R1(config)#router ospf 1
R1(config-router)#
Network 命令
OSPF 中的 network 命令与其它 IGP 路由协议中的 network 命令具有相同的功能:
l 路由器上任何符合 network 命令中的网络地址的接口都将启用,可发送和接收 OSPF 数据包。
l 此网络(或子网)将被包括在 OSPF 路由更新中。
Router(config-router)#network network-address wildcard-mask areaarea-id
area area-id 指 OSPF 区域。OSPF 区域是共享链路状态信息的一组路由器。相同区域内的所有 OSPF 路由器的链路状态数据库中必须具有相同的链路状态信息,这通过路由器将各自的链路状态泛洪给该区域内的其它所有路由器来实现。(“0”为骨干区域)
OSPF路由器ID
确定路由器 ID
OSPF 路由器 ID 用于唯一标识 OSPF 路由域内的每台路由器。Cisco 路由器按下列顺序根据下列三个条件确定路由器 ID:
l 使用通过 OSPF router-id 命令配置的 IP 地址。
l 如果未配置 router-id,则路由器会选择其所有环回接口的最高 IP 地址。
l 如果未配置环回接口,则路由器会选择其所有物理接口的最高活动 IP 地址。
OSPF router-id 命令
Router(config)#router ospf process-id //进入OSPF配置模式
Router(config-router)#router-id ip-address //配置Router-id
修改路由器 ID
使用:Router#clear ip ospf process 命令来重启OSPF进程,然后去修改你想要的Router-id。
重复的路由器 ID
当同一个 OSPF 路由域内的两台路由器具有相同的路由器 ID 时,将无法正常路由。如果两台相邻路由器的路由器 ID 相同,则无法建立相邻关系。当出现重复的 OSPF 路由器 ID 时,IOS 将显示一条类似下列的消息:
%OSPF-4-DUP_RTRID1:Detected router with duplicate router ID
验证Router-id:使用show ip protocols来验证。
验证OSPF
show ip ospf neighbor 命令可用于验证 OSPF 相邻关系并排除相应的故障。此命令为每个邻居显示下列输出:
l Neighbor ID — 该相邻路由器的路由器 ID。
l Pri — 该接口的 OSPF 优先级。
l State — 该接口的 OSPF 状态。FULL 状态表明该路由器和其邻居具有相同的 OSPF 链路状态数据库。
l Dead Time — 路由器在宣告邻居进入 down(不可用)状态之前等待该设备发送 Hello 数据包所剩余的时间。此值在该接口收到 Hello 数据包时重置。
l Address — 该邻居用于与本路由器直连的接口的 IP 地址。
l Interface — 本路由器用于与该邻居建立相邻关系的接口。
l
在下列情况下,两台路由器不会建立 OSPF 相邻关系:
l 子网掩码不匹配,导致该两台路由器分处于不同的网络中。
l OSPF Hello 计时器或 Dead 计时器不匹配。
l OSPF 网络类型不匹配。
l 存在信息缺失或不正确的 OSPF network 命令。
其它功能强大的 OSPF 故障排除命令包括:
show ip protocols
可用于快速验证关键 OSPF 配置信息,其中包括 OSPF 进程 ID、路由器 ID、路由器正在通告的网络、正在向该路由器发送更新的邻居以及默认管理距离
show ip ospf
命令也可用于检查 OSPF 进程 ID 和路由器 ID,此外,还可显示 OSPF 区域信息以及上次计算 SPF 算法的时间。
路由器每次收到有关拓扑的新信息时,必须重新运行 SPF 算法,SPF 算法会占用很多 CPU 资源。以下信息是使用show ip ospf的输出。
Initial SPF schedule delay 5000 msecs
Minimum hold time between two consecutive SPFs 10000 msecs
Maximum wait time between two consecutive SPFs 10000 msecs
状态在 up 和 down 之间来回变化的网络称为链路不稳。链路不稳会导致区域内的 OSPF 路由器持续重新计算 SPF 算法,从而无法正确收敛。为尽量减轻此问题,路由器在收到一个 LSU 后,会等待 5 秒(5000 毫秒)才运行 SPF 算法。这样可以防止路由器持续运行 SPF 算法,还存在一个 10 秒(10000 毫秒)的保留时间。路由器运行完一次 SPF 算法后,会等待 10 秒才再次运行该算法。
show ip ospf interface
此命令用于检验 Hello 间隔和 Dead 间隔的最快方法。Cost就是开销值。
检查路由表
使用show ip route 命令可用于检验路由器是否正在通过 OSPF 发送和接收路由。每条路由开头的 O 表示路由来源为 OSPF。
OSPF度量
OSPF 度量称为开销RFC 2328 中有下列描述:“开销与每个路由器接口的输出端关联。系统管理员可配置此开销。开销越低,该接口越可能被用于转发数据流量。”
Cisco IOS 使用从路由器到目的网络沿途的传出接口的累积带宽作为开销值。
图示为各种接口的默认 OSPF 开销。
参考带宽
参考带宽默认为 10 的 8 次幂,即 100,000,000 bps,亦即 100 Mbps。这使带宽等于或大于 100 Mbps 的接口具有相同的 OSPF 开销 1。
可使用 OSPF 命令 auto-cost reference-bandwidth 修改参考带宽值。如果需要使用此命令,则建议同时用在所有路由器上,以使 OSPF 路由度量保持一致。
OSPF 累计开销
OSPF 路由的开销为从路由器到目的网络的累计开销值。(就是说源地址到目的地址中间经过的所有路径的开销值进行相加)
修改链路的开销
bandwidth 接口命令或 ip ospf cost 接口命令都可用于达到此目的 — 使 OSPF 在确定最佳路由时使用准确的值。(要该就要两端都要改)
Router(config-if)#bandwidth bandwidth-kbps //修改接口的带宽参数。
Router(config-if)# ip ospf cost “加数字” //命令则直接将链路开销设置为特定值并免除了计算过程。
多路访问网络中的挑战
在多路访问网络中,相同的共享介质上连接有两台以上设备。以太网 LAN 就是一种广播多路访问网络。因为该网络中的所有设备会看到所有广播帧,所以它属于广播网络。
OSPF 定义了五种网络类型:
l 点对点
l 广播多路访问
l 非广播多路访问 (NBMA)
l 点对多点
l 虚拟链路
多路访问网络对 OSPF 的 LSA 泛洪过程提出了两项挑战:
1. 创建多边相邻关系,其中每对路由器都存在一项相邻关系。
2. LSA(链路状态通告)的大量泛洪。
多边相邻关系
在网络中的每对路由器间创建相邻关系会产生一些不必要的相邻关系。这将导致大量 LSA 在该网络内的路由器间传输。对于多路访问网络中任意数量(用 n 表示)的路由器,将存在 n ( n - 1 ) / 2 项相邻关系。但随着网络中路由器数量增加,相邻关系数量将急剧增大。
LSA 泛洪
链路状态路由器会在 OSPF 初始化以及拓扑更改时泛洪其链路状态数据包。在多路访问网络中,此泛洪过程中的流量可能变得很大。
解决方案:指定路由器(DR)
用于在多路访问网络中管理相邻关系数量和 LSA 泛洪的解决方案是指定路由器 (DR)。(可比喻为在房间里选举出一个人,由该人员向所有人逐个询问姓名,然后将这些姓名一次性通告给所有人。)多路访问网络中的路由器会选举出一个 DR 和一个 BDR。DROther 仅与网络中的 DR 和 BDR 建立完全的相邻关系。这意味着 DROther 无需向网络中的所有路由器泛洪 LSA,只需使用组播地址 224.0.0.6(ALLDRouters — 所有 DR 路由器)将其 LSA 发送给 DR 和 BDR 即可。
DR/BDR选举过程(DR/BDR 选举不会发生在点对点网络中)
DR/BDR 选举
选举过程遵循以下条件:
1. DR:具有最高 OSPF 接口优先级的路由器
2. BDR:具有第二高 OSPF 接口优先级的路由器
3. 如果 OSPF 接口优先级相等,则取路由器 ID 最高者。
DROther 仅与 DR 和 BDR 建立完全的相邻关系,但也会与该网络中的任何其它 DROthers 建立相邻关系。这意味着多路访问网络中的所有 DROther 路由器仍然会收到其它所有 DROther 路由器发来的 Hello 数据包。当两台 DROther 路由器形成相邻关系后,其相邻状态显示为 2WAY。
使用show ip ospf neighbor可以快速查看DR、BDR和DROther以及2WAY。
使用show ip ospf interface 可以查看详细的DR、BDR信息
DR/BDR 选举的时间安排
DR 一旦选出,将保持 DR 地位,直到出现下列条件之一为止:
l DR 发生故障。
l DR 上的 OSPF 进程发生故障。
l DR 上的多路访问接口发生故障。
如果 DR 发生故障,BDR 将接替 DR 角色,随即进行选举,选出新的 BDR。
新路由器加入该网络。如果在选出 DR 和 BDR 后有新路由器加入网络,即使新路由器的 OSPF 接口优先级或路由器 ID 比当前 DR 或 BDR 高,也不会成为 DR 或 BDR。
前任 DR 返回网络后不会重新取得 DR 的地位。
如果 BDR 发生故障,则会在 DRother 之间选出新的 BDR。
您怎样确保所需的路由器在 DR 和 BDR 选举中获胜呢?无需进一步配置,解决方案有两种:
l 首先启动 DR,再启动 BDR,然后启动其它所有路由器;
l 关闭所有路由器上的接口,然后在 DR 上执行 no shutdown 命令,再在 BDR 上执行该命令,随后在其它所有路由器上执行该命令。
OSPF接口优先级
由于 DR 成为 LSA 的集散中心,所以它必须具有足够的 CPU 和存储性能才能担此重责。与其依赖路由器 ID 来确定 DR 和 BDR 结果,不如使用 ip ospf priority 接口命令来控制选举。
Router(config-if)#ip ospf priority {0 - 255}
OSPF默认路由重分发
R1#conf t
R1(config)#ip route 0.0.0.0 0.0.0.0 loopback 1
R1(config)#router ospf 1
R1(config-router)#default-information originate
路由表的输出信息:O*E2 0.0.0.0/0 [110/1] via 192.168.10.10, 00:05:34, Serial0/0/1
O表示从OSPF学到的路由
E2 表示此路由为一条 OSPF第 2 类外部路由。
OSPF 外部路由分为以下两类:第 1 类外部 (E1) 和第 2 类外部 (E2)。两种类型的差异在于路由的 OSPF 开销在每台路由器上的计算方式不同。
l E1 路由在整个 OSPF 区域内传播时,OSPF 会累计路由的开销。
l E2 路由的开销却始终是外部开销,而与通向该路由的内部开销无关。
微调OSPF
参考带宽
可使用 OSPF 命令 auto-cost reference-bandwidth修改参考带宽,以适应这些更快链路的要求。
R1(config-router)#auto-cost reference-bandwidth “1~4294967”单位是Mbits
修改 OSPF 间隔
可使用下列接口命令手动修改 OSPF Hello 间隔和 Dead 间隔:
Router(config-if)#ip ospf hello-intervalseconds //Hello间隔多少秒发送一次
Router(config-if)#ip ospf dead-intervalseconds //多少秒没有收到Hello就Down