OSPF

距离矢量路由协议
路由器互相之间只更新路由表信息,并且逐跳更新,依照传闻的更新。
任何一台路由器对路由表的更改,都将直接影响下游。
链路状态路由协议
每台路由器都选择一个IP地址作为自己的名字(Router-ID)
将自己的每个接口的网络信息,带宽信息进行描述,做成链路状态信息
将Router-ID和链路状态一起发送给自己的邻居,并且也帮助其他设备转发
最终会得到全网所有路由器的链路状态信息,通过分析可以得到全网拓扑图
使用最短路径(SPF)算法,得到去往每个目的地的最短路线,生成路由表

简介

OSPF在Cisco中的管理距离为110
不使用传输层的TCP/UDP进行数据封装,更新消息直接放在网络层后,协议号为89
OSPF使用触发更新的机制,和邻居共享链路状态信息,而不是共享路由表信息。
OSPF有邻居的概念,使用Hello消息来建立和维护邻居。在以太网中10s发送一次,40s没收到就判定邻居失效。
OSPF建立邻居有7个状态
OSPF使用224.0.0.5和224.0.0.6来更新LSA(链路状态通告)

名词介绍

Router-ID

相当于路由器的名字,因为需要靠Router-ID去辨识每个节点,所以在一个网络中不允许出现Router-ID一样。
Router-ID会以稳定性作为第一要素

  1. Router-ID会优先选择路由器Loopback接口的IP地址,如果有多个,选择数值最大的。
  2. 在没有Loopback的情况下,会选择物理接口IP数值最大的,注意,这个接口必须要是up状态。
  3. Router-ID允许手动指定 router-id x.x.x.x ,但是往往不能及时生效,除非重启,不然还是稳定保持不变。

Area

由于OSPF每台路由器都有全网的拓扑,如果这个网络比较庞大,那么任何一个网段的变化,都会导致OSPF路由器中链路状态数据库的数据发生变化,从而触发路由器对所有的目的地最佳路线进行重算。
为了节约资源和加快路由器运行速度,所以OSPF可以进行区域划分,每台路由器只需要计算本区域的拓扑,对于其他区域的网段,只需要知道怎么离开本区域就行了。
OSPF有两种区域,一种是骨干区域,区域号为0,这个是固定的只要是骨干区域,区域号必须是0。非骨干区域,非骨干区域的区域号除了0都可以。
非骨干区域必须和骨干区域相连,在正常情况下所有的区域都可以学习到全网所有的路由条目。在人为优化的情况下,可以让非骨干区域只学习到本区域的路由,去其他区域从默认路由走,从而精简路由表。

OSPF邻居表

R2#show ip ospf neighbor 

Neighbor ID     Pri   State           Dead Time   Address         Interface
1.1.1.1           1   FULL/DR         00:00:39    192.168.12.1    Ethernet0/0

邻居表里面记录了邻居的Router-ID
选举DR和BDR时用到的优先级(默认是1)
记录了当前处于邻居建立过程中的状态和邻居接口的角色DR/BDR/DRother
邻居状态有down,init,2-way,exstart,exchange,loading,full
并且提供邻居死亡计时40s倒计时,每当收到邻居的hello包的时候,就重置,计时到0,就删除邻居。

邻居建立过程

  1. down

    1. 表示OSPF启动了,由于某些原因,还没开始发送hello
  2. init

    1. 表示收到了对方发给我的hello消息,但是没有在对方的hello消息中看到自己的Router-ID
  3. 2-way

    1. 在收到对方发给我的hello中发现了自己的Router-ID
    2. 开始选举谁做指定路由器(DR)
  4. exstart(预开始)

    1. 开始选举谁来主导这个链路状态信息交换的过程,选举(Slave,Master),选举的时候比较Router-ID,谁大谁是Master
    2. 注意,此阶段互相传递的消息格式是链路状态数据库摘要(DBD),但是内容为空。
  5. exchange(预交换)

    1. 由Slave发送自己链路状态数据库的摘要给Master,由Master确认之后,再将Slave需要的链路状态信息摘要发过去。
  6. Loading

    1. 开始发送链路状态请求,然后接受对方发送的完整链路状态信息。
  7. Full

    1. 完成当前阶段的链路状态数据库同步,之后只需要维持邻居关系和触发更新。

DR和BDR

  1. 在多路访问网络里面,OSPF会互相建立邻居关系,导致最终邻居关系复杂,更新消息重复而多余。所以在MA网络中选举一个路由器作为指定路由器(DR),在非DR中再选一个作为备份指定路由器(BDR),当任何的更新来临时,会先发送给DR和BDR,再由DR发送给所有的DRother路由器。
  2. 选举DR和BDR的时候,先看优先级越大越优,如果是0,就不参与DR和BDR选举,如果DR或BDR被改为0,就会直接放弃DR或BDR。如果优先级一样,就看Router-ID谁大,谁就是DR,第二大的是BDR。不过必须在第一台设备启动后的40s内选举,超出这个时间,就不可以抢占DR和BDR。
  3. DR和BDR在监听224.0.0.5和224.0.0.6这两个组播地址,DRother只监听224.0.0.5这个组播地址。当需要更新的时候,DRother会向224.0.0.6去更新,DR会向224.0.0.5去更新消息。
  4. 为了让ospf网络可以快速收敛,可以考虑在合适的接口上配置p2p网络类型,让ospf邻居不进行40s等待。

LSA链路状态通告

链路状态通告,里面包含了路由器的ID和链路相关的IP地址,带宽等信息。
目前在OSPF中,一共有11种LSA

LSA类型代码描述
1路由器LSA
2网络LSA
3网络汇总LSA
4ASBR汇总LSA
5AS外部LSA
6组成员LSA
7NSSA外部LSA
8外部属性LSA
9Opaque LSA (链路本地范围)
10Opaque LSA (本地区域范围)
11Opaque LSA (AS范围)

1类LSA

每台路由器都会产生,用来描述自身的接口状态的

2类LSA

由DR产生,用来向全网告知自己所在的局域网的成员信息

3类LSA

由ABR(区域边界路由器)产生,用来将其他区域的路由进行汇总,然后转发到本区域。注意ABR传递的是路由表类似的LSA,会丢失掉拓扑的信息,所以区域之间是无法得知拓扑的。

4类LSA

由ABR(注意!!!)产生,用来告知本区域的路由器如何离开本OSPF自治系统的。告诉你学校大门在哪里。

5类LSA

由ASBR产生的,用来告知本区域的路由器外面的路由条目。告诉你学校大门外面有哪些地方。

7类LSA

用于在NSSA区域表示外部路由,由NSSA区域中的ASBR产生

LSU

链路状态更新,更新里面含有LSA。

LSDB

链路状态数据库,数据库中会记录每个LSA更新的路由器ID,会记录序列号,序列号是用16进制表示的。
数据库会给每个LSA一个计时器,这个计时器是LSA的老化时间,正常情况下3600s就会让这条LSA失效。
但是OSPF会每隔1800s泛洪更新一次LSA。

Stub(末梢区域)

如果不想让非骨干区域学习到OSPFAS外的条目,达到精简路由表的目的,可以在ABR上对末梢区域进行 area 1 stub 配置,这样ABR就不会先那个区域发送AS外的条目,还会产生一条 0.0.0.0/0 的路由,保障没有路由的情况下这个区域也可以访问外界。不过本区域的所有路由器都别忘了配置stub不然邻居关系无法建立。
注意,该区域不存在4、5类LSA

Stub no-summary(完全末梢区域)

如果做到极致精简,可以让末梢区域连OSPF其他区域的路由也不学习。可以在ABR上对末梢区域进行 area 1 stub no-summary 配置就可以了。Stub no-summary也被称为完全末梢区域,这个区域只会有一条3类LSA,是 0.0.0.0/0 用来指向ABR。不过本区域的所有路由器都别忘了配置stub不然邻居关系无法建立。
注意,该区域不存在4、5类LSA,以及除了ABR默认路由3类LSA以外的3类

NSSA(次末梢区域)

由于Stub区域无法存在4、5类LSA,所以stub区域无法引入外部路由。如果使用NSSA区域来做末梢,就可以引入外部的路由条目,不过是以7类LSA方式进入,并且会在NSSA区域边界路由器上被转为5类。
默认情况下,NSSA不会向非骨干区域注入一条指向ABR的默认路由,不过可以手动注入一条默认路由的7类LSA。 area 1 nssa default-information-originate 

T-NSSA(完全次末梢区域)

除了可以存在7类LSA引入外部路由以外,其他功能和stub no-summary一致。