OSPF协议原理详解
- 一.链路状态路由协议 (Link Status Protocol)基本概念
- OSPF的概念
- OSPF特点
- OSPF工作过程
- OSPF的网络类型
- 点到点连接
- 广播
- 非广播多路访问(NBMA, Non-Broadcast Multiple Access)
- 点到多点
- OSPF报文
- OSPF报头格式
- OSPF数据包
- Hello包
- DBD包(Datebase Description)
- LSR包(Link-State Request)
- LSU(Link-State Update)
- LSAck
- OSPF邻居建立过程(重!)
- 关系变化过程
- 过程详解
- 邻居建立过程(down->init->2-way)
- 交换LSDB过程(exstart->exchange)
- 同步链路状态数据库过程(Loading->Full)
- OSPF 邻居关系不能正常建立的原因和解决方法
- DR和BDR的选举
- DR,BDR存在意义
- 选举过程
- LSA(重!!)
- LSA基本概念
- 最新LSA的判定
- LSA类型
- 类型1:路由器LSA Router Link States
- 类型2LSA:网络LSA Net Link States
- 类型3LSA:汇总LSA Summary Net Link States(O IA)
- 与3类LSA有关的计算
- 类型4LSA:ASBR汇总LSA
- 与4类LSA有关的计算
- 类型5LSA:自治系统LSA
- 类型7LSA:NSSA外部LSA
- 其他有关LSA的特性及操作
- OSPF区域类型和结构(重!)
- 区域类型
- OSPF末节区域的默认路由
- OSPF路径选择
- OSPF路由类型
- 选路规则
- 区域内和区域间路由的选取(同一区域内多台ABR时)
- OSPF虚链路
- 定义
- 目的
- 特点及规则
一.链路状态路由协议 (Link Status Protocol)基本概念
OSPF的概念
链路状态路由选择协议又被称为最短路径优先协议,它基SPF(shortest path first )算法。他比距离矢量协议复杂的多。路由器的链路状态的信息称为链路状态,包括:接口的IP地址和子网掩码,网络类型,(如以太网链路或串行点对点链路),该链路的开销,该链路上的所有的相邻路由器。
OSPF特点
链路状态路由协议是层次式的,网络中的路由器并不向邻居传递“路由项”,而是通告给邻居一些链路状态。链路状态协议只是通告给邻居的一些链路状态。运行该路由协议的路由器不是简单地从相邻的路由器学习路由,而是把路由器分成区域,收集区域的所有的路由器的链路状态信息,根据状态信息生产网络拓扑结构,每一个路由器再根据拓扑结构计算出路由。
OSPF工作过程
(1)了解直连网络
(2)向邻居发送hello包(邻居指启用了相同链路状态路由协议的其他任何路由器)
(3)建立链路状态数据包,
(4)将链路状态数据包泛洪给邻居 路由器将其链路状态信息泛洪到路由区域内的其他所有链路状态路由器,他一旦收到来自邻居的LSP,不经过中间计算,立即将这个LSP从除接收该LSP口以外的所有接口发出,此过程在整个路由区域内的所有路由器上形成LSP的泛洪效应。LSP在路由器初始启动期间,或路由协议启动过程期间,或在每次拓扑发生更改(包括链路接通和断开)时,或是邻接关系建立,破裂时发送,并不需要定期发送。
PS:距离矢量路由协议则不同,她必须首先运行贝尔曼-福特算法来处理路由更新,然后才将他们发送至其他路由器,而链路状态协议则是再泛洪完成后在计算SPF算法,因此到达收敛的速度比距离矢量路由协议速度要快。
(5)每台路由器使用数据库建立一个完整的拓扑图并计算通向每个目的网络的最佳路径。
OSPF的网络类型
点到点连接
将一对路由器连接起来的网络,使用的是PPP HDLC协议
使用组播224.0.0.5来发送各种数据包
没有DR/BDR的选举,直接形成full邻接关系,不用手动指邻居
广播
多路访问网络,如以太网,需要DR和BDR的选举,不用手动指邻居
通常以组播发送HELLO报文,LSU报文,和LSACK报文,以单播形式发送DD和LSR报文
DR和BDR给非指定路由器发送消息使用的是组播224.0.0.5
非指定路由器给DR和BDR发送消息使用的是组播224.0.0.6
非广播多路访问(NBMA, Non-Broadcast Multiple Access)
连接的路由器超过两台但是没有广播功能,帧中继网络和ATM网络
所有数据包均单播发送,有DR的选举,需要手动指定邻居
点到多点
Hello包以组播形式发送,其他类型数据包由单播发送
不选举DR,不用手动指邻居
OSPF报文
OSPF报头格式
OSPF直接封装在IP数据包中
OSPF数据包
Hello包
作用:建立邻居关系
各字段功能:
Network Mask :发送数据包的源IP地址对应的子网掩码
Hellointerval:Hello时间间隔,默认10S,失效间隔默认为Hello间隔的3倍
Rtr Pri:路由器优先级用于选举DR和BDR
DR:指定路由器的IP地址,开始时为空
BDR:备份指定路由器的IP地址,开始是也为空
Neighbor:里面标识了邻居的路由器ID,可以表示多个邻居
Stub and Flag :末节标识符
邻居关系建立条件:HELLO和失效间隔要一致,区域号要相同,区域末节标识符要相同,有认证的话,认证要相同,区域ID要相同,子网掩码要一致
DBD包(Datebase Description)
作用:在OSPF邻居关系建立之后,DBD包负责描述本地的LSDB,接收到的路由器通过和自己的LSDB做比对,进而同步区域中的LSDB
各字段功能
I:该位置1表示这是发送的第一个数据包,开启了LSDB同步过程
M:该位置1表示之后还有DD包要发送,若置0则表示没有数据包要发送了
MS:用来表示谁是主(Master)谁是从(Slave)由主路由器引导进行LSDB的同步
DD Sequence Number:利用序号来确保传输的完整性和可靠性
LSA Headers:LSA头部信息摘要,可以有多个LSA头部摘要信息
LSR包(Link-State Request)
作用:用来查询本LSDB中没有或者哪些LSA是已经失效的
各字段功能:
LS type:指定所请求的LSA类型,一共有7类
Link State ID:用来表示LSA,根据LSA种类的不同,有不同的含义
Advertising Router:用来表示产生此LSA的路由器ID
LSU(Link-State Update)
作用:对LSR进行回应,或者定时发送LSU来更新区域中的LSDB,发送的是真正需要的LSA的内容
各字段功能:
Number of LSA:指定此报文中共发送的LSA数量
LSAs:一条条具体的LSA完整的信息,可以有多个LSA的信息
LSAck
作用:用来在收到对端发送的LSU之后返回的确认报文,内容是需要确认的LSA头部
各字段功能:
LSA Headers:LSA头部信息
一个ACK可以确认多个LSA
OSPF邻居建立过程(重!)
首先对邻居关系,和邻接关系要区分开,两台路由器互相之间的状态是2-way则表明邻居关系建立,当邻居关系为FULL是表明邻接关系建立
关系变化过程
down->init->2-way->exstart->exchange->loading->full
down:表示还没有建立起邻接关系,没有检测到活动邻居
init:表示从对端收到的HELLO包中,没有自己的路由器ID信息
2-way:表示从对端收到的HELLO包中,已经有自己的路由器ID信息了,已建立邻居关系可以共享链路状态数据
exstart:表示正在确定主从关系,即谁先发送DBD
exchange:在主的带领下开始交换DBD
loading:请求更详细的信息
full:已建立完全邻接关系 完成更新过程 其数据库与邻居完全相同
过程详解
邻居建立过程(down->init->2-way)
希望建立完全OSPF邻居邻接关系的路由器之间交换OSPF HELLO包(组播224.0.0.5),双方的邻居此时都处于down状态,这是邻居会话的初始状态,当路由器从邻居收到了一个Hello包,但是没有在邻居Hello包中看到自己的路由器ID时,他将转化为INIT状态,当路由器从邻居收到Hello包中看到自己的路由器ID时,他将转为2-Way状态。表示邻居之间已经建立了双向通信
交换LSDB过程(exstart->exchange)
路由器开始准备交换彼此的LSDB,正式交换LSDB前,会选举出主/从路由器,这个阶段即为exstart状态
首先一条链路上的路由器都会认为自己是主路由器,此时将邻居视为exstart状态,发送空的DBD包(不含LSA的索引,含有RID,MS(主)标记位,M(多),1(初始)标记位都会标记为1),来比较他们的RID,RID大的将成为主路由器。被认为从路由器的那一方需要再发送一个DBD包(MS置为0,I置为0,序列号为主路由器发来的DBD中存在的序列号)来响应。这样主从关系就确定下来
随后,路由器都进入EXCHANGE状态,开始互换LSDB中的信息,这个过程总是由主路由器来引导,有以下两条规则
1.主路由器发送的DBD包,从路由器总要做出响应(主路由器发送的DBD包与从路由器发送的DBD包相同)-------如果从路由器没有LSA需要通告了,那么就会响应回空的DBD
2.从路由器发送的DBD包,只能用作对主路由器发送的DBD包的响应(从路由器无法自主的发送DBD包)-------如果主路由没有LSA需要通告了,而从路由器有LSA需要通告,那么此时从路由器发回的响应的DBD包中的M位(MORE)置为1,即告诉主路由我还有LSA要发送,这样主路由器就会继续发送DBD,直到从路由器将所有LSA都通告完(这时M位就为0了)。
路由器会将收到的DBD中的信息而自己LSDB中不存在的LSA头部加入到链路请求列表中,进入LOADING状态后会根据这个列表来发送请求信息。
同步链路状态数据库过程(Loading->Full)
这时路由器就有了邻居的LSA索引列表,路由器都将进入LOADING状态,来请求自己LSDB中还没有的LSA的信息。路由器会发送LSR来请求一个或者多个LSA的信息,对端会发送回LSU来告诉路由器他想要的信息。OSPF有以下两种机制来确认对端收到了数据包。
1.对端发送回相同的LSU,即可表明对端收到了信息
2.对端发送回LSACK表明已经收到了LSU(LSACK中带有LSA头部的信息
不再发送和接收LSU和LSR,路由器就进入了FULL状态,此时他们的LSDB是相同的,就可以进行SPF算法来计算路径了。
OSPF 邻居关系不能正常建立的原因和解决方法
- 接口上没有激活 ospf
- 物理层或者是数据链路层协议 down.
- 建立邻居的接口被 passive掉
- OSPF的 hello 组播地址被 ACL Block
- 在 broadcast链路上的子网掩码不匹配
- Hello/dead 间隔不匹配
- 认证方式或者是认证密码不匹配
使用 debug ip ospf adj 来查看,可以自己使用不同的情况来验证 - 两台路由器处于不同的 AREA
- Stub/transit/NSSA 区域类型不匹配
DR和BDR的选举
DR,BDR存在意义
DR BDR存在于多路访问网络中,作用是减少区域内的同步次数,降低路由器的内存消耗,减少了路由流量更新,确保同一区域内的路由器拥有相同的LSDB
选举过程
选举可能出现的时刻:整个网络刚搭建好,SW开启之后,LAN因故障失效之后,DR,BDR失效之后都存在选举的过程
OSPF priority 最高者为DR(缺省所有OSPF路由器为1,通过ip ospf priority 接口配置命令更改,priority为0表示不参与选举),如果priority相同,则具有最高的Router-ID的路由器被选举为DR。
LSA(重!!)
LSA基本概念
Link State Advertisement,链路状态通告,路由器发出的关于网络结构的通告,描述了链路或接口的状态及每条链路的成本
LSA是一种数据结构,保存在LSDB中,承载在LSU中然后发送出去,LSDB中会存储与网络有关的一系列属性。
LSA只能由发起这个LSA的路由器进行操作和更新或者是撤销,别的路由器不得对其进行操作,只能对其进行泛洪,不能阻塞这个LSA,也不能在这个LSA的最大时长计时器前丢弃这个LSA。
最新LSA的判定
·更高的序列号:每30(1800S)分钟扩散一次
·校验和:每隔五分钟重新校验 除Age字段之外 进行校验, 越大越新
·老化时间:默认60分钟 时间计数,每经过一台路由器时间+1
LSA类型
图片出处:
LSA1 路由器LSA(Router LSA)
LSA2 网络LSA(Network LSA)
LSA3 网络汇总LSA(Network summary LSA)
LSA4 ASBR汇总LSA(ASBR summary LSA)
LSA5 自治系统外部LSA (Autonomous system external LSA)
LSA6 组成员LSA (Group membership LSA) *目前不支持组播OSPF (MOSPF协议)
LSA7 NSSA外部LSA (NSSA External LSA)
类型1:路由器LSA Router Link States
链路状态ID(LSID):源路由器ID
通告范围:只在特定区域内泛洪
通告内容:
1.路由器在区域内的接口和接口所连接的邻居(包含链路的开销)路由器链路状态。直连链路信息
2.网络连接类型
点到点的连接,描述的是邻居路由器ID
中转网络的连接,描述的是DR接口的地址
末节网络的连接,描述的是IP网络的子网
虚链路,描述的是邻居路由器ID
3.链路开销
4.是否为ABR
类型2LSA:网络LSA Net Link States
链路状态ID:DR的IP接口地址
通告范围:在特定的区域内泛洪,只有在存在DR和BDR的网络中才会存在
通告内容:列出了构成中转网络的所有路由器,包括链路的子网掩码,链路状态等信息
类型3LSA:汇总LSA Summary Net Link States(O IA)
链路状态ID:目的网络的地址
通告范围:区域间通告,由一个区域通告到另一个区域
通告者:ABR
通告内容:ABR将从一个区域中学习到的信息汇总成链路状态通告。
与3类LSA有关的计算
(1)区域内开销出现变化时
假设区域1内某链路开销出现了变化,该区域内的路由器重新进行SPF算法来更改路径。再次重新收敛后,该区域的ABR(假设该区域只有一个ABR)会向区域0发送一个更新的LSA来通告这一变化,此时区域0和其他收到这个汇总LSA的区域不会重新进行SPF算法,只会将这个LSA放入自己的LSDB中去,将去往目的网络的开销更改
(2)类型3LSA的生成和传播规则
·ABR只会将来自骨干区域的 3类LSA,进行SPF算法,得出路由表从而再创建3类LSA发送到非骨干区域中,而不会对来自非骨干区域的LSA进行操作(一个区域中有两个ABR,两个ABR都会通告3类LSA,这样ABR就会得到另一个ABR发送的三类LSA)。但这些LSA会存在与非骨干区域的LSDB中,并且在非骨干区域中泛洪(保证LSDB的同一性)
·当ABR创建并泛洪3类LSA,想要将这个区域内的网络通告到另一个区域时,如果是从非骨干区域通告到骨干区域,ABR只会考虑区域内的路由(路由表中不带IA的),如果是从骨干区域通告到非骨干区域,会同时考虑区域内的路由和区域间的路由(即会告诉非骨干区域去往其他区域的信息)所有路由器都会有相同的LSDB,根据LSDB来构建自己的路由表
类型4LSA:ASBR汇总LSA
链路状态ID:ASBR的路由器ID
通告范围:除了末节区域的整个OSPF域中
通告内容:如何到达ASBR
通告者:ABR
与4类LSA有关的计算
(1)4类LSA在区域中的泛洪
有外部路由接入的区域的ABR生成最原始的类型4LSA,将这个LSA通告入骨干区域,其中的开销是这个ABR到达ASBR的开销,类似于三类LSA,骨干区域内的ABR路由器接收到这个类型的LSA后,会将这个类型的LSA加入到SPF算法中,生成新的4类LSA,通告到非骨干区域中去,这个类型4的LSA声明的开销为LSDB中的LSA的开销加该路由器到原始ABR的距离,非骨干区域内路由器计算去往ASBR的距离时,就是该路由器到ABR的距离,加上收到的类型4LSA中通告的距离
类型5LSA:自治系统LSA
链路状态ID:外部网络号
通告范围:除了末节区域的整个OSPF自治系统中
通告内容:如何通过ASBR到达外部网络
通告者:ASBR的路由器ID
PS:LSA 5的通告路由器在穿越ABR的时候是不会改变的
类型7LSA:NSSA外部LSA
链路状态ID:外部网络号
通告范围:只存在于NSSA区域,在ABR处被当作5类LSA泛洪出去
7类ASBR,转化为5类LSA后,保留一个地址,保留的地址是ASBR的接口地址,其他区域内到外部的路径实际上是去到保留地址的路径。两个ABR时,路由器ID大的负责将7类LSA转为5类LSA
其他有关LSA的特性及操作
(1)接口失效后,LSA的运作情况
首先他会发送新的类型1LSA,告诉他的邻居,他已经没有了那条链路的信息,其次因为down掉的是LAN中的DR接口,所以路由器会撤销之前发送的类型2LSA,通过发送改变LSA时长但是并不改变序列号的二类LSA的方法,可以快速的撤回该类型的LSA。这时区域的ABR也感知到了拓扑发生的变化,他根据路由表发生的变化发送新的LSA来告知骨干区域和其他区域,其他区域再采取相应的措施(去除路由条目,或者有备份路径)
(2)产生LSA的路由器身份
①区域内路由器产生1类LSA和2类LSA
②ABR产生3类和4类LSA
③ASBR生成5类和7类LSA
(3)3类LSA的操作
① ABR会忽略来自非骨干区域的三类LSA,此举可以消除三类LSA由骨干区域进入非骨干区域而又由非骨干区域进入骨干区域的问题
②完全末节区域中有默认路由的3类LSA
OSPF区域类型和结构(重!)
区域类型
(1)骨干区域:所有区域必须连接骨干区域
(2)标准区域:接收所有内部和外部的路由信息
(3)末节区域:不接受自治系统外部的路由信息(不接受4类和5类LSA),通过一条默认的全0三类LSA前往自治系统外部
(4)完全末节区域:只接收区域内部路由信息 ,通过默认路由和别的区域相连(不接受3,4,5类LSA,通过默认路由与外部网络通信)
(5)NSSA:接收区域路由和有限的外部路由信息 限制自治系统外信息,NSSA区域中可以有ASBR,存在1/2/3/7类LSA(3类还有一条全0的特殊3类)
(6)完全NSSA:只接收区域内的路由信息和有限的外部路由信息,存在1/2/7类LSA,一条全0的特殊3类。
配置 NSSA Area后要在区域内手工配置一条默认路由(以便访问OSPF中其他区域的网络)
OSPF末节区域的默认路由
(1)末节区域,完全末节区域,完全NSSA区域会自动生成一条区域间的默认路由,NSSA区域不会自动生成,需要手动配置一下
(2)如果有两个ABR,会产生次优路由,用一条默认路由代替一堆路由,其本质也可以是看作路由汇总,路由汇总一直都会损失掉一部分粒度
OSPF路径选择
OSPF路由类型
·O,区域内路由
·OIA,区域间路由
·OE2,外部路由,开销值在区域内传播时不改变
·OE1,外部路由,开销值在区域内传播时改变
·ON2,在NSSA区域中存在,类似OE2
·ON1,在NSSA区域中存在,类似OE1
·OIA,区域间默认路由
·ON2,NSSA区域中默认路由
选路规则
以下按优先级排列,先出现的优先级最高
·区域内路由>区域间路由>E1/N1路由(这两类路由被看作是平等的)>E2/N2路由
区域内和区域间路由的选取(同一区域内多台ABR时)
为了避免区域边界单点故障的情况,多数网络中会至少会使用两台ABR,以防止ABR出现故障而造成的网络瘫痪。ABR可以同时从区域内路由器和另一台ABR学到某个特定子网的信息。ABR可以学到一条区域内的路由(来自所连接区域),和一条区域间路由(来自另一台ABR,不是直接到达网络所在区域而是先到ABR1再通过ABR1到另一个区域,通过了两个区域所以算作区域间路由)。即使区域间路由的开销值要比区域内路由的开销值小,也会优选选取区域内的路由
OSPF虚链路
定义
指一条通过一个非骨干区域连接到骨干区域的链路
目的
通过一个非骨干区域连接一个区域到骨干区域
通过一个非骨干区域连接一个分段的骨干区域
特点及规则
(1)虚链路必须配置在两台ABR路由器之间
(2)传送区域不能是一个末梢区域
(3)虚链路的稳定性取决于其经过的区域的稳定性
(4)虚链路有助于提供逻辑冗余
思考:为什么OSPF的骨干区域要是连续的?
因为所有域间流量都要通过area 0转发,非骨干区域可以配置成各种类型,例如末节区域,nssa,他可能并不知道所有的外部路由,如果要转发给那些未知目的地,非骨干区域的做法就是把数据转发给骨干区域,让骨干区域去做转发,所以骨干区域的功能是核心转发,所以要都和骨干区域相连接。