概述:
1.OSPF 是公有标准协议,OSI 模型第三层,属于 IGP 路由协议;
2.OSPF的数据包是直接封装在 IP 头部后面,协议号是 89
3.通过组播的方式发送报文,组播地址是 224.0.0.5,表示的是所有的OSPF路由器;
一、为什么会出现OSPF:
在OSPF出现前,网络上广泛使用RIP(Routing Information Protocol)作为内部网关协议。由于RIP是基于跳数路由协议,距离矢量协议依照传闻进行路由的更新和路由的选择。这种情况下路由器并不了解整个网络的拓扑,只知道到达目的网络的距离,以及到达目的网络应该走哪个方向或者哪个接口,路由在传递过程中不能超过16个路由,严重影响网络的发展,因此只适用于小型企业,虽然思科推出了IGRP 和EIGRP 但是那是人家私有的,其它厂商是用不了的。对此存在着收敛慢、路由环路、可扩展性差等问题,所以就被OSPF取代。
二、工作原理:(三张表)
(一)、建立邻居表,形成邻居关系;
怎样建立邻居表:
建立邻居是通过设备相互发送hello 报文进行参数比较,通过后形成邻居关系。
报文类型:
1.Hello,负责邻居表的建立、维护和拆除;
2.DD,database description,数据库描述报文
3.LSR,link state request,链路状态请求;
4.LSU,link state update ,链路状态更新;
5.LSAck,link state ack,链路状态确认报文;
hello报文
OSPF hello 报文解析:
1.OSPF header
-version --- 表示 OSPF 的版本号,版本为2
- type --- 表示 OPPF 的报文类型
-packet length --- 表示 OSPF 的报文长度
-router id --- 表示 发送当前 OSPF 报文的那个路由器的 router-id
-area id --- 表示 OSPF 报文所属于的区域
-checksum --- 表示 OSPF 报文的校验和
-auth type --- 表示 OSPF 报文的认证类型,默认是Null,即空认证,也就是没做认证
-auth data --- 表示 OSFP报文的认证数据,即密码
2.OSPF Hello packet
-network mask - hello 报文的出接口的IP地址的网络掩码
-hello interval - 发送 hello 报文的周期,默认是 10s
-options - 可选字段,体现的是一个 OSPF 路由器的能力
-router priority - 表示路由器的优先级,默认是 1
-router dead interval - 表示邻居关系的最大存活时间,默认是40s
-designated router - 指定路由器(接口的概念,指的不是路由器)
-back designated router - 备份指定路由器(接口的概念,指的不是路由器)
-active neighbor - 包含的是邻居设备的 router-id ;
3.OSPF 邻居建立的影响因素
1.两个设备之间的IP必须互通
2.确保路由器能够发送 OSPF 报文
①.发送报文的接口的网段,必须 network 命令后面;
不network 这个接口就不会发送hello包,没有包后面什么都不是了。
②.确保发送报文的接口,没有被配置为 OSPF 的静默接口(silent-interface)
3.确保发送报文的方式是相同的
1.要么都是组播 网络类型有 Broadcast P2P P2MP 在接口下面进行修改。
2.要么都是单播 网络类型有 NBMA 在接口下面进行修改。
常见类型:
广播(Broadcast)
-是否需要DR:是的
-是否主动发送报文:是的
-发送方式:组播, 224.0.0.5
-hello计时器:10s
-dead计时器:40s
非广播(NBMA)
-是否需要DR:是的
-是否主动发送报文:不是
-发送方式:如果想要发,必须手动指定,进行“单播”
-hello计时器:30s
-dead计时器:120s
点到点(P2P) , 此时认为该端口上仅仅2个设备,不需要 DR 的选举;
-是否需要DR:不需要
-是否主动发送报文:是
-发送方式:组播,224.0.0.5
-hello计时器:10s
-dead计时器:40s
点到多点(P2MP),此时认为该端口上存在很多个 P2P 的邻居,不需要 DR 的选举
-是否需要DR:不需要
-是否主动发送报文:是
-发送方式 :组播, 224.0.0.5
-hello计时器:30s
-dead计时器:120s
4.确保路由器能够接收 OSPF 报文
①.接收报文的接口的网段,必须写在 network 命令后面;
②.确保接收报文的接口,没有被配置为 OSPF 的静默接口(silent-interface)
③.确保接收报文的接口,没有配置 ACL 策略,拒绝 OSPF 报文
5.确保路由器之间比较 OSPF hello 报文:
1. router-id ,不能相同
2. area-id ,必须相同
3.认证,必须成功
4.接口网络掩码,必须相同 【在特殊情况下】
5.hello 周期,必须相同
6.可选项(options),必须相同
7.路由优先级不能全为 0 【在特殊情况下】
8.dead 周期,必须相同
(二)、OSPF数据库:
包含的内容是:LSA ,即 link state advertisement ,链路状态通告,也叫链路状态信息。OSPF 路由表中的条目信息,都是通过各种类型的 LSA ,计算出来的。如果没有 LSA,肯定没有 OSPF 路由, 如果有 LSA ,也不一定有 OSPF 路由。
关于 LSDB ,需要知道的:
1.LSDB 中包含了“自己的LSA”,以及“别的设备产生的 LSA ”
2.在一个路由器的 LSDB 中,各种类型的 LSA 是按照“区域”进行组织起来的;
3.每个区域中的 OSPF 路由器的 LSDB 都是相同的(因为状态是 Full)
4.不同区域中的 OSPF 路由器的 LSDB 都是不相同的
要想学好LSDB就得了解它,并且爱上它,从它的结构,同步过程呀,以及它的作用和计算原理。
①.LSDB的结构:
分析一下:
type:表示的是 LSA 的类型,类型包括 1/2/3/4/5/7
LinkState ID ,表示的是LSA的名字;不同类型的 LSA ,名字的表示方法是不相同的
AdvRouter,表示的是 产生这个 LSA 的路由器的 router-id ;
Sequence,表示的是 LSA 的“序列号”,体现 LSA 的新旧程度;序列号越大,表示越新;
如果 LSA 的 “type”相同、“LinkState ID”相同、“AdvRouter”也相同, 那就可以说:它两是相同的 LSA 。两个相同咋办 那只能看它们的Sequence ,保留数字大的。
那么最终的话,仅仅会在数据中保留1个,即只会保留“最新的LSA”,也就是“序列号”大的那一个。
②.LSDB同步过程:
1.两个 OSPF 路由器,在互相直连的接口,周期性的发送 OSPF Hello报文,通过比较 hello 报文的参数,进行邻居状态的迁移,从而邻居状态从 down 变成 full 。
邻居的状态迁移:
down,此时表示邻居完全断开。
init,初始化状态,表示刚刚收到邻居发送过来的hello报文,并且在该hello报文中没有自己。比如你喜欢一个姑娘,你俩也认识彼此,你给那姑娘买了一束花想给个惊喜,于是你就放在了她的桌子上,她来了看到了花让后四处观看是谁送的,结构你害羞就没回应,于是她以为是她暗恋的人给买的,结构就没结构了,你俩就只能成为朋友,就不能再上进一点了,哎 还是码字吧。
two-way,双向通信状态,表示在邻居发送过来的hello报文中,发现了自己的 router-id ,为了实现后续的数据库同步过程更加的高效,此时,就开始进行 DR/BDR 的竞选。
选择原则:
接口优先级不能全为0,全为0的设备,永远只能是 DRother ;
首先比较端口的 dr 优先级,越大越好;默认是1;
其次比较路由器的 RID ,越大越好;
同时, DR/BDR 有个特点就是稳定。即邻居之间的 DR/BDR 一旦选定了,那么即使来了一个 DR 优先级更高的路由器,也不会将DR/BDR 的身份抢占过去,如果想要重新选举DR ,那么就不修得“重启OSPF路由器”或者“OSPF协议进程”,并且,一旦有了DR、BDR、DRother,那么各种设备之间的关系是:
所有的设备,都和DR/BDR 同步数据库,建立 Full 状态的邻接关系。
DRother 之间,永远只能处于 two-way 状态,此时只能称之为邻居关系。
exstart,交换初始化状态。主要的目的是为了接下来的“exchange"做准备工作。该在状态的时候,设备之间发送了第一个 DD 报文 ,主要是用来确定邻居设备之间的主/从关系,为了后续的数据库同过程中更加的“可靠”。
主/从关系的选举原则:比较两个邻居路由器的 router-id ,越大越好;
在 DD 报文中,存在以下3个关键的字段:
i: 表示的是initional,初始化的意思;
-如果1,表示这个DD就是“初始化”DD报文,即第一个DD报文;
-如果0,表示这个DD报文不是“第一个”DD报文;
m:表示的是 more ,更多的意思;
-如果1,表示后续还有更多的DD报文,即当前这个DD报文不是最后一个DD;
-如果0,表示后面没有更多的DD报文,即当前这个DD报文是最后一个DD;
M/S:表示的是 Master/Slave ,即主/从关系的身份
-如果1,表示发送这个DD报文的设备身份是 Master,即主设备;
-如果0,表示发送这个DD报文的设备身份是 Slave,即从设备;
exchange,交换状态,在该状态交换的是邻居设备之间的数据库条目的“简要信息”,即大量的 DD 报文。 DD,就是数据库描述报文。里面包含的是仅仅是数据库条目中的 LSA 的简要信息,不是详细信息。当邻居设备之间的数据库的 DD 报文,全都“交换”完毕的时候,两边设备才开始对比DD报文,看看两个设备的数据,哪里存在差异。对自己没有的 LSA ,主动开始进行请求。
loading,加载状态。基于“交换状态”收到的大量的 DD 报文,以及最终的比对结果。终于知道了双方的数据库到底存在哪些类型的 LSA 的差异。所以,开始主动的向对方发送 LSR,对方收到以后,就开始回复 LSU 。并且,LSR和LSU这两种类型的数据库,都必须通过可靠的方式进行传输。 所以,在传输 LSR 和LSU 的时候的,都会返回一个 LSAck 。 当两边的数据库中的 LSA 的信息,完全一致的时候,就算是“加载完毕”,然后进入下一个状态
Full ,完全邻接。此时互为邻居的两个设备,数据库完全一致,可以称之为“邻接”。
③.LSA的作用:
1类LSA
作用:
任何一个路由器,都会在自己所连接的任何一个区域,产生1个1类LSA
用于表示自己的每个链路的信息,相当于设备在指定区域中的“自我介绍”
type : router
link-state ID : 每个路由器的 router-id
AdvRouter : 每个路由器的 router-id
特点:
该类型的 LSA ,仅仅在一个区域内部传输;
每个路由器都会在所连接的每个区域,都独自产生1个;
2类LSA
作用:
DR 产生2类LSA的作用,主要就是在一个网段中,描述 DR 的管理范围/设备;
type : Network
link-state ID : DR的接口IP地址
AdvRouter : DR接口所在的路由器的 router-id
特点:
只有 DR 可以产生2类LSA
该类型的 LSA 只能在一个区域内部传输
3类LSA
作用:
在不同的区域之间,进行路由条目信息的传递;
type : sum-net
link-state ID : 区域之间的路由的网段
AdvRouter : ABR 的 router-id
特点:
只有ABR可以产生3类 LSA ,在不同区域之间传递路由信息;
该类型的 LSA 只能在一个区域内部传输
该类型的 LSA 在传输过程中,每经过一个 ABR ,advRouter 就会变成所经过的那个 ABR 的 router-id
4类LSA
作用:
在不同区域之间,传递 ASBR 的 router-id ;
配合5类LSA,进行 OSPF 外部路由的计算。
type : Sum-Asbr
link-state ID : ASBR 的 router-id
AdvRouter : 与 ASBR 在同一个区域的 ABR 的 router-id
特点:
与ASBR在同一个区域的ABR产生的;
该类型的 LSA 只能在一个区域内部传输
该类型的 LSA 在传输过程中,每经过一个 ABR ,advRouter 就会变成所经过的那个 ABR 的 router-id
5类LSA
作用:
表示 OSPF 的外部路由;传遍整个 OSPF 网络。
type : External
link-state ID : 外部路由的网段;
AdvRouter : ASBR 的 router-id
特点:
只有 ASBR 才可以产生 5类 LSA
5类 LSA 在传输过程中,没有任何区域限制。
7类LSA (特殊区域才有)
作用:
表示 OSPF 的外部路由,但是只能在 NSSA 区域内部传输;
type : NSSA
link-state ID : 外部路由的网段;
AdvRouter : ASBR 的 router-id
特点:
只有 NSSA 区域中的 ASBR 才可以产生 7类 LSA
该类型的 LSA 只能在区域内部传输;
该区域的 ABR 会自动的将7类LSA转换成5类LSA
如果该NSSA区域有多个ABR,只有router-id 大的才能进行7->5的转换;
为了避免这种不稳定的外部链路,对内网中重要的 OSPF 区域的影响,
我们提出了“ OSPF 特殊区域” 的概念:即不要4/5类LSA的区域,就叫做特殊区域;具体类型,分为:
-stub(末梢区域)
*作用:保护该区域不受到不稳定的外部链路的影响;
*配置:在该区域的所有路由器上,配置下面的命令:
ospf 1
area 12
stub
*特点:
1.该区域不要4/5类LSA
2.该区域要1/2/3类LSA
3.该区域的ABR,会自动的产生1个表示默认路由的3类LSA
-totally stub (完全末梢区域)
*作用:保护该区域不受到不稳定的外部链路的影响,也不受到其他区域的链路的影响;
*配置:仅仅在 stub 区域的 ABR 上,配置下面的命令:
ospf 1
area 12
stub no-summary
*特点:
1.该区域不要3/4/5类LSA
2.该区域要1/2类LSA
3.该区域的ABR,会自动的产生1个表示默认路由的3类LSA
-nssa(not so stub area :不那么stub的区域)
*作用:保护该区域不受到不稳定的外部链路的影响;
但是,
自己本区域的设备,却是可以引入外部路由的。
*配置:在该区域的所有设备上,配置下面的命令:
ospf 1
area 45
nssa
*特点:
1.该区域不要4/5类LSA
2.该区域要1/2/3/7类LSA
3.该区域的ABR,会自动的产生1个表示默认路由的7类LSA
-totally nssa (完全 nssa )
*作用:保护该区域不受到不稳定的外部链路的影响;同时也不受到其他区域的不稳定的链路的影响;
但是,
自己本区域的设备,却是可以引入外部路由的。
*配置:仅仅在NSSA区域的ABR上,配置下面的命令:
R4/R7:
ospf 1
area 45
nssa no-summary
*特点:
1.该区域不要3/4/5类LSA
2.该区域要1/2/7类LSA
3.该区域的ABR,会自动的产生2表示默认路由的LSA:一个是3类LSA,一个是7类LSA
最终,该区域中的所有路由器,使用的默认都是,都是通过3类LSA计算出来的;
(三)、计算路由,形成路由表:
在OSPF网络中,每台路由器根据自己周围的网络拓扑结构生成链路状态通告LSA(Link State Advertisement),并通过更新报文将LSA发送给网络中的其它路由器。RIP交互的是路由。与RIP不同,OSPF交互的是链路状态信息。也就是说,RIP中,路由器的选路依赖于邻居路由器的路由信息,但不管邻居路由器传达的信息是否正确;而OSPF中,路由器的选路是一种“自主行为”,LSA只是一种选路的参考信息。
每台路由器都通过链路状态数据库LSDB(Link State DataBase)掌握全网的拓扑结构。每台路由器都会收集其它路由器发来的LSA,所有的LSA放在一起便组成了链路状态数据库LSDB。LSA是对路由器周围网络拓扑结构的描述,LSDB则是对整个自治系统的网络拓扑结构的描述。路由器将LSDB转换成一张带权的有向图,这张图便是对整个网络拓扑结构的真实反映。在网络拓扑稳定的情况下,各个路由器得到的有向图是完全相同的。
OSPF 建立好邻居以后,就开始交互LSA ,更新LSA,最后形成LSDB ,OSPF 又用SPF 算法,以每个OSPF 路由器自身为根,计算一棵到全网的最短路径树,这棵树给出了到自治系统中各节点的路由。相对于RIP,这种机制极大地提升了路由器的自主选路能力,使得路由器不再依靠路由通告进行选路。SPF时间间隔为5秒钟。
这几个图很重要。
OSPF 路由 主要是通过1 类 3类 5类/7类 计算出来的,他们直接的优先级是1 > 3 >5/7