在之前的介绍中,可以看到单区域OSPF对于古老的RIP的优点:
- 路由选择更新流量减小
- 使用与大型网络和链路速度不一样的网络
OSPF能够在LSDB中呈现网络拓扑结构,这使得它汇聚的速度远快于RIP。
但是,单区域的OSPF存在严重的可拓展性问题,首先单区域内的路由器众多,存在的链路数目也是非常多,那么当链路状态发送改变的时候,就需要全部的路由器重新计算LSDB,这无疑是复杂而又繁琐的,占用了大量的路由器CPU时间和内存。此外不要忘记,还有路由表,这使得内存更加不堪重负。
考虑到这些,单区域OSPF不适用于大型网络的原因就是它的可拓展性的限制。它将所有的路由器划分到一个区域中,使得每一台路由器都要处理大量LSA。
如何解决这个问题呢?好在OSPF也提供对网络分区域的方法,它支持将一个大型互联网络划分成易于管理的小块。
OSPF分区域的优点:耗用内存小,处理器开销小,路由表规模小,汇聚更快,可拓展性好。
- 区域内部的路由器不要再计算和存储整个网络的拓扑结构,即不用再计算整个网络的LSDB。因为它们只需要知道当前区域内的链路状态信息,这极大的降低了使用的内存。
- 对于区域内部的路由器来说,当别的区域链路发生变化的时候,不用重新计算LSDB;当且仅当所属区域的拓扑发生变化的时候,才需要重新计算。这样做降低了处理器的开销。
- 由于可以在区域边界汇总路由,所以路由器的路由选择表规模比使用单区域的时候小的多。
多区域OSPF简介
在多区域的OSPF中路由器的各种类型:主干路由器,内部路由器,区域边界路由器(ABR),自主系统边界路由器(ASBR)。
链路状态通告LSA,描述了路由器及其直接相连的网络,路由器彼此交换LSA以获悉完整的网络拓扑,这让所有路由器的拓扑数据库LSDB都一样。利用LSA建立LSDB之后,将LSDB的内容作为Dijkstra算法的输入,计算得到最短路/最佳路径,添加到路由表项中。
建立邻居关系的条件
发现邻居之后,必须建立邻居关系,这样才能够与邻居交换路由信息LSA。需要经过以下两个步骤:
- 双向通信,这是使用Hello协议进行的。
- 数据库同步,在此期间交换三种分组:1)数据库描述分组(DD); 2)链路状态请求分组(LSR); 3)链路状态更新分组(LSU)。
数据库同步之后,就建立了邻居关系。
相邻路由器想要建立邻居关系,以下的内容必须相同:
- 区域ID
- 子网
- Hello定时器和失效定时器
- 身份验证方法(如果配置了)
何时建立邻居关系取决于网络类型,如果是点对点的,只要两台路由器配置了正确的信息,那么就将建立邻居关系。
如果是 广播多路访问网络,那么OSPF只与DR或者是BDR建立邻居关系。
OSPF路由器类型
所有接口都属于同一个区域的,我们称之为内部路由器,它们所有的接口都属于同一个区域。
配置多区域路由器的时候,必须配置一个主干区域,即区域0.在区域0内的路由器称为主干路由器,有的完全属于区域0,有的则是 ASBR,ABR 这种不完全属于区域0的。
注意!为什么要设置区域0:
第一:区域防环,OSPF在区域内防环机制是靠SPF路由算法(树型),那OSPF区域间防环如何做的呢??那如果没有一个骨干区域,路由就可能会从一个区域传出去,再从这个区域传进来,这样环路就无法防止了。骨干区域就是实现这个功能,可以理解为“OSPF 的毒向逆转”,即路由从一个区域传过来的,绝不会从该区域再出去。
第二:路由优化,很容易想像有AREA 0,所有常规区域的路由必须从骨干区域获得更新,而常规区域之间是不会交互LSA更新。即不用形成一个FULL MESH的结构,以减少路由表的size。
ABR
当一个路由器的不同接口,连接到两个不同区域的时候,这样的路由器称为 区域边界路由器ABR。
ABR 属于多个OSPF区域,它在拓扑数据库LSDB中维护来自所有直连区域的信息。但不在区域间分享拓扑信息。
ABR 会将路由选择信息从一个区域转发到另外一个区域(通过第三第四类LSA),这里的核心概念是:ABR 分隔LSA泛洪区(即LSA泛洪只在区域内进行),是主要的区域地址汇总点,通常提供默认路由,同时维护其连接的每个区域的链路状态数据库(也就是说,它的LSDB中拥有来自多个区域的LSA路由更新)。
ASBR
当一个路由器的不同接口,连接到两个或两个以上不同自治系统的时候,这样的路由器称为 自治系统边界路由器ASBR。
ASBR至少有一个接口连接到外部网络(其它的AS)。
运行的路由器选择协议不是OSPF的网络,被称为外部网络。ASBR通过将其从外部网络获取的选择信息,注入OSPF(通过第五类LSA)。
ASBR 并不会自动在 OSPF路由选择进程 和 外部网络的路由选择进程 之间进行路由选择学习的交换。这种路由选择是通过重分发进行的。
链路状态通告LSA
路由器的LSDB链路状态数据库由链路状态通过组成。LSA大致分为5类(其实不止)。
LSA的分类
第一类LSA:称为路由器链路通告(RLA),由每台路由器向其所属区域的其他路由器发送。包含路由器所连接的当前区域的链路状态。如果路由器有多个接口连接到不同的区域,那么它将分别发送针对各个区域的一类LSA。
第二类LSA:称为网络链路通告(NLA),是由指定路由器DR生成的,DR使用它来发送网络中其他路由器的状态信息。注意:2类LSA被洪泛到当前区域,但不会洪泛到其他的区域,也就是说,ABR分割LSA洪泛区。
第三类LSA:称为汇总链路通告(SLA),是由边界区域路由器ABR产生的,ABR将它发送到ABR连接的其他区域,3类LSA通告网络,并通告前往主干区域 区域0的区域间路由。
第四类LSA:有区域边界路由器ABR生成,专门用于告诉其他的OSPF区域如何前往ASBR.
第五类LSA:称为外部链路通告,由自主系统边界路由器发送,用于通告前往OSPF自助系统外的路由,将传遍整个OSPF自主系统。
明白各种LSA及其用途很重要,由上面的介绍可以知道:
- 第一类第二类用于区域内的路由器进行传播。
- ABR边界区域路由器 1)维护它连接的每个区域的LSDB 2)用于 从区域M获悉到的 路由汇总信息 通告给区域0 或者相反。
- 在接收到 ASBR 通告的 第5类LSA 之后,ABR 将 第四类LSA 洪泛到区域0,让区域内的所有路由器都知道如何前往ASBR。
OSPF Hello协议
Hello协议向邻居提供大量的信息,默认的情况下,邻居每个10s就交换以下信息:
- 路由器ID:RID,最大活动IP地址,如果配置了loopback interface,则为最大的 interface address;否则使用最大的物理接口地址。
- Hello间隔和失效间隔:Hello时间指的是Hello分组发送的时间间隔,一般默认为10s。失效时间指的是,时隔多长时间没有收到来自邻居的Hello报文之后确认邻居失效,默认为Hello时间的四倍。
- 邻居列表:发送Hello分组的路由器 的所有邻居的 RID。一般存储于邻居关系数据库内。邻居的定义是:属于同一个子网,使用同一个子网掩码。
- 区域ID:所属区域。
- 路由器的优先级:一个8bit的值,用于选举DR和BDR,在点到点链路上不设置。
- DR的IP地址
- BDR的IP地址
- 身份验证信息(如果配置了)
注意,每个OSPF路由器维护两个数据库,一个是我们经常提到的LSDB,另外一个是 邻居关系数据库:当路由器接收到另外一个路由器发送的Hello报文的时候,将Hello内的信息加入邻居关系数据库。
之前有提到,在邻居发送的Hello分组中,如果想要建立 邻居关系,以下信息必须相同:
- Hello定时器值
- 失效定时器值
- 区域ID
- OSPF区域类型
- 子网和身份验证信息(如果配置了的话)
否则不能建立邻居关系。
邻居状态
对OSPF进行配置验证以及故障排除,必须了解OSPF在建立 邻居关系 的时候经历的各种状态。
我认为可以大致的分为两个部分,一个是使用Hello协议 通过组播地址 建立起普通的关系,即2WAT状态;一个是交换LSA,含LSDB的信息 来 同步数据库,即FULL状态。
假设此时有两台路由器A与B 想要建立起邻接关系,那么它们之间将会有八种状态:
第一步:进入2WAY状态
一开始,两台路由器都属于DOWN状态。
A先发送Hello报文,B接收了它,把A和Hello内的信息加入邻居关系数据库。
B进入INIT状态,并向A发送Hello报文。
A收到来自B的Hello报文,加入邻居关系数据库,双方进入 2WAY状态。
INIT状态:B已经收到了A的Hello报文,将A加入邻居关系数据库,但是此时A发送的Hello报文尚未有B的信息(B的RID),这表明还未建立双向联系。
建立双向联系之后,在广播多路访问网络中,开始选举DR和BDR。
当two-way关系建立以后,路由器之间会考虑是否建立邻接关系,这决定于邻居路由器的状态 以及网络的类型。如果网络的类型是广播或者非广播,那么仅仅会在DR和BDR路由器之间建立邻接关系。在其他类型的网络中(NBMA),邻接关系只会在邻居路由器之间建立。
第二步:进入FULL状态
选举完DR和BDR之后,进入 预启动EXSTART状态,为发现有关互联网络的链路状态信息(LSA) 并为创建LSDB做好了准备。
在预启动阶段,DR和BDR已经和区域中的其他路由器建立了邻居关系。在每台路由器和DR(BDR)之间,建立的是 主从关系:RID 较大的为主,主动发起交换。交换完DBD(数据库描述)分组之后,路由器 进入EXCHANGE交换状态。
此时,A向DR发送了第一个DB报文,B向DR发送了第二个DB报文,DB报文中的RID较大的那个(比如 A的RID > B的RID)成为Master,A将主动发起同B的交换。
处于交换状态的时候,A和B 使用 DD/DBD数据库描述分组 进行交换 路由选择信息,还可能发送链路状态请求LSR,和链路状态更新。
当路由器A开始发送LSR之后,进入加载状态(LOADING).
当A路由器 处在LOADING状态的时候,向邻居B 发送 链路状态请求(LSR)分组 ,请求对方发送在交换期间遗漏或者受损的LSA。邻居B 使用 LSU链路状态更新分组 进行回应,当前路由器A 则使用LSAck链路状态确认分组进行确认。
在B收到所有A的LSR的应答之后,A和B的 链路数据库便完全同步了,进入FULL状态。
整个过程:
(1)A ---(Hello)---> B; B -> INIT
(2)B ---(Hello)---> A
(3)A,B -> 2WAY
----------------------------------
(4)
A <-> DR;
B <-> DR;
A,B -> EXSTART
(5)
Judge: [A_RID > B_RID]
-> Master: A
(6)
A ---(DBD/DD)---> B;
A,B -> EXCHANGE
(7)
B ---(DBD/DD)---> A;
······
A ---(LSR)---> B;
A,B -> LOADING
(8)
B ---(LSU)---> A;
A ---(LSAck)---> B;
······
(9)
A,B ---> FULL
2WAY -> 主从关系确定;预准备阶段 -> 交换链路信息(DD/DBD)阶段 -> 加载阶段,用于补全缺失的LSA -> 发送LSAck,代表同步结束 -> FULL。
注意,只有在进入FULL状态之后,也就是同步了所有LSA的信息之后,建立了邻居关系,OSPF路由选择才能正常运行。
路由器的最终状态,要么是2WAY,要么是FULL,其他状态都属于过渡状态。路由器在其他状态不应该停留过久。
2016/8/30