这些内容是按照自己对ospf协议理解所整理的,很可能不适合大家的思路,在这分享有部分资料,可以参考下。

OSPF

先认识下面
LSA链路状态通告 是一台运行着OSPF协议的路由器所产生的对于该路由器自身的局部信息状态、连接网络信息状态、外部路由信息状态等的汇总;
LSU链路状态更新 是在路由器状态、网络拓扑发生了变化后,OSPF路由器产生的通告信息;
LSACK链路状态更新确认 收到LSU报文后,对LSU报文的确认;
LSDB链路状态数据库 OSPF路由器收到LSA后,收集LSA组成LSDB,链路状态数据库!显然,互相交换LSA的路由器之间,他们的LSDB是相同的。
与其它所有动态路由选择协议一样,运行
OSPF
协议的路由器之间,是通过它们之间的物理(逻辑)连接,来交互相关的
OSPF
协议报文,经过协议运算后,每个运行
OSPF
的路由器得到各自的路由表条目;
OSPF
的协议报文是承载在
IP
报文里在网络中传送的,其协议号
IP
协议的
89
号(好比
ICMP
IP
协议号的
1
IGMP
协议号是
IP
协议号的
2
那样);如下ospf报文结构
ospf通过上面五种报文和路由算法生成Neighbor table,Topology table,Routing table。
HELLO报文
运行着OSPF协议的路由器在其OSPF进程激活的端口上都会发出Hello报文,在广播环境中,Hello是使用224.0.0.5来发送出去的。ospf的hello报文主要用于发现邻居,协商参数,选举DR,BDR。关于hello报文的发送过程可以从OSPF协议启动报文交互过程得到详细体现。
hello报文结构如下
OSPF协议启动报文交互过程
OSPF区域 
我们可以将
OSPF
相邻路由器从发送
Hello
数据包,建立数据库同步至建立完全的
OSPF
交互关系的过程分成几个不同的状态,分别为:
——Down
:这是
OSPF
建立交互关系的初始化状态,表示在一定时间之内没有接收到从某一相邻路由器发送来的信息。在非广播性的网络环境内,
OSPF
路由器还可能对处于
Down
状态的路由器发送
Hello
数据包。
——Attempt
:该状态仅在
NBMA
环境,例如帧中继、
X.25
ATM
环境中有效,表示在一定时间内没有接收到某一相邻路由器的信息,但是
OSPF
路由器仍必须通过以一个较低的频率向该相邻路由器发送
Hello
数据包来保持联系。
——Init
:在该状态时,
OSPF
路由器已经接收到相邻路由器发送来的
Hello
数据包,但自身的
IP
地址并没有出现在该
Hello
数据包内,也就是说,双方的双向通信还没有建立起来。
——2-Way
:这个状态可以说是建立交互方式真正的开始步骤。在这个状态,路由器看到自身已经处于相邻路由器的
Hello
数据包内,双向通信已经建立。DR/BDR的选择正是在这个状态完成的。在这个状态,
OSPF
路由器还可以根据其中的一个路由器是否指定路由器或是根据链路是否点对点或虚拟链路来决定是否建立交互关系。
——Exstart
:这个状态是建立交互状态的第一个步骤。在这个状态,路由器要决定用于数据交换的初始的数据库描述数据包的序列号,以保证路由器得到的永远是最新的链路状态信息。同时,在这个状态路由器还必须决定路由器之间的主备关系,处于主控地位的路由器会向处于备份地位的路由器请求链路状态信息。
——Exchange
:在这个状态,路由器向相邻的
OSPF
路由器发送数据库描述数据包来交换链路状态信息,每一个数据包都有一个数据包序列号。在这个状态,路由器还有可能向相邻路由器发送链路状态请求数据包来请求其相应数据。从这个状态开始,我们说
OSPF
处于
Flood
状态。
——Loading
:在
loading
状态,
OSPF
路由器会就其发现的相邻路由器的新的链路状态数据及自身的已经过期的数据向相邻路由器提出请求,并等待相邻路由器的回答。
——Full
:这是两个
OSPF
路由器建立交互关系的最后一个状态,在这时,建立起交互关系的路由器之间已经完成了数据库同步的工作,它们的链路状态数据库已经一致。
 
一个OSPF网络中,可以包括多种区域,其中就有五种常见的特殊区域,即就是骨干区域(Backbone Area),标准区域,末梢区域(Stub Area),非纯Stub区域(No Stotal Stub area,NSSA)和Total NSSA Area。
stub area
末节区域内不接收外部路由(External routes,即第5类或者第7类LSA),但是会接收域间路由(3类LSA,由ABR发出),
这样末节区域的路由器就学不到外部路由(O E2或者O E1),但是ABR会自动给末节区域发布一条通往自身的默认路由(由第3类LSA显示,O IA),
这样末节区域内的所有路由器只要是去往外部路由都会从默认路由走,全部交给ABR处理;
totally stub area
是在Stub区域的基础上,再对其他ABR通告的网络汇总LSA(即Type 3类型LSA)也进行了阻隔,不接收区域间路由通告。
其ABR仅通过网络汇总LSA通告一个默认路由,使用这个默认路由到达OSPF自治系统外部的目的地址。也就是说,完全Stub区域同时不允许Type 3、4或5三类LSA注入
NSSA区域
NSSA区域与stub类似,也是一个末梢区域,只是它取消了不能注入其它路由条目的限制,也就是说,可以引入外部路由。但是这个外部路由可能需要限制在自己的区域内传播,
如果一定要传播到其它区域,就需要ABR做七/五转换,把7类lsa转换成5类lsa,再传播出去。NSSA区域内的外部路由,仅能以7类lsa的形式存在。
Total NSSA Area
本区域禁止LSA3/4/5进入,只有本区域内路由和外部路由。配置total nssa area后会在区域内自动生成一条默认路由,以便访问ospf中其他区域。
LSA类型
lsa头部如下:
 
Link State ID:链接状态ID,它和Link state Type,Advertising Router来标识一个LSA。
Advertising Router:产生该LSA的路由器的Router ID。
Sequence Number:LSA的序列号,当LSA的新实例产生时增加。
Checksum:除开Age的LSA的校验和。
Length:LSA的长度,以字节为单位。
LSA的类型有很多种,这里只介绍五种常用的LSA的类型:
类型1:router LSA(路由器链路状态宣告)
类型2:network LSA(网络链路状态宣告)
类型3/4:summary LSA(网络/路由器汇总链路状态宣告)
类型5:AS external LSA(自治系统外部链路状态宣告)
类型1:router-lsa 路由器链路状态宣告
所有的OSPF路由器都会产生这种数据包,用于描述路由器上联接到某一个区域的链路或是某一端口的状态信息。
Router LSA描述了路由器接口到该区域的链路状态和开销(Cost)。
一个Router LSA包含该路由器到该区域所有的链路。
一个Router LSA只在单独的区域传播,不穿越ABR。
Router LSA还描述了该路由器是否为ABR、ASBR或虚链路端口
类型1的链路状态数据包在描述其所联接的链路时,会根据各链路所联接的网络类型对各链路打上链路标识,Link ID。
 
 
LSA的类型2  网络链路状态通告
由网络中的DR生成。
描述了该网络中所有路由器,包括DR本身。
一个Router LSA只在单独的区域传播,不穿越ABR。
Network LSA ID是DR进行宣告的那个接口的IP地址。
LSA的类型3,4 汇总链路状态宣告
 
由ABR发起的。
描述不属于本区域,但仍属于该自治系统的目的地。
只在一个区域内宣告。
如果路由目的为一个ASBR,则生成Type4 LSA。它的链路状态ID为目的ASBR的RID。
Type 3 的链路状态ID是目的网络地址。
该链路状态广播是由区域边界路由器或AS边界路由器产生的。Summary Link描述的是到某一个区域外部的路由信息,这一个目的地地址必须是同一个AS中。Summary Link也只会在某一个特定的区域内广播。类型3与类型4两种总结性链路信息的区别在于,类型3是由区域边界路由器产生的,用于描述到同一个AS中不同区域之间的链路状态;而类型4是由AS边界路由器产生的,用于描述不同AS的链路状态信息。值得一提的是,只有类型3的Summary Link才能广播进一个残域,因为在一个残域中不允许存在AS边界路由器。残域的区域边界路由器产生一条默认的Summary Link对域内广播,从而在其余路由器上产生一条默认路由信息。采用Summary Link可以减小残域中路由器的链路状态数据库的大小,进而减少对路由器资源的利用,提高路由器的运算速度。
Type 3 类型的特点是每一条type 3 的lsa 都对应一条路由,每穿过一个ABR,其ADV Router(通告路由器)都会发生改变,ADV Router会变成最后一次穿过的ABR路由的。
LSA的类型5  外部链路状态宣告
 
描述了到达本AS外部的路由。
由ASBR生成的。
在整个AS内部宣告 ,除特殊区域。
链路状态ID是目的地址的IP网络号。
类型5的链路数据包是由AS边界路由器产生的,用于描述到AS外的目的地的路由信息,该数据包会在AS中除残域以外的所有区域中广播。
一般来说,这种链路状态信息描述的是到AS外部某一特定网络的路由信息,在这种情况下,类型5的链路状枋数据包的链路标识采用的是目的地网络的IP地址;
Type 5的通告路由器在穿过ABR的时候不会改变!因此需要type 4来通告产生Type 5路由器的信息。
在某些情况下,AS边界路由器可以对AS内部广播默认路由信息,在这时,类型5的链路广播数据包的链路标识采用的是默认网络号码0.0.0.0。
AS-external-lsa由ASBR生成并在整个AS内洪泛,使用show ip ospf database来查看OSPF的LSDB信息 ,一些route designator如下:
O——代表OSPF area内(intra-area)路由,为router LSA
IA——在一个AS里的area之间(inter-area)的路由,为summary LSA
E1/O E2——AS外路由,为external LSA
SPF算法根据LSDB运算出SPF树来决定最佳路径,步骤如下:
所有在各自的area里的路由器计算出最佳路径并放进路由表里,为LSA类型1和类型2.用O来标记 ;
area之间的路由器计算出最佳路径,这些最佳路径是area间路由条目,或LSA类型3和LSA类型4.用O IA来标记;
所有的除了stub area的路由器计算出到达外部AS的最佳路径(LSA类型5),标记为O E1或O E2
O E1和O E2的区别为是到达外部网络,前者要加内部cost,后者不加。
 
LSA的类型7 NSSA外部LSA
是指非纯末梢区域内始发于ASBR路由器LSA通告。
本区域只允许LSA 3进入,禁止LSA4/5的进入。所有此区域有域内,域间和外部路由。
 
ospf各种LSA在ospf区域间传播。
 
对于ospf还有太多太多东西了,如认证等,深入了解可以看看。
链路类型
具体描述
链路标识
1
用于描述点对点的网络
相邻路由器的路由器标识
2
用于描述至一个广播性网络的链路
DR
的端口地址
3
用于描述至非穿透网络即
stub
网络的链路
stub
网络的网络号码
4
用于描述虚拟链路
相邻路由器的路由器标识

Network Mask
:该报文产生的接口的掩码。
Neighbor
:产生该报文的接口能够在
Router Dead Interval
间隔内收到
Hello
的所有邻居列表。
数据库描述报文
数据库描述报文结构如上图,对应
 
Interface MTU:产生该报文的接口在不分片的情况下能够传输的最大IP报文。当该报文在虚链接上传输时Interface MTU设置为0。
I-bit:Initial位,当该报文是DD报文序列的初始化报文时,该位为1。
M-bit:More位,当该报文不是DD报文序列的最后一个时,该位为1。
MS-bit:Master/Slave位,当Master产生该报文时设置为1,Slave将该位设置为0。
DD Sequence Number:DD报文的序列号,由Master设置。
LSA Headers:链接状态数据库的LSA头列表。
数据库描述数据包对于邻接关系的建立很重要。3个标记位(I,M,MS)用来管理邻接关系建立的过程。
当两台路由器在ExStart状态开始进行主/从协商时,他们都将发送一个MS都设置为1的空的数据库描述包来宣称自己是“主”路由器,这两个数据库描述包的数据库描述序列号是由发出这两个数据包的路由器根据当时应该使用的到的序列号来确认的。具有较低路由器ID的邻接路由器将成为“从”路由器,并且回复一个MS位设置为0的数据库描述数据包,这个数据库描述包的序列号设置为“主”路由上的序列号。同时,这个数据库描述数据包也将是第一个携带LSA摘要信息的数据包,当主/从关系协商完成后,邻接状态也将转换到Exchange状态。
LSR链接状态请求报文
Link State Type:链接状态类型用来描述该LSA的类型。
Link State ID:链接状态ID,它和Link state Type,Advertising Router来标识一个LSA。
Advertising Router:产生该LSA的路由器的Router ID。
下面有关于LSA类型详细介绍。
 
如果本地路由器发现它的邻接路由器有一条LSA通告不在它自己的链路状态数据库中,或者邻居路由器含有比已知LSA通告更新的拷贝,那么本地路由器将把这条LSA放入它的链路状态请求列表中。随后,本地路由器将发出一个链路状态请求数据包去请求一个关于刚刚讨论的LSA的完整拷贝。链路状态更新包(LSU)将会传送这些被请求LSA的信息,当本地路由器收到关于这些被请求的LSA之后,它将从自己的链路状态请求列表中删除这些LSA的条目。
链接状态更新报文LSU报文
结构如上图
Number of LSA:包含在该报文中的LSA数目。
LSAs:发送的更新的LSA列表。
在更新数据包中传送的所有的LSA必须单独地进行确认,因此,路由器将把这些传送的LSA放入它的链路状态重传列表中。当这些LSA被确认后,路由器就从它的链路状态重传列表中删除它们。
  LSA可以通过下面两种方法之一来确认:
1、显示确认(Explicit Acknowledgment)--确认收到包含这个LSA头部的链路状态确认数据包。
2、隐式确认(Implicit Acknowlidgment)--确认收到包含这个LSA的相同实例(没有其他更加新的LSA)的更新数据包。
  “主”路由器将控制数据库的同步过程,并确保每次只有一个数据库描述数据包是未处理的。当“从”路由器收到一个从“主”路由器发出的数据库描述数据包后,
“从”路由器将通过发送一个具有相同序列号的数据库描述数据包来确认那个数据包。如果“主”路由器在RxmtInterval(这个参数在接口数据结构一节中已经介绍)的时间内没有收到一个关于
未处理的数据库描述数据包的确认,那么“主”路由器将会发送该数据包的一份新拷贝。
  “从”路由器发送数据库描述数据包仅仅用来相应它从“主”路由器那里收到的数据库描述数据包。如果它所收到的数据库描述数据包具有一个新的序列号,那么“从”路由器将发送一个具有相同
序列号的数据库描述数据包。如果它所收到的数据库描述数据包的序列号和在这之前已确认的数据库描述数据包的相同,那么这个确认数据包就是重发的。
  当数据库同步过程完成后,将会出现下面两种状态转换的其中一种:
  1、如果链路状态请求列表中仍然还有一些LSA条目,那么路由器将把邻居的状态转换到加载(Loading)状态。
  2、如果链路状态请求列表为空,那么路由器将会把邻居的状态转换到完全邻接(Full)状态。
链接状态确认报文LSAck报文
LSA Headers:被确认的LSA头部