一、什么是OSPF
- OSPF(Open Shortest Path First,开放最短路径优先)是IETF 开发的基于链路状态的自治系统内部路由协议
- OSPF仅传播对端设备不具备的路由信息,网络收敛迅速,并有效避免了网络资源浪费
- OSPF直接工作于IP层之上,IP协议号为89
- OSPF以组播地址发送协议包
二、与RIP的区别
RIP:运行距离矢量路由协议,周期性的泛洪自己的路由表,通过路由的交互,每台路由器都从相邻(直连)的路由器学习到路由,并且加载进自己的路由表中,而对于这个网络中的所有路由器而言,他们并不清楚网络的拓扑,他们只是简单的知道要去往某个目的应该从哪里走,距离有多远。
OSPF:运行链路状态路由协议,路由器之间交互的是LSA(Link State Advertisement链路状态通告:用来描述网络链路状况如邻居、开销等),而非路由信息。路由器将网络中泛洪的LSA 搜集到自己的LSDB(Link State DataBase链路状态数据库)中,这有助于OSPF 理解整张网络拓扑,并在此基础上通过SPF 最短路径算法计算出以自己为根的、到达网络各个角落的、无环的树,最终,路由器将计算出来的路由装载进路由表中。
泛洪(Flooding)是交换机和网桥使用的一种数据流传递技术,将从某个接口收到的数据流向除该接口之外的所有接口发送出去。
三、OSPF特性
- OSPF 链路状态协议(开放式最短路径优先),无类路由协议,支持VLSM(可变长子网掩码),CIDR(无类别域间路由),支持安全认证
- 采用SPF 算法(Dijkstra迪杰斯特拉算法)计算最佳路径,快速响应网络变化网络变化时触发更新
- 以较低频率(每隔30 分钟)发送定期更新,被称为链路状态刷新
- 与距离矢量相比,链路状态协议掌握更多的网络信息
四、OSPF三张表
1.邻居表(Neighbor table):列出了所有和本路由器直接相连的OSPF邻居,经历了一系列的消息交互、关系状态最终建立。
2. 拓扑表(Topology table):含有链路状态数据库(LSDB),列举了所有自己产生及邻居那得到的LSA(Flooding/泛洪),在同一个OSPF区域中的路由器,都有完全一致的OSPF Database,即OSPF数据库。一个OSPF区域,就对应着一个OSPF Database。
3. 路由表(Routing table):在OSPF的数据库中,通过SPF算法,计算得到了最优路由,也称为Forwarding Database。
五、OSPF Packets (OSPF 五种报文)
因为是基于IP 开发的,所以协议号为89,同时也是意味着其也是不可靠的。
根据OSPF数据包type 字段数值的不同,OSPF 数据包类型分为5 种,不同的type,其后面的内容也不同。
路由表的形成与这5 种数据包的交互息息相关。
- type=1:Hello 数据包
- type=2:数据库描述包--DD 或者DBD(只出现在Exstart/Exchange 阶段)
- type=3:链路状态请求包---LSR (只出现在Loading 阶段)
- type=4:链路状态更新包---LSU
- type=5:链路状态确认包---LSAck
六、OSPF 七种状态
1.Down(停止):各路由器未与任何邻居交换信息,开始从运行OSPF 的接口以组播地址224.0.0.5发送Hello 包。
2. Init(初始):各路由器收到第一个Hello 数据包后,把该路由器添加到自己的邻居Neighbor 列表中。
3. Two-Way (双向状态属于邻居关系):收到的Hello 包中有自己的Router ID,将该路由器加入自己邻居列表中,进入2-Way 状态。在这个过程中同时选举出DR 和BDR。若不形成邻接关系则一直停留在该状态。
4. Exstart(准启动):DROther与DR/BDR 发送DBD 包确定Master/Slave 关系,RID 大的的成为Master(不一定是DR)。
5. Exchange(交换):Master 与Slave 之间相互单播发送一个或多个DBD 数据库描述数据包(Slave沿用Master 的序列号先发送),进行DBD 的同步。DBD 有序号,由Master 决定DBD的序号。相互收到DBD 后,通过序列号进行隐式确认已收到DBD。Exchange 状态结束的最后一个DBD 包是Slave 发送的。
6. Loading (加载):将收到的信息同LSDB 中的信息进行比较。如果DBD 中有更新的链路状态条目,则向对方发送一个LSR,用于请求新的LSA,对方回复相应的LSU,当所有LSR都得到LSU 答复后向对方回应LSAck进行显示确认。
7. Full (完全状态,属于邻接关系):相邻的路由器在Loading 完成同步后进入Full 状态,开始正常转发数据。此时区域内的每个链路应该都有相同的数据链路状态数据库。后续只有Hello包、LSU 包、LSAck包。
七、OSPF协议工作过程概述
OSPF协议工作过程主要有四个阶段:
寻找邻居----建立邻接关系----链路状态信息传递----计算路由
1)寻找邻居(OSPF协议工作过程第1步)
2)建立邻接关系-基于广播型网络(OSPF协议工作过程第2步)
3)传递信息(OSPF协议工作过程第3步)
- 以上是RTB获得RTA LSA的过程,RTA也通过相同的过程获得RTB的LSA
- 在RTB与RTA的LSA信息同步后,RTA在RTB邻居表内的状态变迁为Full状态
- OSPF协议包具备超时重传机制
- OSPF协议包具备序列号,对重复包不做处理
- LSA更新携带掩码,支持VLSM(变长子网掩码)
4)路由计算(OSPF协议工作过程第4步)
路由计算步骤:
- 评估一台路由器到另一台路由器所需要的开销(cost),cost值与接口带宽密切相关。
开销=100/带宽(Mps),取整,默认最小是1
- 同步到ospf区域的每台路由器的LSDB
- 使用SPF计算出路由
八、LSA的洪泛
建立邻接关系后,当网络中出现了网络变化,其他路由器只发送更新报文LSU给指定路由器和备用路由器,再由指定路由器发给洪泛全网。
九、Router-ID
- Router-ID 用于在OSPF 区域中唯一地表示一台OSPF 路由器,全OSPF 域内禁止出现两台路由器拥有相同的Router-ID。
- Router-ID 的设定可以通过手工配置,也可通过协议自动选取。实际网络部署中考虑到协议的稳定,建议手工配置。一般以loopback0作为routerID
- 在路由器运行了OSPF 并由系统自动选定Router-ID 之后,如果该Router-ID 对应的接口down 掉,或出现一个更大的IP,OSPF 仍然保持原Router-ID(即Router-ID 值是非抢占的,稳定第一),即使此时reset ospf process 重启OSPF 进程,Router-ID 也不会发生改变;除非重新手工配置Router-ID(命令router-id xxx),并且重启OSPF 进程方可。
- 如果该Router-ID 对应的接口IP 地址消失,例如undo ip address,则reset ospf process (重启OSPF进程)后,RouterID 也会发生改变。
十、DR和BDR选举
指定路由器(DR) 、备用指定路由器(BDR)
- Hello包携带路由器优先级,优先级为0的路由器不具备选举资格
- 优先级相同(默认1),则比较Router ID的优先
- 先选举BDR,再选举DR
- DR和BDR一旦选定,即使OSPF区域内新增优先级更高的路由器,DR和BDR也不重新选举,只有当DR和BDR都失效后,才参与选举
十一、DR 选举规则
DR 和BDR 是由同一网段中所有的路由器根据路由器优先级、Router ID 通过Hello 报文选举出来的,只有优先级大于0 的路由器才具有选取资格,优先级为0 不参与选举。
进行DR/BDR 选举时每台路由器将自己选出的DR 写入Hello 报文中,发给网段上的每台运行OSPF 协议的路由器。当处于同一网段的多台路由器同时宣布自己是DR 时,接口优先级最高者胜出;如果优先级相等(默认为1),Router-ID 最高者胜出。
DR 具有非抢占性,也就是说如果该MA 网络(多路访问网络,MA的网络一般分为两种:广播式多路访问网络和非广播式多路访问网络。)中,已经选举完成、并且选举出了一个DR,那么后续即使有新的、更高优先级的设备加入,也不会影响DR 的选举,除非DR 挂掉。