OSPF概念
OSPF:Open Shortest Path First,开放最短路径优先协议,是一种链路状态路由协议,在RFC 2328中描述。Open意味着开放、公有,任何标准化的设备厂商都能够支持OSPF。
与RIP的区别
※ RIP:运行距离矢量路由协议,周期性的泛洪自己的路由表,通过路由的交互,每台路由器都从相邻(直连)的路由器学习到路由,并且加载进自己的路由表中,而对于这个网络中的所有路由器而言,他们并不清楚网络的拓扑,他们只是简单的知道要去往某个目的应该从哪里走,距离有多远。
※ OSPF:运行链路状态路由协议,路由器之间交互的是LSA(链路状态通告),而非路由信息,路由器将网络中泛洪的LSA搜集到自己的LSDB(链路状态数据库)中,这有助于OSPF理解整张网络拓扑,并在此基础上通过SPF最短路径算法计算出以自己为根的、到达网络各个角落的、无环的树,最终,路由器将计算出来的路由装载进路由表中。
OSPF特性
OSPF链路状态协议(开放式最短路径优先),支持VLSM(变长子网掩码),CIDR(无类路由协议),支持安全认证
采用SPF算法(Dijkstra算法)计算最佳路径,快速响应网络变化
网络变化是触发更新
以较低频率(每隔30分钟)发送定期更新,被称为链路状态刷新
与距离矢量相比,链路状态协议掌握更多的网络信息
OSPF三张表
1. 邻居表(Neighbor table):列出了所有和本路由器直接相连的OSPF邻居,经历了一系列的消息交互、关系状态最终建立。
2. 拓扑表(Topology table):含有链路状态数据库(LSDB),列举了所有自己产生及邻居那得到的LSA(Flooding/泛洪),在同一个OSPF区域中的路由器,都有完全一致的OSPF Database。一个OSPF区域,就对应着一个OSPF Database。
3. 路由表(Routing table):在OSPF的数据库中,通过SPF算法,计算得到了最优路由,也称为Forwarding Database。
建表过程:
广播Hello包建立邻居关系 →广播交互LSA →收集LSAs并放入LSDB → SPF计算,得出最优路径 → 放入路由表。
OSPF区域
OSPF采用层次设计,用Area来分隔路由器(通常一个区域的路由器不超过50台)
区域中的路由器保存该区域中所有链路和路由器的详细信息
但只保存其他区域路由器和链路的摘要信息
单区域的问题:
区域内部动荡会引起全网路由器的SPF计算;
LSDB庞大,资源消耗过多,设备性能下降,影响数据转发;
每台路由器都需要维护的路由表越来越大,单区域内路由无法汇总。
多区域的优点:
多区域的设计减少了LSA洪泛的范围,有效地把拓扑变化控制在区域内,达到网络优化的目的
在区域边界可以做路由汇总,减小了路由表
充分利用OSPF特殊区域的特性,进一步减少LSA泛洪,从而优化路由
多区域提高了网络的扩展性,有利于组建大规模的网络
划分的目的:
提高路由效率:缩减部分路由器的OSPF的路由条目;对某些特定的LSA,可以在区域边界(ABR/ASBR)上,实现汇总/控制/过滤(通过OSPF的汇总路由/默认路由实现OSPF区域之间的全网互通);
提高网络稳定性:当某个区域内的一条OSPF路由出现抖动时,可以有效控制受影响的波及面(对于大型的路由协议来说,稳定是很重要的一个因素)。
骨干区域:
在部署OSPF时,要求全OSPF域,必须有且只能有一个Area0,Area 0为骨干区域,骨干区域负责在非骨干区域之间发布由区域边界路由器汇总的路由信息(并非详细的链路状态信息),为避免区域间路由环路,非骨干区域之间不允许直接相互发布区域间路由。因此,所有区域边界路由器都至少有一个接口属于Area 0,即每个区域都必须连接到骨干区域。
骨干区域:Transit area(backbone or Area 0):主要功能:为快速、高效地传输数据包。通常不接用户。
非骨干区域:Regular areas(nonbackbone areas):主要是连接用户。而且所有数据都必须经过Area 0中转(包括:Stub / Totally Stubby / NSSA)
OSPF路由器的角色
区域内路由器(Internal Router/Internal Area Router,IAR)
区域边界路由器(Area Border Router,ABR)
骨干路由器(Backbone Router/Backbone Border Router,BBR)
AS边界路由器(AS Boundary Router,ASBR)
OSPF与IS-IS的区域可扩展性的对比:
两种协议的算法都是基于SPF算法
OSPF:以Area0为BackBone(比较好)
IS-IS:以Level2的链路为BackBone,以链路为区域分界(很好)
采用层次设计的好处:
减少了路由表的条目
LSA的flood在网络边界停止,加速会聚
缩小网络的不稳定性,一个区域的问题不会影响其它区域
Router-ID
Router-ID用于在OSPF区域中唯一地表示一台OSPF路由器,全OSPF域内禁止出现两台路由器拥有相同的Router-ID。
Router-ID的设定可以通过手工配置,也可通过协议自动选取。实际网络部署中考虑到协议的稳定,建议手工配置。
在路由器运行了OSPF并由系统自动选定Router-ID之后,如果该Router-ID对应的接口down掉,或出现一个更大的IP,OSPF仍然保持原Router-ID(即Router-ID值是非抢占的,稳定第一),即使此时reset ospf process重启OSPF进程,Router-ID也不会发生改变;除非重新手工配置Router-ID(OSPF进程下手工敲router-id xxx),并且重启OSPF进程方可。另外,如果该Router-ID对应的接口IP 地址消失,例如undo ip address,则reset ospf process后,RouterID也会发生改变。
COST
OSPF使用cost “开销” 作为路由度量值。每一个激活OSPF的接口都有一个cost值。OSPF接口cost=100M /接口带宽,其中100M为OSPF的参考带宽(reference-bandwidth)。
一条OSPF路由的cost由该路由从路由的起源一路到达本地的所有入接口cost值的总和。
由于默认的参考带宽是100M,这意味着更高带宽的传输介质(高于100M)在OSPF协议中将会计算出一个小于1的分数,这在OSPF协议中是不允许的(会被四舍五入为1)。
OSPF的网络接口类型
1. 点到点网络(Point To Point,P2P):一个网络里仅有2个接口,使用HDLC或PPP封装,不需寻址,地址字段固定为FF。
2. 广播型多路访问网络(Broadcast):广播型多路访问,目前而言指的就是以太网链路,涉及IP 和Mac,用ARP实现二层和三层映射。
3. 非广播型多路访问网路(NonBroadcast MultiAccess ,NBMA):网络中允许存在多台Router,物理上链路共享,通过二层虚链路(VC)建立逻辑上的连接。
4. 点对多点网络(Point To MultiPoint,PTMP/P2MP):通过一种特定的一对多的连接类型的通信,从单一位置到多个位置提供多个信道。
不同的OSPF接口网络类型,OSPF在该接口上的操作将有所不同。
接口的OSPF网络类型是可以通过命令修改的。
MA包括Broadcast和NBMA。
NBMA的网络类型需要静态指定邻居,其余网络类型邻居自动发现。 Broadcast、NBMA类型的接口上,需要进行DR/BDR的选举。 在P2P、P2MP类型的接口上,不进行DR/BDR选举。
在P2P和Broadcast网络上,Hello报文以组播地址(224.0.0.5)进行发送,在NBMA VL(Virtual-Link)上Hello报文以单播地址进行发送。
常见链路层协议对应的默认网络类型:
DR与BDR
意义:在多路访问网络(Multi Access,MA)中,若所有路由器接口两两建立OSPF邻居关系,则共有 n(n-1)/2 个邻居关系,这不仅仅额外消耗设备资源,更是增加了网络中LSA的泛洪数量。因此,为了减小多路访问网络中的OSPF流量,OSPF会在每一个MA网络(多路访问网络)选举一个指定路由器 (DR) 和一个备用指定路由器 (BDR)。
1. 指定路由器(Designated Router,DR):DR 负责侦听多路访问网络中的拓扑变更信息并将变更信息通知给其他路由器,同时负责代表该MA网络发送LSA类型2。MA网络中,所有的OSPF路由器都与DR建立全毗邻的OSPF邻接关系。
2. 备用指定路由器(backup Designated Router,BDR):BDR 会监控 DR 的状态,并在当前 DR 发生故障时接替其角色。
3. DRothers:除DR与BDR之外的其他路由器。
DR选举规则:
DR和BDR是由同一网段中所有的路由器根据路由器优先级、Router ID通过Hello报文选举出来的,只有优先级大于0的路由器才具有选取资格,优先级为0不参与选举。
进行DR/BDR选举时每台路由器将自己选出的DR写入Hello报文中,发给网段上的每台运行OSPF协议的路由器。当处于同一网段的多台路由器同时宣布自己是DR时,接口优先级最高者胜出;如果优先级相等(默认为1),Router-ID最高者胜出。
DR具有非抢占性,也就是说如果该MA网络中,已经选举完成、并且选举出了一个DR,那么后续即使有新的、更高优先级的设备加入,也不会影响DR的选举,除非DR挂掉。
过程:
选举初始化时,所有路由器在一开始都将自己的路由器ID写入Hello包中DR_ID和BDR_ID字段中,宣称自己是DR和BDR。优先级最高的路由器成为BDR,但此时还没有DR,接着立马将BDR升级为DR,并将Hello包里DR_ID字段改成已选出的DR的ID。剩下的路由器继续选BDR,仍是将自己的ID写入BDR_ID字段中,最后优先级次高的路由器成为BDR。
制度:
1. 选举制:DR 是各路由器选出来的,而非人工指定的,虽然管理员可以通过配置priority 干预选举过程。
2. 终身制:DR 一旦当选,除非路由器故障,否则不会更换,即使后来的路由器priority 更高。
3. 世袭制:DR 选出的同时也选出BDR 来,DR 故障后,由BDR 接替DR 成为新的DR。
特性:
所有的DRother路由器均只与DR和BDR建立全毗邻的邻接关系,DRother间不建立全毗邻邻接关系。
DR是基于接口,而非路由器。一个路由器,可能它在某个接口上是DR,在其它接口上是BDR、DROther,或因是P2P的链路而不参加DR的选举。
在广播的网络上必须存在DR才能够正常工作,但BDR不是必需的。
一个MA网段中即使只有一台路由器,也要选举DR。
DR并不一定就是路由器优先级最高的路由器接口;同理,BDR也并不一定就是路由器优先级次高的路由器接口(可能有新的、更高的加进来)。
在广播多路访问、非广播多路访问型的接口上,会进行DR/BDR的选举。
在P2P、P2MP类型的接口上,不进行DR/BDR选举。
DR/BDR属于组播地址为224.0.0.6的组,监听并接收目的地址为224.0.0.6的组播数据包,且DR向组播地址224.0.0.5发送更新以通知其它路由器(包括BDR和起源DROther)。
所有的OSPF路由器(包括DR/BDR)监听224.0.0.5这一组播地址,向224.0.0.6发送更新通知DR及BDR。
BDR向DR发送更新的地址是224.0.0.5,DR回复LSAck的地址也是224.0.0.5。
有了DR/BDR的存在后,LSA的泛洪:
OSPF报头
1. Version:版本字段,占1个字节,指出所采用的OSPF协议版本号,目前最高版本为OSPF v4,即值为4(对应二进制就是0100)。
2. Message Type:报文类型字段,标识对应的5种报文类型。
3. Packet Length:包长度字段,占2个字节。它是指整个报文(包括OSPF报头部分和后面各报文内容部分)的字节长度。
4. Router ID:路由器ID字段,占4个字节,指定发送报文的源路由器ID。
5. Area ID:区域ID字段,占4个字节,指定发送报文的路由器所对应的OSPF区域号。
6. Checksum:校验和字段,占2个字节,是对整个报文(包括OSPF报头和各报文具体内容,但不包括下面的Authentication字段)的校验和,用于对端路由器校验报文的完整性和正确性。
7. Auth Type:认证类型字段,占2个字节,指定所采用的认证类型,0为不认证,1为进行简单认证,2采用MD5方式认证。
8. Authentication:认证字段,占8个字节,具体值根据不同认证类型而定:认证类型为不认证时,此字段没有数据,认证类型为简单认证时,此字段为认证密码,认证类型为MD5认证时,此字段为MD5摘要消息。
OSPF Packets(OSPF五种报文)
因为是基于IP开发的,所以协议号为89,同时也是意味着其也是不可靠的。根据OSPF数据包type字段数值的不同,OSPF数据包类型分为5种,不同的type,其后面的内容也不同。路由表的形成与这5种数据包的交互息息相关。
type=1:Hello数据包
type=2:数据库描述包--DBD (只出现在Exstart/Exchange阶段)
type=3:链路状态请求包---LSR (只出现在Loading阶段)
type=4:链路状态更新包---LSU
type=5:链路状态确认包---LSAck
1. Hello(建立和维护邻居/Neighbor关系):使用组播地址(224.0.0.5),DB和BDR使用224.0.0.6,发送Hello包的默认间隔是10秒。
2. DBD(数据库描述/Database Description):包含路由摘要信息(描述LSDB中LSA头部信息),使用单播的方式,通过序列号递增进行隐式确认。
3. LSR(链路状态请求/LinkStatus Request):向邻居路由器请求特定路由的完整的链路状态信息,使用单播地址。
4. LSU(更新/LinkStatus Update):回应LSR该条路由的完整信息。在OSPF中,只有LSU需要显示确认。LSU包含一条或多条LSA。
5. LSAck(确认):对LSU中的LSA做显示确认。
LSA(Link-State Advertisement)是一个PDU(协议数据单元),封装在LSU中传递,一般会有序列号。
DBD(点菜的菜单),上面只有简略的数据库列表,接收方用它来和本地的DBD进行对比,如果不同则会发送LSR请求,请求的东西就是LSA(具体的食品);而回应LSA是通过LSU承载的,即LSA的完整信息就在LSU(装着食品的菜盘)中;LSAck(食客表示收到食品)则是确认收到LSU中的LSA了。
LSAck两确认方式:
①隐式确认:DBD报文的相互发送,既做回应也做确认(Master通过增加序列号、Slave通过复制并沿用序列号);
②显式确认:单独发送LSAck包对LSU的确认(复制LSU的LSA头部,与DBD相似)。
1.hello包-----周期10s 功能:用于发现,和维持邻居关系的,以及DR/BDR的选举(2way)
2.链路状态数据库描述数据包-------DBD
对ospf的网络拓扑进行描述
数据包在链路状态数据库交换期间产生,主要作用有三个:
①选举交换链路状态数据库过程中的主从关系
②确定交换链路状态数据库过程中的初始序列号
③交换所有的LSA数据包头部
3.链路状态请求数据包------LSR 用于请求在DBD交换过程中发现的本路由器中没有的或已过时的LSA包细节
4.链路状态更新数据包---LSU 功能:用于存储和传递路径信息 用于将多个LSA泛洪,也用于对接收到的链路状态更新进行应答
5.链路状态确认数据包-----LSAck 用于对接收到的LSU进行确认。 如果是DR/BDR发送确认,LSAck包发送到OSPF的组播地址224.0.0.5 如果是DROther发送确认,LSAck包发送到OSPF的组播地址224.0.0.6
OSPF七种状态 及 邻接关系的建立过程
1. Down:各路由器未与任何邻居交换信息,开始从运行OSPF的接口以组播地址224.0.0.5发送Hello数据包。
2. Init:各路由器收到第一个Hello数据包后,把该路由器添加到自己的邻居Neighbor列表中。
3. Two-Way(属于邻居关系):收到的Hello包中有自己的Router ID,将该路由器加入自己邻居列表中,进入2-Way状态。在这个过程中同时选举出DR和BDR。若不形成邻接关系则一直停留在该状态。
4. Exstart(准启动):DROther与DR/BDR发送DBD包确定Master/Slave关系,RID大的的成为Master(不一定是DR)。
5. Exchange:Master与Slave之间相互单播发送一个或多个DBD数据库描述数据包(Slave沿用Master的序列号先发送),进行DBD的同步。DBD有序号,由Master决定DBD的序号。相互收到DBD后,通过序列号进行隐式确认已收到DBD。Exchange状态结束的最后一个DBD包是Slave发送的。
6. Loading:将收到的信息同LSDB中的信息进行比较。如果DBD中有更新的链路状态条目,则向对方发送一个LSR,用于请求新的LSA,对方回复相应的LSU,当所有LSR都得到LSU答复后向对方回应LSAck进行显示确认。
7. Full(属于邻接关系):相邻的路由器在Loading完成同步后进入Full状态,开始正常转发数据。此时区域内的每个链路应该都有相同的数据链路状态数据库。后续只有Hello包、LSU包、LSAck包。
陌生→邻居→邻接。
Attempt是只存在于NBMA网络(帧中继)的状态,介于Down和Init之间(发送了HELLO到收不到对方的回复则一直滞留在此状态)。在NBMA网络中邻居是手动指定的,按HelloInterval的间隔向邻居发送Hello包。
在ExStart状态发送DBD包的对象是224.0.0.5(所有OSPF路由器),还是224.0.0.6(所有DR),取决于OSPF路由器之间是否存在DR/BDR的角色。如果不存在DR/BDR,则是前者;如果存在DR/BDR,则是后者。
如果邻接路由器一边是Exstart,另一边是Exchange,那么可以断定是MTU不匹配。
网络类型是Broadcast / P2MP ,Hello包是组播,DBD和LSR是单播,LSU和LSAck有组播也有单播。
当两个以太网内运行OSPF的路由器优先级都为0时,无法选出DR/BDR,邻居状态将永远处于2 way状态。
OSPF的七种类型LSA:
1类型路由器LSA (Router LSA)
由区域内所有路由器产生,并且只能在本个区域内泛洪广播。
这些最基本的LSA通告列出了路由器所有的链路和接口,并指明了它们的状态和沿每条链路方向出站的代价。
2类型网络LSA (Network LSA)
由区域内的DR路由器产生,报文包括DR和BDR连接的路由器的链路信息。
网络LSA也仅仅在产生这条网络LSA的区域内部进行泛洪。
3类型网络汇总LSA (Network summary LSA)
由ABR产生,可以通知本区域内的路由器通往区域外的路由信息。
在一个区域外部但是仍然在一个OSPF自治系统内部的缺省路由也可以通过这种LSA来通告。
如果一台ABR路由器经过骨干区域从其他的ABR路由器收到多条网络汇总LSA,那么这台始发的ABR路由器将会选择这些LSA通告中代价最低的LSA,并且将这个LSA的最低代价通告给与它相连的非骨干区域。
4类型ASBR汇总LSA (ASBR summary LSA)
也是由ABR产生,但是它是一条主机路由,指向ASBR路由器地址的路由。
5类型自治系统外部LSA (AS external LSA)
由ASBR产生,告诉相同自治区的路由器通往外部自治区的路径。
自治系统外部LSA是惟一不和具体的区域相关联的LSA通告,将在整个自治系统中进行泛洪。
7类型NSSA外部LSA (NSSA External LSA)
由ASBR产生,几乎和LSA 5通告是相同的,但NSSA外部LSA通告仅仅在始发这个NSSA外部LSA通告的非纯末梢区域内部进行泛洪。
在NSSA区域中,当有一个路由器是ASBR时,不得不产生LSA 5报文,但是NSSA中不能有LSA 5报文,所以ASBR产生LSA 7报文,发给本区域的路由器。
6类型组成员LSA (Group membership LSA) * 目前不支持组播OSPF (MOSPF协议)
每一种区域内允许泛洪的LSA类型:
只有一个例外,每台ABR路由器上利用一个类型3来通告缺省路由。
其中,1类型路由器LSA (Router LSA)又分4种类型:
拓展:
为什么要4类LSA?
要回答这个问题,需要涉及OSPF里面几个概念,详细如下:
1、Router-ID的作用及传播范围;
2、1类LSA的传播范围,LINK-ID,通告者;
3、3类LSA通告什么,通告者是谁;
4、5类LSA通告者,不同ABR通告后会怎么样。
首先思考第一个问题,Router-ID的作用是什么,他传播的范围是否跨区域?
回答:OSPF Router-ID唯一标识网络中的每台路由器。Router-ID怎么确定的就不说了,这个应该都知道的,关于Router-ID的传播范围,不同区域的OSPF路由器,Router-ID是不知道的,也可以理解为Router-ID不会跨区域传递。意思是说,Router-ID只会在本区域里被了解。
第二个问题,1类LSA的传播范围仅限于本区域内部,也就是不跨区域,LINK-ID标志和通告者标志都是通告者的Router-ID。
第三个问题,3类LSA是由ABR通告的,通告的内容其实就是1类LSA的内容,3类LSA通告者是当前ABR,通告者标志是当前ABR的Router-ID
从图片可以看出1类LSA经过ABR之后变成3类LSA了。
第四个问题,5类LSA通告者是ASBR,当ASBR的外部路由被引入之后,经5类LSA传播到整个当前区域内其他路由器上,也就是下图中的区域2,在整个区域2内,所有路由器已由1类LSA获悉区域内ASBR的Router-ID,所以ASBR所在区域内其他路由器不需要4类LSA。
现在问题来了,当外部路由经ABR2的5类LSA传播后被其他区域的路由器接收,再由其他区域的ABR1继续以5类LSA传播出去,但是收到的5类LSA的通告者始终是ASBR的Router-ID,而前面又说过Router-ID只会在本区域里被了解,那么非ASBR区域1和区域0路由器怎么会知道ASBR的Router-ID呢?
因此解决的办法就是告诉他们ASBR的Router-ID的具体信息,以便于区域0和区域1所有路由器知道怎么到达ASBR。
总结: 5类LSA初始是由ASBR通告的,通告者是ASBR的Router-ID,继续传播时仍以5类LSA传播,LSA中ASBR的Router-ID保持不变,但Router-ID只会在本区域里被了解,所以其他区域(区域0和1)不知道ASBR的Router-ID是谁,也就无法到达ASBR,实际情况中,整个OSPF自治系统都是互联互通的,怎么会出现无法到达ASBR,这是由于3类LSA的作用,当3类LSA经ABR传播时,通告者会变成当前传播的ABR的Router-ID,同一区域是可以到达ABR的,再由ABR到达ASBR。(例如R4没有引入外部路由,是一个常规的区域内的普通路由器时,R1可以到达R4,因为R1可以到达ABR1,而ABR1又可以到达ABR2,最后ABR2了解R4,这些是通过3类LSA实现的。)