ospf (open shortest path first)开放式最短路径优先协议,是在多厂商设备下运行最多的设备,是由IETF工作小组制定的开放式协议,是采用一种SPF算法的路由协议。目前用的最多的是OSPFv2版本,OSPFv3支持ipv6。
ospf是基于ip协议来进行传输的协议号:89
SPF是ospf路由协议的基础,最短路径优先算法
AS(Autonomous System 自治系统):由同一个技术管理机构管理,使用同一选路策略的一些路由器的集合。
Router ID(路由器ID):用于在AS中唯一标识一台运行OSPF的路由器的32位整数,每个运行OSPF的路由器都必须有一个Router ID,简称RID。RID可以手动配置,如果未手动配置,则采用最高的loopback地址,如果未配置loopback地址,则采用最高的活动的物理接口地址
邻居(Neighbor):设备启动OSPF路由协议后,便会通过接口向外发送Hello报文。收到Hello报文的其他启动OSPF路由协议的设备会检查报文中所定义的一些参数,如果双方一致就会形成邻居关系。
邻接(Adjacency):形成邻居关系的双方不一定都能形成邻接关系,当两台路由器设备之间交换路由信息通告,并在此基础上建立了自己的链路状态数据库之后,才形成了邻接的关系
cost(开销):ospf使用接口的开销cost来作为Metric(度量值)
1,通过Hello包建立邻居关系,进而特定路由器之间建立邻接关系
2,运行ospf的路由器之间交互LSA报文同步LSDB(链路状态数据库)
3,每台路由器以自己为根,通过SPF算法为不同目的地址计算出最合理的去往路线
三个阶段:邻居发现,路由通告,路由计算
四张表:邻居表,链路状态数据库,ospf路由表,全局路由表
五种报文:Hello,DBD,LSR,LSU,LSAck
六类LSA:LSA1,LSA2,LSA3,LSA4,LSA5,LSA7
七个状态机:Down,Init,Two-way,Ex-start,Ex-change,Loading,Full
邻居表:存储了邻居路由器的信息,如果一个OSPF路由器和它的邻居路由器失去联系,在几秒中的时间内,它会标记所有到达那条路由均为无效并且重新计算到达目标网络的路径
链路状态数据库:OSPF通过LSA学习其他的路由器和网络状况,LSA存储在LSDB中
ospf路由表:通过SPF计算出到达任一节点链路的所有路径
全局路由表:也就是路由表,根据ospf路由表,结合cost值计算得出到达目标网络的最佳路径信息
Hello报文是用来建立和保持ospf邻居关系的,采用多播地址224.0.0.5。Hello报文里面包含路由器ID,hello/dead时间,邻居,区域号(area id),路由优先级,DR/BDR地址等等。
注意:hello/dead是定义了发送hello包频率,hello的间隔是10秒,dead间隔是4倍于hello包间隔。邻居之间要保持hello和dead的时间间隔是一样的,否则邻居建立不起来。
邻居建立之后,并不会立刻就将自己链路状态数据库中所有的LSA全部发给邻居,而是将LSA的基本描述信息发给邻居,这就是Database Description Packets (DBD),描述LSDB中LSA头部信息,就是LSA的目录信息,相当于书的目录,邻居在看完DBD之后,就能知道哪些LSA是需要邻居发送给自己的。
邻居在看完发来的LSA描述信息(DBD)之后,就知道哪些LSA是需要邻居发送给自己的,自己就会向邻居发送LSA请求(LSR),告诉邻居自己需要哪些LSA
当邻居收到其它路由器发来的LSA请求(LSR)之后,就知道对方需要哪些LSA,然后根据LSR,将完整的LSA内容全部发给邻居,以供计算路由表。
就是确认已经收到了所有需要邻居发给自己的LSA
当多台OSPF路由器连到同一个多路访问网段时,如果每两台路由器之间都相互交换LSA,那么该网段将充满着众多LSA条目,为了能够尽量减少LSA的传播数量,通过在多路访问网段中选择出一个核心路由器,称为DR(Designated Router),网段中所有的OSPF路由器都和DR互换LSA,这样一来,DR就会拥有所有的LSA,并且将所有的LSA转发给每一台路由器;DR就像是该网段的LSA中转站,所有的路由器都与该中转站互换LSA,如果DR失效后,那么就会造成LSA的丢失与不完整,所以在多路访问网络中除了选举出DR之外,还会选举出一台路由器作为DR的备份,称为BDR(Backup Designated Router),BDR在DR不可用时,代替DR的工作,而既不是DR,也不是BDR的路由器称为Drother,事实上,Dother除了和DR互换LSA之外,同时还会和BDR互换LSA
选举规则:优先级最高的路由器做DR,优先级相等则比较route-id,route-id高的做DR
DR和BDR的选举会在建立邻居的过程中选举出来
路由器刚刚启动OSPF进程,还没有从任何路由器收到任何数据包,Hello包也没有收到,在此进程,可以向外发送Hello包,以试图发现邻居。
只是OSPF路由器一方收到了另一方的Hello,但并没有双方都交换Hello,也就是对方的Hello中还没有将自己列为邻居
双方都已经交换了Hello信息,并且从Hello中看到对方已经将自己列为邻居,此状态,就表示OSPF邻居关系已经建立,并且如果是需要选举DR和BDR的话,也已经选举出来,但OSPF邻居之间并不一定就会交换LSA,如果不需要交换LSA,则永远停留在此状态,如果需要形成邻接并互相交换LSA,则状态继续往下进行。(比如Drother与Drother之间将永远停留在Two-way状态,因为Drother与Drother之间不需要交换LSA。)
因为在OSPF邻居之间交换完整的LSA之前,会先发送Database Description Packets (DBD),Link-state Request (LSR)等数据包,邻居之间是谁先发,谁后发,需要确定顺序,在Exstart状态,就是确定邻居之间的主从关系(Master—Slave关系),Router-ID数字大的为主路由器,另一端为从路由器,由主路由器先向从路由器发送信息。在选举DR与BDR的网络环境中,并不一定DR就是主路由器,BDR就是从路由器,因为DR和BDR可以通过调整接口优先级来控制,所以DR也许是因为优先级比BDR高,而Router-ID并不比BDR高。
就是交换Database Description Packets (DBD)的过程,DBD只是LSA的简单描述,只包含LSA的一些头部信息,收到DBD的路由器会和自己的链路状态数据库作对比,确定需要哪些LSA的完整信息,就会发送LSR请求给邻居。
邻居根据收到的LSR(Link-State Request),向对方回复Link-state update(LSU)。
等到OSPF都收到了邻居回复的所有Link-state update(LSU),那么此时的数据库状态就变成了收敛状态,此状态就是Full状态,但此时只是数据库已经同步,但路由表却还在计算当中。
总结:
工作原理
在开始会在Down状态下, 这时尚未收到邻居的Hello报文,开始发送hello报文给邻居,收到邻居的hello报文检查里面有没有自己的route id,没有会处于init状态,有会建立邻居关系,生成邻居表,处于2-way状态(如果是多点网络会同时选举DR/BDR)
邻居关系建立成功之后会处在Exstart状态,DBD报文会协商邻居的主从关系,之后DBD报文会交互链路状态数据库的汇总信息,这时就处在Exchange状态, 通过LSR和LSU报文和Lsack报文的交互获取尚未发现的链路状态信息,处在Loading状态, 生成链路状态数据库 ,路由器之间完成数据库的同步就会处在Full状态, 之后使用最短路径算法,计算本地到达所有未知网段的最佳路由,然后将其加载路由表中
OSPF是一个在各方面都考虑比较周全的路由协议,也会因此将该协议变得更为复杂化,OSPF并不像RIP与EIGRP那样,RIP与EIGRP在运行时,并不考虑OSI模型在二层所定义的内容,即并不关心二层的链路介质类型,而OSPF在运行时,必须考虑链路层的类型,称为OSPF网络类型(Network Type),对于不同二层介质类型,OSPF将有不同的操作和运行过程,网络类型,可分为如下几种:
网络类型 | Hello时间 | 选举DR/BDR | 邻居建立方式 |
---|---|---|---|
点到点p2p | 10s | 否 | 自动 |
点到多点p2mp | 30s | 否 | 自动 |
广播Boradcast | 10s | 是 | 自动 |
非广播Non-B | 30s | 是 | 手工 |
点到多点非广播p2mp-Non-B | 30s | 否 | 手工 |
内部路由器:所有接口属于同一个区域
区域边界路由器:接口分布在多个区域,且至少有一个活动接口在骨干区域
骨干路由器:只要有接口在骨干区域的路由器
自治系统边界路由器:AS边界路由器
骨干区域(Backone Area 0):负责连接非骨干区域,其他区域(非骨干区域)必须保证和骨干区域有直接的物理连接,骨干区域不能配置为特殊区域
标准区域(Standard Area):标准的OSPF区域,能发起也能接收区域内路由,区域间路由,外部路由,骨干区域也是一个标准区域
末节区域(Stub Area):不能重发布引入外部路由,也不能接收外部路由,ABR自动生成缺省路由(LSA3)通告stub区域内部
完全末节区域(Totally Stub Area):不能重发布引入外部路由,也不能接收外部路由,区域间路由,ABR自动生成缺省路由(LSA3)通告进stub区域内部
NSSA区域(Not-so-stubby Area):可存在ASBR的stub,通过LSA7在本区域引入外部路由LSA7在NSSA内洪泛,通过ABR时转换为LSA5
完全NSSA区域(Totally NSSA):进一步由NSSA ABR阻挡LSA3进入NSSA区域内,ABR自动生成缺省路由(LSA3)通告进完全NSSA区域
区域类型 | 接收区域间的路由 | ABR是否发送默认路由 | 是否可以重发布引入外部路由 |
---|---|---|---|
Stub Area | 是 | 是 | 否 |
Totally Stub Area | 否 | 是 | 否 |
Not-so-stubby Area | 是 | 否 | 是 |
Totally NSSA | 否 | 是 | 是 |
OSPF由于有着多种区域类型,多种网络类型,多种链路类型,多种路由器身份,所以LSA(Link-State Advertisements)也是多样的。
在详细讲解LSA之前,需要重点说明,只有同一个区域内的LSA,才是精确的,区域外的LSA,并不一定包含所有必备的信息,因此,所有LSA知识信息,并不一定可以套用到每一类LSA。
OSPF中共有11类LSA,而在CCIE的要求中,只需要理解1、2、3、4、5、7共6类即可,这些LSA会因为区域类型,网络类型,链路类型,路由器身份的不同而不同,以下是详细介绍:
E1:成本为外部成本加上分组经过的每条链路的内部成本,当多台ASBR将同一条外部路由通告到同一个AS中时,应使用这类型避免次优路由选择
E2:成本总是只包含其外部成本路由到AS中时,全用这种类型
因为NSSA区域可以将外部路由重分布进OSPF进程,而NSSA不是一般的常规区域,所以在NSSA将外部路由重分布进OSPF时,路由信息使用类型7来表示,LSA 7由NSSA区域的ASBR产生,LSA 7也只能在NSSA区域内传递,如果要传递到NSSA之外的其它区域,需要同时连接NSSA与其它区域的ABR将LSA 7 转变成LSA 5后再转发。