Ospf
开放式最短路径优先(Open Shortest Path First、OSPF)是IETF定义的一种基于链路状态的内部网关路由协议(IGP)。针对IPv4协议使用的是OSPF Version 2 (RFC2328);针对IPv6协议使用的OSFP Version 3(RFC2740)
优点
- 基于SPF算法,以“累计链路开销”作为路由参考值
- 采用组播形式收发部分协议报文
- 支持层次区域划分
- 支持对等价路由进行负载分担
- 支持报文认证
基础术语
RouterID
用于在自治系统中唯一标识一台运行OSPF的路由器,它是一个32位的无符号整数。
选举规则
手动配置OSPF路由器的RouterID(建议手动)
如果没有手动配置Router ID,则路由器使用Loopback接口中最大的IP地址作为Router ID
如果没有配置Loopback接口,则路由器使用物理接口中最大的IP地址作为Router ID
度量值
OSPF使用Cost(开销)作为路由度量值。每个激活的OSPF的接口都会维护一个接口Cost值,缺省的接口Cost=100Mbit/s/接口带宽。其中100Mbit/s为OSPF指定的缺省参考值,该值是可配置的。
OSPF以累计cost为开销值,也就是从流量源网络到目的网络所经过所有路由器的出接口的cost总和。
三大表项
邻居表
OSPF在传递状态信息之前,需通过Hello报文建立OSFP邻居关系,使用display ospf peer查看邻居状态。
LSDB
LSDB会保存自己产生及邻居到的LSA信息,使用display ospf lsdb查看。
OSPF路由表
OSPF路由表包含Destination,cost和NextHop等指导转发的信息,是不同于路由器路由表(路由器路由表通常称为全局路由表,并非所有OSPF路由都可以放到路由器路由表)使用display ospf routing查看
OSPF报文&工作流程
OSPF定义了5中类型的报文,不同类型的ospf报文有相同的头部格式,报文直接采用ip封装在报文的ip头部中协议号89
| type | 报文名称 | 报文功能 |
|---|---|---|
| 1 | hello | 发现和维护邻居关系 |
| 2 | Database Description | 交互链路状态数据库摘要 |
| 3 | Link State Request | 请求特定的链路状态信息 |
| 4 | Link State Update | 发送详细的链路状态信息 |
| 5 | Link State Ack | 确认LSA |
OSPF包头
| 位 | 第1字节 | 第2字节 | 第3字节 | 第4字节 |
|---|---|---|---|---|
| 0~31 | Vesion | Type | Packet Length | |
| 32~63 | Router ID | |||
| 64~95 | Area ID | |||
| 96~127 | Checksum | Auth Type | ||
| 128~159 | Authentication | |||
| 160~191 | Authentication | |||
重要字段解释
- Version :对于当前所使用的OSPFv2,该字段的值为2。
- Type:类型字段。
- Packet length:表示整个OSPF报文的长度,单位是字节。
- Router ID:表示生成此报文的路由器的Router ID。
- Area ID:表示此报文需要被通告到的区域。
- Checksum:校验字段,其校验的范围是整个OSPF报文,包括OSPF报文头部。
- AuthType:为0时表示不认证;为1时表示简单的明文密码认证;为2时表示加密 (MD5)认证。
- Authentication:认证所需的信息。该字段的内容随AuType的值不同而不同
Hello包
Hello包的OSPF包类型为1。这些包被周期性的从各个接口(包括虚链路)发出,用来创建和维护邻居关系。另外,在支持组播或广播的物理网络上,Hello包使用组播地址(通常为224.0.0.5)发送。Hello包的发送间隔由HelloInterval指定(通常为10s),路由器将会先发出不包含邻居字段的空Hello包,当收到邻接路由器的Hello包后,将对方的路由器标识放入本机的Hello包中进行组播,这种包含邻居字段的包,也被称为HelloSeen包。加入间隔达到RouterDeadIterbal所规定的时长(通常为40s)内仍未收到一个已创建连接的路由器的Hello包,路由器将会终止这一连接。将对方状态转为Down。Hello包的格式如下:
| 位 | 第1字节 | 第2字节 | 第3字节 | 第4字节 |
|---|---|---|---|---|
| 0~191 | OSPF包头 | |||
| 192~223 | Network Mask | |||
| 224~255 | HelloInterval | Options | Rtr Pri | |
| 256~287 | RouterDeadInterval | |||
| 288~319 | Designated Router | |||
| 320~251 | Backup Designated Router | |||
| 352~383 | Neighbor | |||
| ...... | ||||
数据库描述包
数据库描述包(Database Description)的OSPF包类型为2.当邻接关系初始化后,便开始交换这些数据包。他们描述了链路状态数据库的摘要信息(只包含LSA的头部信息)。
数据库描述包含两种,即空数据库描述包和包含LSA头部信息的数据库描述包。
当两台路由器互相收到HelloSeen包后,他们将会开始互相发送空数据库描述包,空数据库描述包被用来进行主从关系的确定。通常以路由器标识较大的为Master,当主从关系确立后,从机将会使用主机的序号向主机发送第一个包含LSA头部信息的数据库描述包。主机将会在收到从机的数据库描述包后发送自己的序号加一的数据库描述包,作为对从机的收到确认。在这样的交互过程中,只有主机可以更改序号(DD sequence number),从机使用主机序号。数据库描述包格式如下:
| 位 | 0~7 | 8~15 | 16~23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 第1字节 | 第2字节 | 第3字节 | 第4字节 | ||||||||
| 0~191 | OSPF包头 | ||||||||||
| 192~223 | Interface MTU | Options | 0 | 0 | 0 | 0 | 0 | I | M | MS | |
| 224~255 | DD sequence number | ||||||||||
| 256~287 | An LSA Header | ||||||||||
| 288~319 | |||||||||||
| 320~351 | |||||||||||
| 352~383 | |||||||||||
| 384~415 | |||||||||||
| ...... | |||||||||||
链路状态请求包
链路状态请求包(Link State Request)的OSPF包类型为3。在交换机数据库描述包之后,路由器便知道其自身链路状态数据库缺少哪些LSA,以及哪些LSA是过期的。这时就可以发送链路状态请求包来请求对方发送缺少的LSA和最新的LSA。链路状态请求包格式如下:
| 位 | 第1字节 | 第2字节 | 第3字节 | 第4字节 |
|---|---|---|---|---|
| 0~191 | OSPF包 | |||
| 192~223 | LS type | |||
| 224~225 | Link State ID | |||
| 256~287 | Advertising Router | |||
| ...... | ||||
链路状态更新包
链路状态更新包(Link State Update)的OSPF包类型为4。LSA的泛洪就是由此类包实现的。每一个链路
状态包更新可能包含多条LSA信息。这里的LSA信息是完整的,而不像数据库描述包只包含LSA的头部信息。链路状态数据包的格式如下:
| 位 | 第1字节 | 第2字节 | 第3字节 | 第4字节 |
|---|---|---|---|---|
| 0~191 | OSPF报头 | |||
| 192~223 | #LSAs | |||
| 224~255 | LSAs | |||
| 256~287 | ||||
| 288~319 | ||||
| ...... | ||||
链路状态确认包
链路状态确认包(Link State Acknowledgement)的OSPF包类型为5。 为了确保LSA的泛洪是可靠的,LSA信息必须被显示的确认。链路状态数据包格式如下:
| 位 | 第1字节 | 第2字节 | 第3字节 | 第4字节 |
|---|---|---|---|---|
| 0~191 | OSPF报头 | |||
| 192~223 | An LSA Header | |||
| 224~255 | ||||
| 256~287 | ||||
| 288~319 | ||||
| 320~351 | ||||
| ...... | ||||
网络类型
点到点网络 (point-to-point)
点到点网络,例如E1,SONET,是单独连接一对路由器的网络。点到点网络上的一对OSPF路由器形成完全邻接关系(Full Adjacency),并且不进行DR和BDR的选举。点到点网络上的路由器使用组播地址224.0.0.5发送OSPF协议数据包。
点到多点网络 (point-to-multipoint)
点到多点网络是NBMA网络的一个特殊设置,可以看做是一群点到点链路的集合,因此在该种网络上不比选举DR和BDR。点到多点网络上OSPF的行为和点到点网络ISPF的行为一样,也是用组播地址224.0.0.5发送OSPF协议数据包。
广播网络 (broadcast)
广播网络既可以同时连接多于两台设备的网络,如以太网,令牌环网,FDDI。广播网络上的路由器发送的组播/广播数据包会被其它与之相连接的路由器收到。在广播网络上的OSPF路由器会选举一台指定路由器(DR)和一台备份路由器(BDR)。所有始发于DR和BDR的OSPF数据包使用目的地址224.0.0.5,以组播方式发送到所有其他OSPF路由器,所有其他的路由器都将使用目的地址224.0.0.6,以组播方式发送OSPF数据包到DR和BDR。所有其他的路由器只与DR和BDR创建完全邻接关系。
非广播多路访问网络 (non-broadcast multi-access, NBMA)
NBMA网络,诸如X.25,帧中继,ATM等,可以同时连接两台以上的路由器,但是这种网络没有广播数据包的能力。一台处于NBMA网络上的路由器发送的组播/广播数据包将不能被其他与之相连的路由器收到。在NBMA网络上需要选举DR和BDR,并且所有OSPF数据包单播发送的。
路由器类型

OSPF定义了一下4种路由器类型:
内部路由器(Internal Router)
骨干路由器(Backbone Router)
区域边界路由器(Area border Router,ABR)
自治系统边界路由器(Aautonomous System Boundary Router,ASBR)
一台路由器可以同时属于多种类型,如图所示,R2同时属于多种类型路由器。
每一台OSPF路由器都有一个路由器标识符(Identifier),一般写作路由器ID。路由器ID有一个长度为32bits的字段所定义,通常用IPv4地址格式来表示(如1.2.2.2)。如果没有显示的设置路由器ID,则该路由器上最大的活跃逻辑接口IP地址将成为路由器ID;如果路由器不存在逻辑接口,则最大活跃物理接口IP地址将成为路由器ID。注意,不要将路由器类型和指定路由器(Designated Router,DR)、备份指定路由器(Backup Designated Router,BDR)混淆,DR和BDR是路由器接口属性,而不是整个路由器的属性。
内部路由器
如果一台路由器上所有启动的OSPF的接口都在同一区域,那么这台路由器就是内部路由器。
骨干路由器
骨干路由器是指至少有一个启用了OSPF的接口和骨干区域(Area 0)相连的路由器。一台骨干路由器也可以同时是ABR或ASBR,
区域边界路由器
区域边界路由器是指连接一个或者多个区域的路由器。区域边界路由器为每一个与之相连的区域维护一份链路状态数据库,因此区域边界路由器需要比内部路由器更多内存资源和更高性能的处理器。
自治系统边界路由器
自治系统边界路由器(ASBR)用来把从其他路由西协议(如BGP、EIGRP其他进程号的OSPF等)学习到的路由以路由重分发的方式注入到OSPF进程中,从而使得整个OSPF域内的路由器都可以学习到这种路由(除了末梢区域内的路由器)。一台ASBR可以是OSPF域内非末梢区域的任何路由器,它可以是内部路由器、区域边界路由器骨干路由器。
LSA
链路状态通告(Link-state advertisement,LSA)描述所有链路,接口和邻居等链路状态信息,OSPF路由协议对所有路由信息的描述,都是封装在链路状态通告LSA中发送出去的。链路状态通告是ospf进行路由计算的关键依据。
LSA类型
OSPF定义了11种LSA,所有类型的LSA都以一个20字节的通用LSA头部开始。这些不同类型的LSA共同描述了OSPF域内的网络拓扑结构。所有LSA都保存在LSDB中。SPF算法根据LSDB中的信息计算出最佳路径。
- 路由器LSA(Router-LSA):路由器LSA的类型为1.每台OSPF路由器生成一条路由器LSA 。该LSA描述了路由器接口状态,以及每个接口出站代价。路由器LSA只能在始发他们的OSPF区域内泛洪,不能泛洪到其他区域。
- 网络LSA(Network-LSA):网络LSA的类型为2。网络LSA的DR为了描述连接到多路访问网络并且和DR创建了完全邻接关系的路由器而生成的,包括DR本身。和路由器LSA一样,网络LSA也只能在始发这条LSA的区域内进行泛洪。
- 汇总LSA(summary-LSA):汇总LSA的类型为3.此类LSA描述了区域间的网络,由ABR生成,对于末梢区域,汇总LSA同时被用于描述默认路由。
- ASBR汇总LSA(ASBR Summary-LSA):ASBR汇总LSA的类型为4,也是ABR生成。ASBR汇总LSA通告的是一台区域外部的ASBR路由器,而不像汇总LSA通告的是整个网络。
- 自治系统外部LSA(AS-External-LSA):自治系统外部LSA的类型为5,由ASBR生成。此类LSA描述AS外部的网络资源,并可以泛洪到所有非末梢区域中去。
- 组成员LSA(Group-Membership-LSA):组成员LSA类型为6,组成员LSA是对标准OSPF的一个扩展,使其支持组播路由功能,扩展后的OSPF称之Multicast Open Shortest Path First(MOSPF)。
- NSSA外部LSA(NSSA-External-LSA):NSSA外部LSA类型为7。此类LSA由NSSA区域内的ASBR生成,也用来描述AS外部的网络。NSSA外部LSA仅仅在始发他们的NSSA区域内泛洪,而不像自治系统外部LSA可以泛洪到所有非末梢区域。
- 链路本地LSA(Link-Local LSA):链路本地LSA类型为8。该LSA专门用于OSPFv3(用于IPv6网络的OSPF)。链路本地LSA包含每个接口的链路本地地址和一个IPv6地址栏表。
RFC2370定义了3种新的LSA,称作不透明LSA(Opaque LSA)。这3种新的LSA为OSPF的扩展性提供了通用机制。他们可以携带用于OSPF的信息,也可以直接携带应用的信息。目前有一下3种不透明LSA,他们的区别主要泛洪范围不同:
- 类型9不透明LSA:泛洪范围仅仅是本地链路。
- 类型10不透明LSA:泛洪范围是始发该LSA的区域。
- 类型11不透明LSA:泛洪范围是整个OSPF域
报文格式
所有LSA都有相同报文头
| LS age | Options | LS type |
|---|---|---|
| Link State ID | ||
| Advertising Router | ||
| LS sequence number | ||
| LS checksum | Length | |
| 字段名 | 长度/bit | 含义 |
|---|---|---|
| LS age | 16 | LSA产生后所经过的时间,以秒为单位。无论LSA在链路上传送还是保存在LSDB中,其值都会不停增长 |
| Options | 8 | 可选项:
E:允许Flood AS-extemal-LSAs; MC:转发IP组播报文; N/P:处理Type-7 LSAs; DC:处理按需链路; |
| LS type | 8 | LSA类型 |
| Link State ID | 32 | 根据LSA中的LS Type和LSA description在路由域中描述一个LSA |
| Advertising Router | 32 | 产生次LSA的路由器Router ID |
| LS sequence number | 32 | LSA的序列号,其他路由器根据这个值判断那个LSA为最新的 |
| LS checksum | 16 | 除了LS age 外其他个域的校验和 |
| Length | 16 | LSA的总长度 包括LSAHeader,以字节为单位 |
区域

一个OSPF网络分为多个区域。区域将网络中的路由器在逻辑上分组并以区域为单位向网络的其余部分发送汇总路由信息。区域编号由一个长度为32位的字段所定义,区域编号有两种表示方式一种为点分十进制(如Area 1.1.1.1,写法规则同IPv4地址);另外一种为十进制数字格式(如Area 1,注意Area 1不等于Area1.1.1.1,而是0.0.0.1)。根据REC2328描述,区域编号通常使用32bits的点分十进制表示。区域编号不是IP地址,用于IPv6网络的OSPFv3也是使用同样的区域编号格式(形似IPv4地址)。
区域是以接口(Interface)为单位来划分的,所以一台多接口的路由器可以属于多个区域。相同区域内的所有路由器都维护一份相同的链路状态数据库(LSDB),如果一台路由器属于多个区域,那么它将为每一个区域维护一份LSDB。将一个网络划分为多个区域有以下优点:
- 某一区域内的路由器只需要维护该区域的链路状态数据库,而不用再维护整个OSPF网络的链路状态数据库。
- 将某一区域网络拓扑变化的影响限制在该区域内,不会影响整个OSPF网络,从而减小OSPF计算频率。
- 将链路状态通告(LSA)的泛洪限制在本区域内,从而降低OSPF协议产生的数据量。
- 划分区域可以对网络进行层次化结构设计。
- 划分区域有利于资源合理调配,核心区域部署性能较好的设备资源,边缘区域部署性能较差的设备资源即可。
OSPF定义了以下几种区域类型:
骨干区域
骨干区域(Backbone Area),Area 0(点分十进制表示为0.0.0.0)是整个OSPF域的核心区域。所有其他非骨干区域必须和骨干区域直接或间接相连。骨干区域的功能是在不同非骨干区域之间分发路由信息。
骨干区域必须是唯一而且连续的,但不需要在物理上连续:它可以使用虚拟连接。
传送区域
传送区域连接至少2个其他区域,他将通告从一个区域传送到另一个区域。
末梢区域
末梢区域(Stub Area)是一个不允许AS外部路由器通告(AS External LSA,即类型5 LSA)在其内部进行泛洪扩散的区域。末梢区域的ABR或通告一条默认路由(default route)到该区域内部所有路由器,任何发往AS外部网络的数据流都将依据默认路由来转发。
不完全末梢区域
非纯末梢区域(Not-So-Stubby Area,NSSA)允许引入AS外部路由并且扩散到其他区域,但是ASSA仍旧不允许其他区域通告的AS外部路由进入该区域。为了使NSSA能够引入AS外部路由,OSPF定义了新的LSA类型,即NSSA External LSA(类型7 LSA)。NSSA ASBR将产生类型7 LSA,并在NSSA区域内泛洪。NSSA ABR将会把类型7 LSA 转换为5类LSA,并泛洪到其他区域。
完全末梢区域
完全末梢区域(Totally Stubby Areas)说Cisco特有的区域类型。完全末梢区域不仅不允许AS外部路由通告在其内部泛洪,还不允许区域间汇总路由(Network Summary LSA 即类3 LSA)在其内部泛洪。同末梢区域一样,完全末梢区域ABR也会向该区域内所有路由器通告一条默认路由,任何发往其他区域以及AS外部网络的数据流都将依据默认路由来转发。将区域设置为完全末梢区域可以显著降低路由表的数量。
完全非纯末梢区域
完全非村末梢区域(Totally NSSA)也是Cisco特有的区域类型,改种区域除了拥有和NSSA相同的特性外,还不允许类型3 LSA在该区域内部泛洪。完全非纯末梢区域ABR也会向该区域内所有路由器通告一条默认路由。将区域设置为完全非纯末梢区域也会显著降低路由表条目数量。
邻居关系
OSPF路由器之间相互交换信息之前必须创建邻接关系。
两台OSPF路由器创建完全邻接关系之前以下参数必须相同:
- Hello时间间隔
- Dead时间间隔
- 区域编号
- 认证(如果启用认证)
- 链路MTU大小
- 子网掩码
- 子网号
- 末梢区域设置
路由计算
区域内路由计算
同一区域内的ospf路由器有着完全一致的lsdb,在区域内,采用spf算法进行路由计算。