文章目录
概要
OSPF是动态内部网关协议中较为复杂的协议,牵涉的知识点较多,被设计为适应各种网络拓扑环境,学习、总结、测试、验证、思考OSPF协议的相关内容,包括环境拓扑的规划、设备的配置命令、配置后的结果显示,抓包分析协议的封装、报文格式、报文交互、各类lsa等。
一、OSPF简介
1.1 OSPF定义:
开放式最短路径优先OSPF (Open Shortest Path First) 是IETF组织开发的一个基于链路状态的内部网关协议(Interior Gateway Protocol)。
- OSPF把自治系统AS (Autonomous System)划分成逻辑意义上的一个或多个区域;
- OSPF通过链路状态通告LSA (Link State Advertisement)的形式发布路由;
- OSPF依靠在OSPF区域内各设备间交互OSPF报文来达到路由信息的统一;
- OSPF报文封装在IP报文内,可以采用单播或组播的形式发送。
目前针对IPv4协议使用的是OSPF Version2 (RFC2328) ;针对IPv6协议使用OSPF Version3 (RFC2740) 。在本文中所指的OSPF均为OSPF Version 2。
1.2 OSPF原理:
在带有路由功能的网络设备运行OSPF协议之后,设备之间会开始交互hello报文,hello报文内通常包含了一些路由的基本信息,之后交互的是DBD报文,DBD报文简要描述了自身的LSA信息,通过收到的DBD报文来跟自身的LSA信息作对比如果部分LSA信息缺失,则发送LSR报文,请求发送缺失部分,这时对等体设备会发出一个LSU报文,LSU主要更新LSA信息,然后发送ack报文来确保安全,最后LSU存放进LSA数据库,形成LSDB,再运行SPF算法,计算出最优路径,形成路由表。
OSPF的运行机制包括五个步骤:
- 交互Hello报文
- 泛洪LSA
- 组建LSDB:LSDB是LSA的汇总
- SPF算法计算出自己到达其他设备的最优路径
- 维护和更新路由表
网络中的每台路由器都通过链路状态数据库(LSDB)来掌握全网的拓扑结构,而每台路由器都会收集其他路由器发来的LSA来完善自己的LSDB。
LSA是对路由器周围网络拓扑结构的描述,LSDB则是对整个自治系统(area)的网络拓扑结构的描述。
路由器将LSDB转换成一张带权的有向图,在网络拓扑稳定的情况下,各个路由器得到的有向图是完全相同的。(如图1所示)
(图1)
路由器根据最短路径优先(Shortest Path First)算法计算到达目的网络的路径,而不是根据路由通告来获取路由信息。如图2所示,每台路由器根据有向图,使用SPF算法计算出一棵以自己为根的最短路径树,这棵树给出了到自治系统中各节点的路由。相对于RIP, 这种机制极大地提升了路由器的自主选路能力,使得路由器不再依靠路由通告进行选路。总而言之,LSDB保证路由器能实时掌握全网的拓扑机构,SPF算法保证路由器能够迅速计算出到达目的网络的最短路径。
(图2)
1.3 OSPF的三张表
(1) 邻居表(Neighbor Table):保存OSPF路由器的邻居信息,为确保直接邻居之间能够双向通信;
(2) 链路状态数据库(Topology Table):为LSDB表,存放自己产生的以及邻居通告的LSA,同一区域的所有路由器LSDB相同;
(3) OSPF路由表(Routing Table):对LSDB应用SPF算法,选择到达目标地址的最佳路由放入路由表。
1.4 OSPF邻居的状态:
OSPF路由器可与它直连的邻居建立邻居关系。P2P链路上,所有邻居可以到达FULL状态,形成邻接关系。MA网络,所有路由器只和DR/BDR(Backup Designated Router)到达FULL状态,形成邻接关系。路由器只和建立了邻接关系的邻居才可以到达FULL状态。路由更新只在形成FULL状态的路由器间传递。其中OSPF路由器只会与建立了邻接关系的路由器互传LSA,同步LSDB。
状态 | 详细信息 |
---|---|
Down | 这是邻居状态转换的初始状态,表示最近没有从邻居收到信息。在NBMA 网络上,仍然使用较低的频率向”Down”状态的邻居发送Hello包。 |
Attempt | 该状态仅对NBMA 网络上的邻居有效,表示最近没有从邻居收到信息,但仍需作出进一步的尝试,用以与邻居联系。这时按HelloInterval的间隔向邻居发送Hello包。 |
Init | 在此状态时,表示收到了由邻居发送的Hello 包,但还没有建立与邻居的双向通讯(也就是说,路由器自身没有出现在该邻居的Hello包中)。从关联接口发出的Hello包中列出所有达到此状态(或更高状态)的邻居。 |
2-Way | 在此状态时,两台路由器的通讯达到双向,这是通过Hello 协议而实现的。并且是建立邻接前的最高状态。DR(BDR)是从达到2-Way或更高状态的邻居中选举出来的。 |
ExStart | 这是两台邻居路由器之间建立邻接的第一步。此步的目标是确定路由器的主从,并确定初始的DD 序号。达到此状态或更高状态的邻居会话被称为邻接。 |
Exchange | 在此状态的路由器通过向邻居发送DD 包,来描述其完整的连接状态数据库。每个DD 包都有一个DD 序号,并需要被明确地确认。在任何时候,一次只能发送一个DD 包。在此状态下,允许向邻居发送LSR 包来取得较新的LSA。所有达到Exchange或更高状态的邻接参与洪泛过程。事实上,这些状态的邻接完全有能力传送和接收所有类型的OSPF路由协议包。 |
Loading | 在此状态下,向邻居发送LSR 包来取得较新的LSA。就是在Exchange状态下发现(但还没有接收到)的那些LSA。 |
Full | 在此状态下,邻居路由器达到完全邻接。现在开始这些邻接将出现在Router-LSA 和Network-LSA 中。 |
1.5 OSPF五种报文:
OSPF报文是直接封装在IP报文中的,IP报文头部中的协议字段的值必须为89。
(1) Hello报文:周期性的发送用来建立和维护邻接关系,报文内容主要包括DR、BDR以及已知邻居。
(2) DD报文:是两台路由器在邻接关系初始化时,用DD报文来描述自己的LSDB,进行数据库的同步。报文内容包括LSDB中每一条LSA的Header(LSA的Header可以唯一标识一条LSA)。
(3) LSR报文:发送LSR报文向对方请求所需的LSA,只有在邻居双方成功交换了DD后才会发送LSR。内容包括所需要的LSA的摘要。
(4) LSU报文:发送对方所需要的LSA或者泛洪自己更新的LSA。内容是多条LSA(全部内容)的集合。
(5)LSAck报文:用来对接收到的LSU报文进行确认。一个LSAck报文可对多个LSA进行查看。
OSPF的五种报文格式:
OSPF五种报文具有相同的报文头格式,长度为24字节。
OSPF报文头格式
字段 | 长度 | 含义 |
---|---|---|
Version | 1字节 | 版本,OSPF的版本号。对于OSPFv2来说,其值为2。版本2支持IPV4;版本3支持IPV6,兼容IPV4。 |
Type | 1字节 | 类型,OSPF报文的类型,有下面几种类型:Hello报文、DD报文、LSR报文、LSU报文、LSAck报文。 |
Packet length | 2字节 | OSPF报文的总长度,包括报文头在内,单位为字节。 |
Router ID | 4字节 | 发送该报文的路由器标识。 |
Area ID | 4字节 | 发送该报文的所属区域。 |
Checksum | 2字节 | 校验和,包含除了认证字段的整个报文的校验和。 |
AuType | 2字节 | 验证类型,值有如下几种表示, 0:不验证;1:简单认证;2:MD5认证。 |
Authentication | 8字节 | 鉴定字段,其数值根据验证类型而定。> 当验证类型为0时未作定义;> 类型为1时此字段为密码信息;>类型为2时此字段包括Key ID、MD5验证数据长度和序列号的信息。>MD5验证数据添加在OSPF报文后面,不包含在Authenticaiton字段中。 |
(1)OSPF Hello报文格式
字段 | 长度 | 含义 |
---|---|---|
Network Mask | 32比特 | 发送Hello报文的接口所在网络的掩码。 |
HelloInterval | 16比特 | 发送Hello报文的时间间隔,默认为10s。 |
Options | 8比特 | 可选项:(1) E:允许Flood AS-External-LSAs (2) MC:转发IP组播报文 (3) N/P:处理Type-7 LSAs (4) DC:处理按需链路 |
Rtr Pri | 8比特 | DR优先级。默认为1。如果设置为0,则路由器不能参与DR或BDR的选举。 |
RouterDeadInterval | 32比特 | 失效时间。如果在此时间内未收到邻居发来的Hello报文,则认为邻居失效。 |
Designated Router | 32比特 | DR的接口地址。 |
Backup Designated Router | 32比特 | BDR的接口地址。 |
Neighbor | 32比特 | 邻居,以Router ID标识。 |
(2)OSPF DD报文格式
DD报文中的LSA Header只占一条LSA的整个数据量的一小部分,这样可以减少路由器之间的协议报文流量,对端路由器根据LSA Header就可以判断出是否已有这条LSA。在两台路由器交换DD报文的过程中,一台为Master,另一台为Slave。由Master规定起始序列号,每发送一个DD报文序列号加1,Slave方使用Master的序列号作为确认。
字段 | 长度 | 含义 |
---|---|---|
Interface MTU | 16比特 | 在不分片的情况下,此接口最大可发出的IP报文长度。 |
Options | 8比特 | 可选项:(1) E:允许Flood AS-External-LSAs (2) MC:转发IP组播报文 (3) N/P:处理Type-7 LSAs (4) DC:处理按需链路 |
I | 1比特 | 当发送连续多个DD报文时,如果这是第一个DD报文,则置为1,否则置为0。 |
M (More) | 1比特 | 当发送连续多个DD报文时,如果这是最后一个DD报文,则置为0。否则置为1,表示后面还有其他的DD报文。 |
M/S (Master/Slave) | 1比特 | 当两台OSPF路由器交换DD报文时,首先需要确定双方的主从关系,Router ID大的一方会成为Master。当值为1时表示发送方为Master。 |
DD sequence number | 32比特 | DD报文序列号。主从双方利用序列号来保证DD报文传输的可靠性和完整性。 |
LSA Headers | 可变 | 该DD报文中所包含的LSA的头部信息。 |
(3)OSPF LSR报文格式
两台路由器互相交换过DD报文之后,知道对端的路由器有哪些LSA是本地的LSDB所缺少的和哪些LSA是已经失效的,这时需要发送LSR报文(Link State Request Packet)向对方请求所需的LSA。内容包括所需要的LSA的摘要。LSR报文格式如下图所示,其中LS type、Link State ID和Advertising Router可以唯一标识出一个LSA,当两个LSA一样时,需要根据LSA中的LS sequence number、LS checksum和LS age来判断出所需要LSA的新旧。
字段 | 长度 | 含义 |
---|---|---|
LS type | 32比特 LSA的类型号。 | |
Link State ID | 32比特 | 根据LSA中的LS Type和LSA description在路由域中描述一个LSA。 |
Advertising Router | 32比特 | 产生此LSA的路由器的Router ID。 |
(4)OSPF LUR报文格式
用来向对端Router发送其所需要的LSA或者泛洪自己更新的LSA,内容是多条LSA(全部内容)的集合。LSU报文(Link State Update Packet)在支持组播和广播的链路上是以组播形式将LSA泛洪出去。为了实现Flooding的可靠性传输,需要LSAck报文对其进行确认。对没有收到确认报文的LSA进行重传,重传的LSA是直接发送到邻居的。
字段 | 长度 | 含义 |
---|---|---|
Number of LSAs | 32比特 | LSA的数量。 |
常用的LSA共有5种,分别为:Router-LSA、Network-LSA、Network-summary-LSA、ASBR-summary-LSA和AS-External-LSA。
1)所有的LSA都有相同的报文头:
字段 | 长度 | 含义 |
---|---|---|
LS age | 16比特 | LSA产生后所经过的时间,以秒为单位。无论LSA是在链路上传送,还是保存在LSDB中,其值都会在不停的增长。 |
Options | 8比特 | 可选项:(1) E:允许Flood AS-External-LSAs (2) MC:转发IP组播报文 (3) N/P:处理Type-7 LSAs (4) DC:处理按需链路 |
LS type | 8比特 | LSA的类型:(1) Type1:Router-LSA (2) Type2:Network-LSA (3) Type3:Network-summary-LSA (4) Type4:ASBR-summary-LSA (5) Type5:AS-External-LSA (6) Type7:NSSA-LSA |
Link State ID | 32比特 | 与LSA中的LS Type和LSA description一起在路由域中描述一个LSA。 |
Advertising Router | 32比特 | 产生此LSA的路由器的Router ID。 |
LS sequence number | 32比特</ |