一剑开天门系列-OSPF协商过程

一剑开天门系列-OSPF协商过程

首页休闲益智一剑开天门正版更新时间:2024-10-09

上篇讲到OSPF协议基础,简单总结为 “三表五包七状态”;今天我们来谈谈OSPF协商过程;OSPF协商过程还是围绕OSPF五种数据包和七种状态来细化展开。


状态与包分解


在 中,提到OSPF协议五个包,分别是Hello、DBDLSR、LSULSAck;下面将分析协商过程中七状态如何结合五个包进行整个OSPF建立的协商交互过程。




如上图所示,OSPF启动开始使用Hello报文确定相互连接的邻居是否可以通信,如下图:

PS:OSPF的选路,是通过SPF算法计算出来的,而计算就有个计算方法,具体的计算方法后面张开说明,这里需要说明的是根据链路的开销值(Cost)和协议的优先级来选择路由路径的。


关于带宽参考值说明:

路由选择最优路径是根据开销值在选择,默认是根据接口链路带宽来计算的(可手动设置cost值),如OSPF有个默认带宽参考值100Mbps,而如果实际链路是1G,那么Cost值就是1,计算公式为:接口cost=带宽参考值/接口带宽,取计算结果的整数部分作为接口cost值,cost越小越优先。在这里可以修改链路带宽参考值,现在企业内部网络带宽最少也是千兆链路,可修改带宽为10000Mbps为带宽参考值,如果是千兆链路cost值就是10,万兆链路就是1。


OSPF支持的网络类型


详细请了解该文章:

OSPF支持的网络类型




上图所示,OSPF 协议启动后,先寻找网络中的邻居( Neighbor ),也就是通过 Hello 报文确认可以双向通信,Hello报文交换,确定邻居关系。

Down 失效状态这是邻居的初始状态,表示路由器还没有从邻居收到任何信息。


Attempt 尝试状态此状态只在NBMA网络上存在,表示路由器没有收到邻居的任何信息,但是已经周期性地向邻居发送了Hello报文;如果在Router Dead Interval的时间间隔内未收到邻居的Hello报文,则转为Down状态。


Init 初始状态表示路由器已经从邻居收到了Hello报文,但是自己不在所收到的Hello报文的邻居列表中。这说明自己尚未与邻居建立起双向通信关系。


前面三个阶段都是Hello报文的交互作用:下面简单说下Hello报文结构和作用



字段长度含义Network Mask32比特发送Hello报文的接口所在网络的掩码。HelloInterval16比特发送Hello报文的时间间隔。Options8比特可选项:Rtr Pri8比特DR优先级。默认为1。如果设置为0,则路由器不能参与DR或BDR的选举。RouterDeadInterval32比特失效时间。如果在此时间内未收到邻居发来的Hello报文,则认为邻居失效。Designated Router32比特MA网络中DR的接口地址。若不存在则为0.0.0.0Backup Designated Router32比特MA网络中BDR的接口地址。若不存在则为0.0.0.0Neighbor32比特邻居,以Router ID标识。


2-Way 双向通信状态:表示路由器与邻居的双向通信关系已经建立(即已经建立起了邻居关系),但是尚未建立起邻接关系。


可以查看下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报文不包含链路状态描述。


DD报文的主从选择



Exchange 信息交换状态在此状态下,路由器与邻居之间相互发送包含链路状态信息摘要的DD报文。


路由器进入 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报文结构:


  1. Interface MTU:16位,此接口最大可发出IP报文的长度,华为默认不填充为0。

  2. Options:含义同OSPF报文头一致。

  3. I位:1位,当连续发送多个DD报文时,是第一个DD报文时为1,否则为0。

  4. M位:1位,当连续发送多个DD报文时,后续没有LSA头要传时,则为0。

  5. M/S位:1位,当两台路由器交换DD报文需选举主从,RouterID大的为主,当值位1则为Master。

  6. DDS equence Number:32位,DD报文序列号,主从交互DD利用序列号保证DD报文传输的可靠性和稳定性。

  7. LSA Headers:本地LSDB的头部信息。


DD报文抓包

DD报文作用:用来描述本地LSDB的摘要信息,用于同步数据库


Loading 信息加载状态:在此状态下,路由器与邻居之间相互发送LSR报文、LSU报文、LSAck报文。


接下来,路由器进入 Loading 状态,路由器向邻居发送 LSR 请求 LSA 的完整信息。邻居使用 LSU 进行回应,LSU 报文里有 LSA 的完整信息。在收到 LSU 报文后,路由器需要发送 LSAck 对 LSA 进行确认。


LSR报文格式:用于向邻居请求完整的LSA。{注意:只会请求自己没有的LSA}



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路由器]。这样就大大的减少的网络开支,有利于网络的优化。



LSAck报文格式:

链路状态确认报文,用于确认LSU报文;为了保障每条LSA可达,需要LSAck来对每天收到的LSA进行确认。


LSA Headers:LSA头列表,OSPF通过LSA头对完整的LSA做确认,一份LSA可以对多份LSU中的LSA做确认。



Full 完全邻接状态:表示LSDB同步过程完成,路由器与邻居之间形成了完全的邻接关系。


整个状态变化的报文交互情况:


查看全文
大家还看了
也许喜欢
更多游戏

Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved