上篇讲到OSPF协议基础,简单总结为 “三表五包七状态”;今天我们来谈谈OSPF协商过程;OSPF协商过程还是围绕OSPF五种数据包和七种状态来细化展开。
状态与包分解
在 中,提到OSPF协议五个包,分别是Hello、DBD、LSR、LSU、LSAck;下面将分析协商过程中七状态如何结合五个包进行整个OSPF建立的协商交互过程。
如上图所示,OSPF启动开始使用Hello报文确定相互连接的邻居是否可以通信,如下图:
PS:OSPF的选路,是通过SPF算法计算出来的,而计算就有个计算方法,具体的计算方法后面张开说明,这里需要说明的是根据链路的开销值(Cost)和协议的优先级来选择路由路径的。
关于带宽参考值说明:
路由选择最优路径是根据开销值在选择,默认是根据接口链路带宽来计算的(可手动设置cost值),如OSPF有个默认带宽参考值100Mbps,而如果实际链路是1G,那么Cost值就是1,计算公式为:接口cost=带宽参考值/接口带宽,取计算结果的整数部分作为接口cost值,cost越小越优先。在这里可以修改链路带宽参考值,现在企业内部网络带宽最少也是千兆链路,可修改带宽为10000Mbps为带宽参考值,如果是千兆链路cost值就是10,万兆链路就是1。
OSPF支持的网络类型
P2P--点到点网络
P2MP--点到多点网络
MA--广播多路访问网络
NBMA--非广播多路访问网络
详细请了解该文章:
OSPF支持的网络类型
上图所示,OSPF 协议启动后,先寻找网络中的邻居( Neighbor ),也就是通过 Hello 报文确认可以双向通信,Hello报文交换,确定邻居关系。
Down 失效状态:这是邻居的初始状态,表示路由器还没有从邻居收到任何信息。
停滞于此状态表明路由器没有从邻居处接收到Hello报文。
Attempt 尝试状态:此状态只在NBMA网络上存在,表示路由器没有收到邻居的任何信息,但是已经周期性地向邻居发送了Hello报文;如果在Router Dead Interval的时间间隔内未收到邻居的Hello报文,则转为Down状态。
停滞于此状态表明路由器向已配置的邻居发送了单播Hello报文,但没有收到该邻居的Hello报文。
Init 初始状态:表示路由器已经从邻居收到了Hello报文,但是自己不在所收到的Hello报文的邻居列表中。这说明自己尚未与邻居建立起双向通信关系。
停滞于此状态表明路由器收到了邻居的Hello报文,但Hello报文中没有包含接收路由器的OSPF RID(Router ID)。
前面三个阶段都是Hello报文的交互作用:下面简单说下Hello报文结构和作用
E:允许Flood
AS-External-LSAs
MC:转发IP组播报文
N/P:处理Type-7 LSAs
DC:处理按需链路
2-Way 双向通信状态:表示路由器与邻居的双向通信关系已经建立(即已经建立起了邻居关系),但是尚未建立起邻接关系。
停滞于此状态表明路由器彼此都收到了对方的Hello报文,并且都从Hello报文中发现了自己的OSPF RID。对于以太网链路上的非DR/BDR路由器来说,这种状态是可以接受的。
可以查看下wireshark抓包下的Hello报文:
综上原理可得Hello报文作用:用于发现邻居和维护邻居关系
PS:在MA网络中,邻居状态在 2-Way 后,会进行 DR 和 BDR 选举。
什么是MA网络?
MA 网络,即多路访问网络,是在同一个共享介质中连接多个设备的网络。网络中的任意两台设备都能直接进行二层通信。MA 网络有两种,一种是 BMA 网络,即广播型多路访问网络,比如以太网,典型场景就是一台以太网交换机连接着多台路由器,如果有一个广播数据发出来,整个网络中的路由器都能收到。另一种是 NBMA 网络,即非广播型多路访问网络,比如帧中继,只是帧中继不支持广播。
在 MA 网络中,n 台路由器都两两建立邻接关系,那么就有 n(n-1)/2 个邻接关系,会消耗大量的路由器资源,增加网络中 LSA 的泛洪数量。为了优化邻接关系数量,减少不必要的协议流量,OSPF 会在每一个 MA 网络中选举一个 DR(指定路由器)和一个 BDR(备用指定路由器)。
既不是 DR 也不是 BDR 的路由器叫做 DROther ,MA网络中所有 DROther 只和 DR 及 BDR 建立 OSPF 邻接关系,BDR 也和 DR 建立邻接关系,DROther 之间只停留在 2-Way 状态。这样,就有 2(n-2) 1 个邻接关系,数量得到优化。
DR 会侦听网络中的拓扑变化信息,并将变更信息通知给其它路由器。BDR 会监控 DR 状态,当 DR 发生故障时就接替它的工作。
DR 、BDR 的选举通过 Hello 报文实现,发生在 2-Way 状态之后。Hello 报文有路由器接口的 DR 优先级,取值范围是 0 ~ 255 ,默认值为 1 ,DR 优先级为 0 的接口没有 DR 和 BDR 的选举资格。
当接口激活 OSPF 后,它会查看网络中是否存在 DR ,如果有就使用已经存在的 DR ,也就是 DR 不可抢占,否则选择最高优先级的路由器成为 DR ,当优先级相等时,选择 Router-ID 最大的路由器成为 DR 。之后还会进行 BDR 的选举,选举过程与 DR 类似。
需要注意的是,DR 和 BDR 是一个接口级别的概念。某台路由器是 DR ,这种说法不准确,严谨的说法是:某台路由器的某个接口在这个 MA 网络中是 DR 。
在一个 MA 网络中,DR 要确保网络中的所有路由器有相同的 LSDB ,也就是确保 LSDB 同步。DR 使用组播地址 224.0.0.5 向网络中发送 LSU 报文,所有 OSPF 路由器都会侦听这个组播地址,并同步自己的 LSDB 。而 DROther 感知到拓扑变化时,向 224.0.0.6 发送 LSU 报文通告这个变化,DR 和 BDR 会侦听这个组播地址。
邻居已经发现,接下来就是ExStart和Exchange的过程,也就是链路状态信息传递过程,在这个过程,邻居之间交互DD报文。
ExStart 信息交换初始状态:邻居状态变成此状态以后,路由器开始向邻居发送DD报文。Master/Slave关系是在此状态下形成的,初始DD序列号也是在此状态下确定的。在此状态下发送的DD报文不包含链路状态描述。
停滞于此状态表明邻居路由器之间的MTU不匹配或OSPF RID重复。
DD报文的主从选择
Exchange 信息交换状态:在此状态下,路由器与邻居之间相互发送包含链路状态信息摘要的DD报文。
停滞于此状态表明邻居路由器之间的MTU不匹配。
路由器进入 Exchange 状态,向邻居发送描述自己 LSDB 的 DD 报文,DD 报文中包含 LSA 头部。DD 报文逐个发送,每个报文中都有 DD 序列号,DD 序列号由 Master 路由器决定,序列号在 DD 报文的交互过程中递增,确保交互过程的有序性和可靠性。
DD 报文用于描述 LSDB ,携带 LSDB 中 LSA 的头部数据,而非完整的 LSA 内容。在路由器邻接关系的建立过程中,先用空的 DD 报文协商 Master/Slave ,然后用 DD 报文描述各自的 LSDB ,这种 DD 报文包含 LSDB 里的 LSA 头部。路由器可以使用多个 DD 报文来描述 LSDB ,为了保证 DD 报文传输的顺序和可靠,Master 路由器使用序列号字段递增的方式,主导整个 LSDB 描述过程。
DD报文结构:
Interface MTU:16位,此接口最大可发出IP报文的长度,华为默认不填充为0。
Options:含义同OSPF报文头一致。
I位:1位,当连续发送多个DD报文时,是第一个DD报文时为1,否则为0。
M位:1位,当连续发送多个DD报文时,后续没有LSA头要传时,则为0。
M/S位:1位,当两台路由器交换DD报文需选举主从,RouterID大的为主,当值位1则为Master。
DDS equence Number:32位,DD报文序列号,主从交互DD利用序列号保证DD报文传输的可靠性和稳定性。
LSA Headers:本地LSDB的头部信息。
DD报文抓包
DD报文作用:用来描述本地LSDB的摘要信息,用于同步数据库
Loading 信息加载状态:在此状态下,路由器与邻居之间相互发送LSR报文、LSU报文、LSAck报文。
停滞于此状态表明可能存在硬件故障或硬件故障或MTU不匹配。
接下来,路由器进入 Loading 状态,路由器向邻居发送 LSR 请求 LSA 的完整信息。邻居使用 LSU 进行回应,LSU 报文里有 LSA 的完整信息。在收到 LSU 报文后,路由器需要发送 LSAck 对 LSA 进行确认。
LSR报文格式:用于向邻居请求完整的LSA。{注意:只会请求自己没有的LSA}
LS type:32位,LSA的类型
Link State ID:32位,根据LSA中的LSA Type和LSA Description在路由域中描述一个LSA。
Advertising Router:32位,产生此LSA的路由器Router ID。
LSA常见的类型:
type-1=Router LSA
type-2=Network LSA
type-3=Network Summary LSA
type-4=ASBR Summary LSA
type-5=AS External LSA
type-6=Group Membership LSA
type-7=NSSA LSA
日常使用的有1、2、3、4、5、7
后续文章讲详细讲解LSA
LSU报文格式:LSU报文包含的是完整的LSA信息,用于回复LSR报文。并且当路由器感知到网络发生变化时也会泛洪LSU。
PS:注意:非DR/BDR路由器的LSU报文是发送给224.0.0.6地址的,而DR收到这个报文后又会把它发送给224.0.0.5[所有的OSPF路由器]。这样就大大的减少的网络开支,有利于网络的优化。
Number of LSAs:32位,表示此Update中包含的LSA数量。
LSAs:多个完整的LSA内容。
LSAck报文格式:
链路状态确认报文,用于确认LSU报文;为了保障每条LSA可达,需要LSAck来对每天收到的LSA进行确认。
LSA Headers:LSA头列表,OSPF通过LSA头对完整的LSA做确认,一份LSA可以对多份LSU中的LSA做确认。
Full 完全邻接状态:表示LSDB同步过程完成,路由器与邻居之间形成了完全的邻接关系。
整个状态变化的报文交互情况:
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved