OSPF基础
- 一、OSPF基础
- 二、OSPF的区域划分
- 三、OSPF的数据包
- hello包
- 数据库描述包DBD包
- 链路状态请求包LSR包
- 链路状态更新包LSU包
- 链路状态确认包LSAck包
- 四、OSPF的状态机
- 五、OSPF的工作过程
- 六、链路状态型的路由生成过程
- 七、条件匹配
- 五、OSPF数据包头部
- 八、OSPF的接口网络类型
一、OSPF基础
OSPF(Open Shortest Path First,开放式最短路径优先)是IEIF定义的一种基于链路状态(LS)的内部网关协议(IGP)目前针对IPV4协议使用的是OSPF Version 2(RFC2328);针对IPv6协议使用OSPF Version 3(RFC2740).
- 基于SPF算法,以”累计链路开销“作为选路参考值
- 采用组播的形式收发部分协议报文
- 支持区域划分
- 支持对等价路由进行负载分担
- 支持报文认证
二、OSPF的区域划分
- OSPF为了适应中大型的网络环境,需要进行结构化部署 — 区域划分
- 我们把只有一个区域的OSPF网络成为单区域OSPF网络
我们把存在多个区域的OSPF网络成为多区域OSPF网络
- 区域划分的目的:
-
- 区域内部传递拓扑信息,区域之间传递路由信息
-
- 链路状态型协议的距离矢量特征
- 区域边界路由器 — ABR
-
- 同时属于多个区域,一个接口对应一个区域,且至少有一个接口属于区域0(骨干区域)
-
- 区域间可以存在多个ABR,一个ABR也可以对应多个区域
- 区域划分的要求:
-
- 1、区域之间必须存在ABR
-
- 2、区域划分必须按照星型拓扑结构划分 — 星型结构中间区域 — 骨干区域
- 为了方便管理,我们给每个区域增加一个ID作为标识
-
- 区域ID — area ID由32位2进制构成
-
-
- 表示方法有两种
-
-
-
-
- 十进制表达
-
-
-
-
-
- 点分十进制表达
-
-
-
- 骨干区域的area ID为0。
三、OSPF的数据包
- hello报文:(Hello Packet)
-
- 用来周期保活的,发现,建立,周期保活邻居关系。(更新量很小,打个招呼。通过组播发出去的)
-
- HELLO包设计的是默认10S发送一个
- 既然是保活,如果对面不回包,我们也会设置一个计时器来判断他是否还存在。这个计时器叫DEAD TIME。这个时间是4倍的hello time的时间,也就是默认40s。
- RID — 为了标识网络中的每一个路由器
-
- 要求:
-
-
- 全网唯一
-
-
-
- 格式统一 — 都按照IP地址格式
-
-
- 配置方法
-
-
- 手工配置,只要满足两点要求即可
-
-
-
- 自动配置
-
-
-
-
- 默认的就是优先在环回中选最大的IP(这里的最大就是单纯的IP数值最大),要是没有环回就选择接口IP中最大的。
- 默认的就是优先在环回中选最大的IP(这里的最大就是单纯的IP数值最大),要是没有环回就选择接口IP中最大的。
-
-
hello包
hello包用于周期发现、建立和保活邻居关系。当路由器启动ospf进程后,默认每10秒(hello时间,可以修改)发送一个hello包,hello中携带自己的RID和已知邻居的RID,当路由器收到的hello包中包含自己的RID,建立邻居关系。建立邻居关系之后通过hello包告诉邻居我还在,即保活作用。如果过了40秒(dead-time 4倍的hello时间)任没有收到邻居的hello包,即认为该邻居消失。
注:RID:因为ospf传递的是拓扑信息,需要一个参数对所有路由器进行区分和标定,所以ospf引入RID来完成这个工作,RID在ospf网路内具有唯一性,且由32位二进制构成,采用IP地址的格式。RID可以手工配置或自动获取,如果是自动获取,设备将会在自己环回接口的IP地址中选择最大的作为自己的RID。如果没有环回接口,则将在自己的物理接口上选择IP地址最大的作为RID。
数据库描述包DBD包
DBD报文(Database Description Packet)
- 数据库描述报文
- 里面携带的是路径信息的摘要(为了减少更新量,不会直接给邻居发TOPO,会把TOPO先做个目录,让邻居看看有哪些没有的。这个目录就是DBD数据库描述表)
- 免重复更新,减少更新量的一个做法
由于ospf传递的拓扑信息庞大,所以ospf在互相传递LSA时,先将本地lsa信息的目录传给对方,对方在根据目录选择自己没有的LSA信息,这个目录信息就是DBD包。
链路状态请求包LSR包
LSR报文:(Link-state Request Packet)
- 链路状态请求报文
- 请求获取链路信息
- 基于未知的LSA信息查询。LSA叫做链路状态通告,简单理解就是链路状态信息的主要载体。
通过DBD包获取邻居的lsa信息目录后,将收到的lsa信息目录和本地数据库进行对比,然后通过LSR包向邻居请求本地所没有的lsa信息
链路状态更新包LSU包
- LSU报文:(Link-state Update Packet)
- 链路状态更新报文
- 携带LSA信息的数据包。(真正提供更新的数据包)
收到邻居的LSR包后,通过LSU包将lsa信息传递给邻居,是真正携带LSA信息的数据包。
链路状态确认包LSAck包
- LSack报文:(Link-state Acknowledgement Packet)
- 链路状态确认报文
- 确认包
收到LSU包需恢复LSAck包确认收到。
四、OSPF的状态机
- TWO-WAY — 双向通讯 — 标志这邻居关系的建立
- 条件匹配 — 条件匹配成功,则进入下一个阶段;条件匹配失败,则i仅维持邻居关系,10s一次通过hello包保活。
- 通过不携带数据的DBD包(为了和之前的邻居关系进行划分)进行主从关系选举,RID大的为主,优先进入下一个状态。
- LSDB — 链路状态信息数据库
- FULL状态 — 标志这邻接关系的建立 — 只有邻接关系之间可以交换LSA信息,而邻居关系仅使用hello包进行保活。
状态机总结:
- down — 一旦启动OSPF协议,发出hello包,进入下一个状态
- init(初始化) — 收到hello包钟存在本地的RID,进入下一个状态
- 2 - way(双向通信) — 邻居关系尽力的标志
- (进行条件匹配,匹配成功进入下一个阶段,匹配不成功停留在邻居状态)
- exstart(预启动) — 使用未携带信息的DBD包进行主从关系的选举,RID大的为主,优先进入下一个阶段;
- exchenge(准交换) — 使用携带目录信息的DBD包进行目录共享,需要ACK确认。
- loading(加载) — 查看完对端的DBD信息后,基于本地未知的信息,使用LSR来到邻居处查询,邻居使用LSU将信息回复。需要ACK确认。
- FULL(转发) — 交换完成后进入的章台,标志着邻接关系的建立。
五、OSPF的工作过程
- 启动配置完成后,OSPF将向本地所有运行协议的接口组播224.0.0.5发出hello包;hello包中携带本地的RID以及本地已知邻居的RID;(通过接收其他邻居的hello包来获取本地邻居,建立邻居关系);之后会生成一张表叫邻居表
- 邻居关系建立后,进行条件匹配;匹配失败将停留于邻居关系,仅hello包保活即可;
- 匹配成功的邻居将可以i建立邻接关系。首先使用未携带数据的DBD包进行主从关系选举;之后使用携带信息的DBD包来共享数据库目录;之后本地使用LSR/LSU/LSACK来获取未知的LSA信息(链路状态通告);完成本地数据库的建立。(LSDB — 链路状态数据库) — 生成数据库表
- 之后本地基于数据库生成有向图和最短路径树,之后计算本地到达拓扑中所有未知网段的最短路径,然后将其添加到路由表中。
- 收敛完成,hello包周期保活。每30分进行一次周期更新
- 结构突变:
-
- 1、新增网段
-
- 直连新增网段的设备,直接使用更新包告知邻接关系接口;需要ack
-
- 2、断开网段
-
- 直连断开网段的设备,直接使用更新包告知邻接关系接口;需要ack
-
- 3、无法沟通
-
- hello time 10s,dead time 40s;超时断邻,删除信息。
六、链路状态型的路由生成过程
1、运行链路状态路由信息的路由器之间首先会建立一个协议的邻居关系,然后彼此之间开始交互LSA(Link State Advertisement,链路状态通告)。
- 不再通告路由i信息,而是LSA。
- LSA描述了路由器接口的状态信息,例如接口的开销,连接的对象等。
2、每台路由器都会产生LSA,路由器将接收到的LSA放入自己的LSDB(Link State DataBase,链路状态数据库)。路由器通过LSDB,掌握了全网的拓扑。
- 路由器将LSA存放在LSDB中
- LSDB汇总了网络中路由器对于自己接口的描述
- LSDB包含全网拓扑的描述
3、每台路由器基于LSDB,使用SPF(Shortest Path First,最短路径优先)算法进行计算,每台路由器都计算出一颗以自己为根的、无环的、拥有最短路径的“树”。有了这棵”树“,路由器就已经知道了到达网络各个角落的优选路径。
4、最后,路由器将计算出来的优选路径,加载进自己的路由表(Routing Table)。
四步:
七、条件匹配
指定路由器 — DR
备份指定路由器 — BDR
- 条件匹配:在MA网络中,若所有的设备都建立邻接关系,则将出现大量的重复更新;故需要进行DR与BDR的选举,所有非DR/BDR设备之间保持邻居关系即可。DR/BDR和其他设备之间建立邻接关系。
-
注意两点:
-
- 在一个MA网络中,DR与BDR都存在的情况下,至少需要4台路由器才能看到邻居关系
-
- DR/BDR实际是一个接口的概念。
-
DR/BDR的选举:
-
选举规则:
-
1、先比较优先级。优先级最大的为DR,优先级次大的为BDR。
优先级的取值方位是0-255,优先级的默认值是1.
优先级
若一个接口的优先级设置为0,则代表该接口放弃DR/BDR选举。 -
若优先级相同,则比较RID,RID大的路由器对应的接口为DR,次大的为BDR。
选举模式:
- 非抢占模式
- 即一旦选举成功,不因为新加入的设备而重新选举
- DR/BDR的选举时间为40s
- 若选举完成,需要重新选举DR/BDR则需要重启OSPF进程
- reset ospf 1 process — 重启OSPF进程,可以重新进行DR/BDR的选举
五、OSPF数据包头部
OSPF头部指的是所有五种OSPF数据包都包含的公共参数部分。头部长度为24个字节。
- 版本(Version):对于OSPFv2,该字段值恒为2。
- 类型(Type):该OSPF报文的类型。该字段的值与报文类型的对应关系是:
1-Hello;2-DD;3-LSR;4-LSU;5-LSAck。 - 报文长度(Packet Length):整个OSPF报文的长度(字节数)。路由器ID(Router Identification):路由器的OSPF Router-ID。
- 区域ID(Area Identification):该报文所属区域ID,这是一个32bit的数值。校验和(Checksum):用于校验报文有效性的字段。
- 认证类型(Authentication Type):指示该报文使用的认证类型。
- 认证数据(Authentication Data):用于报文认证的内容。
HELLO — 周期性发现,建立,保活邻居关系。DR/BDR选举。
网络掩码 — 发出该数据包接口所配置的IP地址掩码信息。 — 华为体系中这个参数邻居双方所携带的值不一致将无法正常建立邻居关系。 — 这个限制条件仅针对MA网络,P2P网络不受限制。
hello时间,死亡时间
— 如果邻居双方这两时间参数不同,则将限制邻居关系的建立。
可选项 — 8位 — 每一位代表路由器遵从某个OSPF特性 — OSPF特殊区域的标记在其中,如果邻居双方特殊区域的标记不一致,则将限制邻居关系的建立。
路由器的优先级 — 发出hello包接口所配置的DR/BDR选举的优先级
DR/BDR
— 网络中DR和BDR所对应接口的IP地址。在没有选出DR和BDR之前,将使用0.0.0.0进行填充。
Hello包中限制邻居关系建立的因素:
- 1,网络掩码
- 2,hello时间
- 3,dead time
- 4,OSPF特殊区域的标记
- 5,认证
网络掩码(Network Mask):一旦路由器的某个接口激活了OSPF,该接口即开始发送Hello报文,该字段填充的是该接口的网络掩码。两台OSPF 路由器如果通过以太网接口直连,那么双方的直连接口必须配置相同的网络掩码,如果一方在接口上收到的Hello报文中“网络掩码”字段与本地接口不同,则忽略该Hello报文,此时邻居关系无法正确建立。
Hello间隔(Hello lnterval):接口周期性发送Hello报文的时间间隔(单位为s)。两台直连路由器要建立OSPF邻居关系,需确保接口的Hello lnterval相同,否则邻居关系无法正常建立。缺省情况下,OSPF路由器在P2P或Broadcast类型的接口上的 Hello间隔为10s,在NBMA及P2MP类型的接口上的Hello间隔为30s.
可选项(Options):该字段一共8bit,每个比特位都用于指示该路由器的某个特定的OSPF 特性。路由器通过设置相应的Options比特位来通告自己支持某种特性或者拥有某种能力。OSPF 邻接关系建立过程中,Options字段中的某些比特位会被检查,这有可能会直接影响到OSPF邻接关系的建立。 (特殊区域的标记)
路由器优先级(Router Priority:路由器优先级,也叫DR优先级,该字段用于DR、BDR 的选举。在华为的数通产品上,缺省时OSPF接口的DR优先级为1,这个值是可以通过命令修改的。OSPF在多路访问网络(MA)中会进行DR(Designated Router,指定路由器)和BDR(Backup Designated Router,备用指定路由器)选举,而该字段的值将对选举结果产生影响
路由器失效时间(Router Dead nterval):在邻居路由器被视为无效前,需等待收到对方Hello报文的时间(单位为s)。两台直连路由器要建立OSPF 邻居关系,需确保双方直连接口的Router Dead lnterval相同,否则邻居关系无法正常建立。缺省情况下,OSPF路由器接口的Router Dead nterval为该接口的Hello lnterval的4倍
指定路由器(Designated Router):网络中DR的接口IP地址。如果该字段值为0.0.0.0,则表示没有DR,或者DR尚未选举出来。
备份指定路由器(Backup Designated Router):网络中 BDR的接口IP地址。如果该字段值为0.0.0.0,则表示网络中没有BDR,或者BDR尚未选举出来。
邻居(Neighbor)。在直连链路上发现的有效邻居,此处填充的是邻居的Router-iD,如果发现了多个邻居,则包含多个邻居字段。
DBD包
— 数据库描述报文
- 1,使用未携带数据的DBD包进行主从关系选举;
- 2,使用携带数据的DBD包进行目录共享;
DBD包还存在第三种形态,即仅完成确认的确认包状态。
MTU
— 设备默认没有开启接口MTU值的检测,所以将携带0。
[r1-Serial4/0/0]ospf mtu-enable
— 如果邻居双方都开启了MTU值的检测,但是,双方携带的MTU值不同,则邻居状态将停留在Exstart
状态。
I
— init
— 如果这个标记位置1,则这个DBD包是进行主从关系选举的数据包。
M
— MORE
— 该位置1,则代表后面还有更多的DBD包。
MS
— Master
— 该位置1,则代表发送该数据包的路由器为主。 — 在主从关系选举出来之前,双方都将认为自己是主,所以,都会将字节的MS置1;当主从关系选举结束后,将只有主会置1,从置0。
DBD序列号
— 在DBD报文交互中,会逐次加1,用于确保DBD包传输的有序性及可靠性。
接口最大传输单元(interface Maximum Transmission Unit):接口的MTL。以华为AR2200路由器为例,缺省时授口发送的DD报文中,无论该接口实际的MTU值是多少,i该字段的值都为0.
可选项(Options):路由器支持的OSPF可选项
I位(lnitial Bit):也即初始化位,当该DD报文用于协商Master/Slave路由器时,该比特位被置1,Master/Slave选举完成后,该比特位被置0
M位(More Bit);该比特位如果设置为1,则表示后续还有更多的DD报文;如果被设置为0,则表示这是最后一个DD报文。
MS位(Master Bit):Master路由器在自己发送的DD报文中将该比特位设置为1,slave路由器贝修其设置为0.
DD序列号(DDSequence Number):DD报文的序列号,在DD报文交互的过程中,DD序列号被逐次加1,用于确保DD报文传输的有序和可靠性。值得注意的是,DD序列号必须是由Master路由器来决定的,而Slave路由器只能使用Master路由器发送的DD序列号来发送自己的DD报文。** (这个做法就是隐性确认,通过对方发送的数据包中的序列号,起到确认的效果。DBD包的主从关系选举就是为了完成隐性确认的)**
- Master/Slave确定后,双方就开始使用DD报文描述各自的LSDB在这种DD报文中包含着LSDB里的LSA的头部。路由器可以使用多个DD报文来描述LSDB,为了确保DD报文传输的有序和可靠,“DD序列号(DDSequence Number"字段就是关键。在OSPF路由器双方交与DD报文的过程中,Master路由器发送DD报文给对端,对端的Slave路由器在发送自己的DD报文时需在该报文的“DD序列号”字段中使用前者的序列号,也就是Master路由器主导整个LSDB描述过程。假设Master路由器发送一个DD序列号为1111的DD报文,则 slave路由器在收到这个DD报文后开始发送自己的DD报文,而且DD序列号使用1111,而它在准备再次发送DD报文之前,必须先收到Master路由器发送的下一个DD报文(DD序列号为1112)。这个过程会一直持续,直到LSDB描述完。
LSA头部(LSA Header):当路由器使用DD报文来描述自己的LSDB时,LSA的头部信息被包含在此处。一个DD报文可能包含一条或多条LSA的头部。
LSR
— 链路状态请求报文 — 基于DBD包请求未知的LSA信息。
链路状态类型,链路状态ID,通告路由器 — LSA
三元组 — 这三个参数可以唯一的标识出来一条LSA信息。
LSU包
— 链路状态更新报文 — 真正携带LSA信息的数据包
路由器收到邻居发送过来的LSR后,会以LSU报文进行回应,在LSU报文中就包含了对方请求的LSA的完整信息,一个LSU报文可以包含多个LSA。另外,当路由器感知到网络发生变化时,也可以触发LSU报文的泛洪,以便将该变化通知给网络中的其他OSPF 路由器。在多路访问网络中,非 DR、BDR路由器向224.0.0.6这个组播地址发送LSU报文,而DR及BDR会侦听这个组播地址,DR在接收LSU报文后向224.0.0.5发送LSU报文,从而将更新信息泛洪到整个OSPF区域,所有的OSPF 路由器都会侦听224.0.0.5这个组播地址。
LSACK
— 链路状态确认报文 — 确认包
为了确保LSA 能够可靠送达,当一台路由器收到邻居发送过来的LSU报文时,需要对报文中包合的 LSA进行比对,心训后个ISA斗部的长度为20byte)。图3-9展报文中包含着路由器所确认的LSA的头部(每个LSA头部的长度为20byte)。
八、OSPF的接口网络类型
OSPF的许多功能或特性都是基于接口实现的,当一个按口派泊代RN民矶表、会维护许多OSPF变重,例如只从汝八rTrne)也是其中之一,而且是一个非常重要的认证类型等,接口的网络类型(Network-Type) 也是其中之一,而且是一个非常重要的变量。OSPF 接口的网络类型与该接口采用的数据链路层封装有关,在不同网络类型的接口上OSPE的操作有所不同。
OSPF的接口网络类型:
P2P
MA
BMA
NBMA
OSPF接口网络类型 — 指的是OSPF接口在不同的网络类型默认下的不同工作方式。
[r2]display ospf interface GigabitEthernet 0/0/0
— 查看OSPF接口工作方式
在华为体系中,将环回接口在OSPF中的开销值定义为0,不会受到外界变化的影响。(修改参考带宽不会影响该值。)
[r2-LoopBack0]ospf network-type broadcast
— 修改OSPF接口网络类型
华为体系将tunnel接口的传输速率定义为64K,实际上虚拟接口不存在传输速率。这样设定的目的是为了让隧道接口的开销值变的很大,导致在存在其他路径时,尽可能的避免走隧道接口,因为隧道接口需要进行复杂的封装和解封装过程,导致效率降低。
全连的MGRE环境 — MESH
— 所有节点即使中心,也是分支。
[r1-ospf-1]peer 12.0.0.2
— 指定单播邻居 — 一定需要双向指定。
Attempt
— 尝试 — 过度状态,只有在需要手工指定邻居关系的状态下出现,在指定对方后等待对方指定时将处于该状态,一旦对方指定,则将进行后续状态。
- 1、点对点美型(Point-to-Point.P2P)
点到点网络指的是在一段链路上只能连接两台路由器的环境。一个典型的例子是PPP链路,当两台路由器通过PPP链路直连时,设备接口上采用的封装协议就是PPP,当这个接口激活OSPF后,OSPF会自动根据该接口的数据链路层封装将其网络类型设置为P2P。另外,当接口采用HDLC 封装时,其OSPF 网络类型缺省也为P2P。OSPF在网络类型为P2P的接口上以组播的方式(相应的组播P地址为224.0.0.5)发送协议报文(Hello报文、DD报文、LSR报文、LSU报文以及LSAck报文)。缺省情况下,P2P类型的接口以10s 为间隔周期性地发送Hello报文
OSPF在P2P类型的网络中不会选举DR及BDR。 - 2.广播型多路访问类型(Broadcast Multi-AccessBMA)
BMA(或者称为 Broadcast)是一个支持广播的网络环境,该网络允许多台路由器接入,任意两台路由器之间都能直接进行二层通信,一台路由器发送出去的广播数据会被所有其他的路由器收到。以太网(Ethernet)是典型的广播型多路访问网络。
OSPF在BMA类型的接口上通常以组播的方式发送Hello报文、LSU报文及LSAck报文,以单播的形式发送DD报文及LSR报文。当使用组播的方式发送协议报文时,有两个组播地址可能会被使用到–224.0.0.5及224.0,0.6当路由器需要向DR以及BDR发送OSPF 报文时,使用224,0,0.6这个组地址作为报文的目的P地址;当需要向所有的OSPF路由器发送报文时,使用224.0.0.5。缺省情况下,Broadcast类型的接口以10s为间喝周期性地发送Hello报文。 - 3.非广播型多路访问类型(Non-Broadcast Multi-Access,NBMA)
NBMA 网络也允许多台路由器接入,但是该网络不具备广播能力,正因为如此,基于组播发送的Hello报文在NBMA网络中可能就会遇到问题。在这种场景中,为了让OSPF路由器之间能够顺利地发现彼此并且正确地建立邻接关系,还需要进一步的配置,例如使用单播的方式来发送OSPF报文等。NBMA网络的一个最为大家熟知的代表是帧中继(Frame-Relay),另一个例子是X25。OSPF在NBMA网络中,也会进行DR及BDR的选举缺省情况下,NBMA类型的接口以30s为间隔周期性地发送Hello报文。 - 4、点对多点类型(Point-to-Multipoint,P2MP)
与前面介绍的几种网络类型不同,P2MP并非路由器根据接口的数据链路层封装自动设置的,而是必须通过网络管理员手工指定的。P2MP有点类似于将多条P2P链路的一端进行绑得到的网络。在P2MP网络中无需选举DR、BDR。OSPF在P2MP类型的接口上通常以组播的方式发送Hello报文,以单播的方式发送其他报文缺省情况下,Hel1o报立的发送间隔为30s。
注意:两个路由器的直连接口即使网络类型不匹配,也能够建立起OSPF邻接关系,但是OSPF路由的计算却是极有可能出现问题的,这是因为接口的网络类型会影响到路由器产生的LSA中对该接口的描述,而这将关系到路由器对网络拓扑的理解以及路由的计算。因此,OSPF邻居的互联接口网络类型必须一致