OSPF使用IP协议号89标识;
OSPF的层次化网络结构优势:
一个Area的拓扑发生变化而引起的LSA泛洪不会影响到其他OSPF区域,即缩小了拓扑变化导致的LSA泛洪影响范围;
OSPF的Hello包的作用:
1、OSPF路由器间用来建立邻居/邻接状态;
2、在多路访问链路下,用于选举DR/BDR;
3、在OSPF邻居关系建立完成后,用来充当Keepalive的角色,保持邻居有效。
OSPF邻居建立失败的因素:
1、router-id冲突
2、hello-interval/dead-interval不一致;
3、Authentication密码不一致
4、area-id不一致;
5、area-type不一致;
6、IP地址掩码不一致;
7、Network-Type不一致;(这种情况下可以建立邻接关系,但是不会将路由加载进路由表)
8、MTU不一致;(该情况会导致卡在Exstart/Exchange状态)
9、Hello包被过滤;
OSPF的操作过程:
1.OSPF路由器从激活了OSPF进程的接口下组播发送Hello包,Hello包中包含了本链路上的所有邻居的router-ids,如果邻居路由器收到了该hello包,发现里面含有自己的router-id,并且本路由器收到邻居的hello,也发现有自己的router-id,则双方进入Two-communication状态,此状态下开始选举DR/BDR;
2.建立邻接关系必须有一个前提条件:双方的hello包中包含的Authentication、hello-interval、dead-interval、network-type、MTU必须完全一致,并且router-id不能冲突、接口的IP地址掩码必须一致,满足这些条件才会建立起邻接关系;
3.如果上述条件满足,并且进入了Two-Way状态,在多路访问链路下会进行DR/BDR的选举(参与选举DR/BDR的OSPF路由器的priority必须大于0);
4、DR/BDR选举完成后,进入Extart/Exchange状态,由router-id最高者成为Master,router-id低得成为Slave,相互交互DBD,DBD描述了LSDB的简要信息,OSPF路由器收到DBD后,将DBD描述的信息与自己的LSDB比较,看看自己缺少哪些路由信息,然后将自己缺少的路由信息以LSR的形式发给对方,向对方请求这些路由的详细情况;路由器收到LSR之后,将LSR需要的路由条目的详细信息放入LSU中,即LSA,向邻居通告具体条目信息;
5、进入Loading状态,该状态下也进行LSR/LSU的交互,该过程称为数据库同步过程;
6、最后进入Full状态,双方拥有相同的LSDB;
OSPF网络中的所有路由器都重复以上的过程,最终所有OSPF路由器都拥有相同的LSDB,也就是说每台路由器都将拥有一张整个网络的拓扑图,然后OSPF路由器将以自身为根,根据这张LSDB,使用SPF算法构建SPF算法树,从这棵SPF算法树中选择达到每个目的网段的最佳路径放入路由表;
SPF算法树根据沿着路由方向去往目的地的所有OSPF路由器出接口的cost的累加和进行计算,计算公式为cost=10^8/BW;
DR/BDR
在多路访问网络下,OSPF路由器将会选举DR/BDR,由DR负责整个多路访问网络中的除hello之外的其他所有OSPF packets的传递;
多路访问网络中的所有OSPF路由器都与DR/BDR建立邻接关系,非DR/BDR之间建立邻居关系(DROthers),DR和BDR之间也是建立邻接关系;
BDR监控DR的存活状态,一旦DR失效,BDR将立即顶替DR的位置而自己成为DR,此时会重新激活一个BDR选举进程,选出新的BDR;
如果在已经存在DR/BDR的网络中新加入一台OSPF路由器,不管该路由器拥有多高的priority,都不会抢占已有的DR/BDR角色,即DR/BDR不能被抢占;
DR/BDR是针对接口而言的,不是针对整个路由器的;
DR发送OSPF packets使用的组播地址是224.0.0.5,所有的OSPF路由器都会侦听该地址,并接受和处理发往该地址的OSPF packets;
DROthers发送OSPF packets使用的组播地址是224.0.0.6,这个地址只有DR/BDR才会侦听该地址;
DR/BDR的选举步骤:
1、priority最高者为DR,次高者为BDR;
2、priority相同时,比较router-id,router-id高者为DR,次高者为BDR;
OSPF Packets
1.Hello
用来建立邻居/邻接关系;选举DR/BDR;充当Keepalive的角色保持邻居有效;
2.DBD
描述自己的LSDB的简要的路由条目(相当于目录);需要确认;
3.LSR
向邻居路由器请求自己不知道的网络的详细信息;需要确认;
4.LSU(LSA)
路由器用来响应LSR的,内容就是详细的路由信息;需要确认;
5.LSAck
用来对DBD、LSR、LSU进行确认的。
OSPF LSA
1类LSA router LSA
每台OSPF路由器都会产生,用来描述自身运行OSPF的接口所关联的链路状态,包括自身的router-id、接口所属的子网号、掩码;
只能在本Area内泛洪扩散;
2类LSA Network LSA
Network-LSA仅仅在多路访问链路上存在,由DR产生,用来描述该多路访问链路上的所有的邻居router-id,包括DR本身的router-id;
只能在本Area内泛洪扩散;
3类LSA Network Summary LSA
Network Summary LSA由ABR产生,用来描述本Area以外的其他OSPF Areas里的OSPF路由信息;
在整个OSPF自治系统内泛洪扩散;
4类LSA ASBR summary LSA
ASBR summary LSA由ABR产生,用来描述ASBR是谁,旨在告知OSPF系统内所有路由器ASBR是谁,它的内容就是ASBR的router-id,即一个32位的主机路由;
在除了ASBR所在的Area的其他OSPF Areas内泛洪扩散;
5类LSA AS External LSA
AS External LSA由ASBR产生,用来描述OSPF自治系统之外的其他外部路由信息;
在整个OSPF自治系统内泛洪扩撒;
6类LSA Multicast LSA(用于MOSPF)
7类LSA NSSA AS External LSA
LSA的内容与5类LSA几乎完全一样,不一样的是7类LSA仅仅存在于NSSA区域,7类LSA被限制在NSSA区域内泛洪扩散;
ABR收到7类LSA之后,会根据7类LSA头部的P-bit是0还是1来决定是否将其转化成5类LSA,泛洪到其他区域;
如果P-bit为1 ,则将7类LSA转化为5类LSA;
如果P-bit为0, 则不将7类LSA转化为5类LSA;
OSPF 特殊区域
Stub Area
如果一个OSPF Area只有一个出口,那么就可以考虑将该区域设置成OSPF Stub区域;
Stub Area不允许有5类LSA(即外部路由)进入,所有5类LSA都会在ABR处被过滤,ABR会以3类LSA得形式向Stub区域下发一条默认路由,stub area的所有路由器都将使用该默认路由去往OSPF外部网络;
stub Area的设定也减少了一些低端设备的LSDB负载;
Totally Stub Area
如果再强制一下,在ABR处把3类LSA也过滤掉,即stub区域的路由器都使用默认路由去往域间网段和OSPF外部网段;这样的stub称为totally stub;
NSSA(Not-so-stubby Area)
Stub区域的特点是不能有5类LSA存在,也就不能往stub区重分布外部路由,那么如果在某些情况下,又需要重分布外部路由呢?NSSA就取消了stub区域的这一限制,允许将外部路由重分布进来,但是为了不与stub area发生冲突,将外部路由以7类LSA进行通告,7类LSA只能在本NSSA区域内传递;
Totally NSSA
同样也把3类LSA过滤了,ABR会下发一条默认路由来补偿;
OSPF Network-Type
point-point 不选DR/BDR 组播发数据,地址224.0.0.5
point-to-multipoint 不选DR/BDR 单播发数据
broadcast 选DR/BDR 组播发数据,DR发到224.0.0.5,DROthers发到224.0.0.6
non-broadcast 选DR/BDR 单播发数据
virtual-link 不选DR/BDR,且Hello包在邻接关系建立完成之后就不再发了 单播发数据
OSPF Virtual-Link建立条件:
1、Virtual-Link所穿越的区域不能使stub区域!
2、Virtual-Link只能在两台ABR之间创建;
3、Virtual-Link默认属于Area0,如果启用了区域0认证,则需要对Virtual-Link进行认证配置;
OSPF路由类型
Intra-area path 域内路由
Inter-area path 域间路由
Type 1 external path(E1) O E1的路由在OSPF内传递时,每传一跳都会加上相应的cost值;
Type 2 external path(E2) O E2的路由忽略在OSPF内的传递时的cost,仅仅保留被ASBR通告时初始化的cost;
OSPF的路由汇总
OSPF的汇总只能在ABR或者ASBR上进行!!!
在ABR上 router(config-router)#area 0 range10.1.0.0 255.255.0.0
在ASBR上 router(config-router)#summary-address10.1.0.0 255.255.0.0