OSPF-开放最短路径优先协议-ipv4
ospf 产生背景及定义
由于rip 协议存在存在着收敛慢、路由环路、可扩展性差,跳数受限等问题。IETF组织开发了ospf(Open Shortest Path First,开放最短路径优先),ospf 是一个基于链路状态的内部网关协议(Interior Gateway Protoco),分为两个版本,针对ipv4 协议使用的是ospf v2,针对ipv6 协议的使用的是ospf v3,以下是关于ospf v2 的一个介绍。
ospf 协议中涉及概念
AS(Autonomous System)
自治系统(AS)是指一组由同一组织管理的网络,这些网络在逻辑上被视为单个单元,并被分配唯一的ID,在一个自治系统内部,运行同一种协议;
LSA
- ospf 在形成邻接关系之间的邻居路由器之间发送链路状态通告(Link State Advertisement),包含了路由器当前邻居路由信息,直连接口信息,不同区域信息;
LSA 头部
LSA 头部 使用在DD 数据库描述包和LSU链路状态确认数据包中;
12.jpg字段
- 老化时间(Link-State Age): 是指自从发出 LSA后所经历的时间(单位:s);路由器生成 LSA 时,这个值为 0 ,随着 LSA 在网络中传输,老化时间逐渐累加。当 路由器 LSDB 中已经有了该条LSA 后,LSA 的老化时间也在递增,当到达 MaxAge(最大老化时间)时,这个 LSA 不在用于路由计算;
- 类型(Type): LSA类型;
- 链路状态 ID(Link-State ID): 每种LSA 类型对应不同的描述;
- 通告路由器(Advertising Router):发出这条 LSA 的路由器的 Router-ID;
- 序列号(Link-State Sequence Number): LSA序列号,判断LSA的新老;
- 长度(Length):LSA 的总字节长度;
LSA 类型
Router-LSA(Type1)
- 在本区域中,向DR通告自己的直连接口的状态和Cost 值,在所属的区域内进行扩散,注意的是,Router-LSA 将主机路由作为末梢网络进行通告;
13.jpg
- 链路状态 ID(Link-State ID): 始发路由器的路由器ID;
- V 位( Virtual Link Endpoint Bit):如果值为 1 ,表示路由器是 Virtual Link 的端点。
- E 位(External Bit):如果值为 1 ,表示路由器是 ASBR ;
- B 位(Border Bit):如果值为 1 ,表示路由器是两个区域的边界路由器。一个路由器连接两个或两个以上的区域,生成的 Type-1 LSA 的 B 位值为 1;
- 链路数量(Links Number):表示 Type-1 LSA 的 Link 数量;Link 是描述直连接口的,每条 Link 都包含 链路类型 、 链路 ID 、链路数量 、度量值 这些关键信息;
- 链路类型(Link Type):表示 Link 的类型,OSPF 中有多种网络类型:P2P 、P2MP 、Broadcast 、NBMA ,可以根据接口的协议来判断接口的网络类型。链路类型不同,对应的链路 ID 、链路数据也不同;
- 链路ID(Link ID):标识链路连接的对象;
- 链路数据(Link Data):不同的链路类型对应的链路数据内容不同;
- 度量值(Metric):Cost 值;
通过在AR8 0/0/0 接口抓包,通告的LS update 报文如下:
18.jpgNetwork-LSA(Type2)
- 在多路访问的网络中,虽然Dother 已经将Type1 类型报文发给DR,但是这些Dother路由器之间并不会建立邻居关系,根本不知道去往对方怎么走,所以还需要DR(Designated Router)将自己本身的全量数据库链路信息发布出来;
-
在该网络中,DR 会生成 Type-2 LSA ,在区域内泛洪 Type-2 LSA ,会列出 多址网络中所有路由器的 Router-ID ,包括 DR 本身,和这个网络的掩码,并且在所属的区域内传播;
19.jpg - 链路状态 ID(Link-State ID): DR路由器的接口ip 地址;
-
相连路由器(Attached Router): 所有与DR 形成邻接关系的路由器的路由器ID, 包括DR路由器本身的路由器id;
在上述网络拓扑中,AR10是DR,在AR10的0/0/0 接口处抓包:
20.jpg
Network-summary-LSA(Type3)
-
现在,经过Type-1 和Type-2 两种LSA,一个区域的Dother 路由器已经完全知道本区域完整的网络拓扑信息,但是如何到达其他区域呢,这就需要Type3 LSA,用来解决区域间路由传递问题,需要由ABR产生,把区域外部的路由通告进来,包括默认路由;
23.jpg - 链路状态 ID(Link-State ID): 通告的网络或子网的ip 地址;
- 网络掩码(Network Mask):通告的网络掩码或子网地址;
如图,红色的为area1区域,蓝色的为area 0 区域;
21.jpgAR8 作为ABR,将自己的到达AR9,AR10 的网络以及自己的网络全部通告给area1 区域;
通过在AR8 的0/0/1 接口上抓包:
ASBR-summary-LSA(Type4)
- 通过Type1,Type2 这两种类型报文,解决了区域内路由的传递问题,通过Type3 类型报文,解决了不同区域之间路由通信问题;这些区域都属于运行同一种ospf 协议的自治系统,那其他自治系统运行的不同协议路由(比如:rip),应该需要怎么引入才能访问外部的自治系统呢?
- 这就需要Type5类型报文, 由ASBR产生,它可以描述到达外部系统的路由,然后可以在所有ospf区域内泛洪,这样,所有区域路由器都有了外部路由信息,跟ASBR 在一个区域的路由器知道ASBR位置,能确定如何到达外部系统,但是跟ASBR不在一个区域的路由器,并不知道如何到达ASBR,所以,其他区域还得需要知道ASBR位置,由Type4 类型报文产生,由ABR描述到ASBR的路由,通告给除ASBR所在区域的单个区域,这样其他区域就知道了ASBR 位置;
- Type 4类型报文跟Type3一样,区别:
1.链路状态 ID( Link-State ID ): 通告的ASBR路由器的路由器id;
2.网络掩码(Network Mask):没实际意义,设置为0.0.0.0; - 如图所示,AR12 是ASBR,它会生成Type5的报文描述外部路由,然后在所有区域泛洪,AR10 跟AR12 直连,属于同一个区域的ABR,它会描述到达ASBR的路由,然后泛洪到Area0,AR8 收到这条路由后,将Type4报文传递给AR11,至此,跟ASBR不在同一区域的其他区域路由器都知道了ASBR位置,就可以访问其他AS ;
AS-external-LSA(Type5)
-
由ASBR产生,描述到AS外部的路由,通告到所有的非末梢区域;
25.jpg - 链路状态 ID(Link-State ID):外部路由的目的网络地址;
- 网络掩码(Netmask):外部路由的目的网络掩码;
- E 位 :用来表示外部路由使用的度量值类型,OSPF 有两种外部路由度量值类型,分别是 Metric-Type-1 和 Metric-Type-2 。如果值为 0 ,表示外部路由使用的度量值类型是 Metric-Type-1 ;如果值为 1 ,表示外部路由使用的度量值类型是 Metric-Type-2;
度量值(Metric):表示外部路由的 Cost ; - 转发地址(Forwarding Address ,FA ):到达所通告的目的地数据包应该被转发到的地址;当 FA 为 0.0.0.0 时,那么到达这个外部网段的流量会发送到引入外部路由的 ASBR ;
- 外部路由标记(External Route Tag):外部路由才能携带的标记,路由策略使用;
NSSA LSA(Type7)
- Type-7 LSA 就是非完全末梢区域外部 LSA( Not-So-Stubby Area External LSA ),NSSA 禁止 Area0 的 Type-5 LSA 进入,让区域内泛洪的 LSA 减少了一点,也减小了 NSSA 中路由器内存占用,NSSA 允许自己区域内的路由器引入少量外部路由,这些外部路由引入后,使用 Type-7 LSA 描述,而且 Type-7 LSA 只能在这个 NSSA 内泛洪,不允许进入 Area0 。NSSA 的 ABR 会将 NSSA 内泛洪的 Type-7 LSA 转换成 Type-5 LSA ,让这些外部路由能够在 OSPF 域内传播;
- 如下图:AR10-AR12 之间为NSSA区域,AR12 产生Type7 的报文,描述外部路由信息:
1.链路状态id:10.0.0.0
2.网络掩码:255.0.0.0
3.通告路由器:10.0.5.5
4.转发地址:10.0.0.5 -
AR10 会将NSSA LSA 转化为Type 5 报文,在Area0内泛洪,Type5 报文如下:
1.链路状态id:10.0.0.0
2.网络掩码:255.0.0.0
3.通告路由器:10.0.1.1
4.转发地址:10.0.0.5
31.jpg
26.jpg
网络类型
点到点网络
- 单独连接一对路由器,有效邻居可以形成邻接关系;
广播型网络
- 可以连接多个设备,例如:以太网;
非广播多路访问网络
- 可以连接多个设备,但是没有广播数据包能力;
点到多点网络
- 一群点到点链路聚合,不需要选举DR ,BDR ,以单播形式发送包;
虚链路
- 没有编号的点到点网络配置,以单播形式发送包;
区域
区域产生背景及意义
- ospf使用多个数据库和复杂算法,耗费路由器更多的内存和CPU, 当网络增大时,容易到达路由器性能极限, 另一方面,LSA 泛洪扩散大量数据链路带来负担;
- 利用区域来缩小这些不利的影响,区域是一组逻辑上的ospf 路由器和链路,可以有效的把一个ospf 域分割成多个子域 ; 一个区域内部路由器不需要关心外部的网络拓扑;
区域类型
- 骨干区域( Backbone Area )
骨干区域是连接所有其他ospf区域的中央区域,骨干区域通常用Area 0表示,区域间路由必须通过Area 0 进行转发; - 常规区域( Normal Area )
默认情况下,ospf区域被定义为普通区域,除了Area 0,传输区域内路由,区域间路由和外部路由; - 末梢区域( Stub Area )
末梢区域是指只有一个入口和一个出口的区域,网络包中要么是始发地址,要么是终止地址;不允许AS外部LSA在内部进行泛洪的区域,没有Type5,Type4 报文,只通告一条目的地址是0.0.0.0 的默认路由,末梢区域降低了路由器的cpu 和内存占用,提高了性能; - 非完全末梢区域( Not-So-Stubby Area )
允许外部路由通告到ospf自治系统内部,使用Type7 类型报文,只会在NSSA区域进行泛洪;
路由器类型
划分了区域后,路由器也分成了和区域相关的几个类型
内部路由器 (Internal Router)
- 设备的所有接口都属于同一个ospf区域;
区域边界路由器ABR(Area Border Router)
- 同时属于两个以上的区域,但其中一个必须是骨干区域,ABR用来连接骨干区域和非骨干区域;
骨干路由器(Backbone Router)
- 设备至少有一个接口属于骨干区域,所有的ABR和位于Area0的内部设备都是骨干路由器;
自治系统边界路由器ASBR(AS Boundary Router)
与其他AS交换路由信息的设备称为ASBR,ASBR并不一定位于AS的边界,它可能是区域内设备,也可能是ABR。只要一台OSPF设备引入了外部路由的信息,它就成为ASBR;
image.png
DR 和BDR 路由器
DR 和BDR 产生背景
- 在一个多址网络中,再构建邻居关系时,会产生很多不必要的LSA,n 台路由器中,每台路由器会产生 n-1 条LSA信息+1个网络LSA,总共产生n*n 条LSA通告;
-多址网络泛洪扩散混乱,一台路由器向它的邻居路由器发出LSA通告,邻居路由器会继续向它的邻居发出LSA,一个网络中会产生重复的LSA;
-
为了解决该问题,通过DR 和BDR来管理ospf 区域内网络和区域网络的泛洪扩散,当DR失效时,BDR会成为新的DR,继续再网络中传送数据;
29.jpg
DR和BDR选取过程
前提条件
- 每台路由器接口都有一个优先级,默认为1,范围再0-255,优先级为0的不能成为DR 或BDR;
- 当接口再网络中有效时,把DR和BDR的地址设置为(0.0.0.0),等待计时器值设置为路由器无效时间间隔;
选取过程
- 在路由器和邻居路由器之间建立双向通信,检查Hello 数据包的优先级,DR,BDR 的地址,所有路由器宣称自己是DR/BDR路由器;
- 创建一个还没有宣告为DR路由器的路由器子集;
- 在子集中多台邻居路由器,Hello 数据包BDR包含了各自的接口地址,优先级高的将被选择为BDR路由器; 优先级一样情况下, 具有最高路由器 的router-id 的邻居路由器被选择为BDR ;
- 同样,选择DR路由器过程跟BDR 过程一样;
- 如果没有路由器宣告自己是DR,新选取的BDR将作为DR路由器;
- DR和BDR选取后,其他路由器成为Dother,他们只和DR和BDR建立邻居关系;
Hello 包
Hello 包作用
- 发现邻居路由器;
- 在两台路由器成为邻居之前,需要通告两台路由器之间相互认可的几个参数;
- hello 数据包在邻居路由器充当keepalive 角色;
- 确保邻居路由器之间的双向通信;
- 用来在一个广播网络或非广播多路访问(NBMA)的网络上选取指定路由器和备份指定路由器;
广播型网络Hello包交换以及链路状态同步过程
45.jpg邻居关系建立
- RouterA的一个连接到广播类型网络的接口上激活了ospf协议,并发送了一个hello报文(使用组播地址224.0.0.5)。此时,RouterA认为自己是DR路由器(DR=192.168.100.1);
- RouterB启动的较晚,开始处于Down 状态,当收到上一步RouteA发来的Hello包,转为Init 状态,以默认值也在发送Hello报文;
- RouterA收到RouterB回应的Hello报文后,知道RouterB 是自己的邻居,于是在下一次发送Hello 包时携带邻居信息,然后进行发送,这样RouterB就看到了自己的接口信息,将邻居状态机置为2-way状态,双向通信会话成功建立,下一步双方开始发送各自的链路状态数据库;
主/从关系协商、DD报文交换
- RouterB首先发送一个DD报文,宣称自己是Master(MS=1),并规定序列号Seq=X,报文中并不包含LSA的摘要,只是为了协商主从关系。M=1说明这不是最后一个报文;
1.为了提高发送的效率,RouterA和RouterB通过发送DD报文首先了解对端数据库中哪些LSA是需要更新的;为了保证在传输的过程中报文传输的可靠性,在DD报文的发送过程中需要确定双方的主从关系,作为Master的一方定义一个序列号Seq,每发送一个新的DD报文将Seq加一,作为Slave的一方,每次发送DD报文时使用接收到的上一个Master的DD报文中的Seq;
- RouterA在收到RouterB的DD报文后,将RouterB的邻居状态机改为Exstart,并且回应了一个DD报文(该报文中同样不包含LSA的摘要信息);
- 由于RouterB的router-id比较大,所以,最终会选定RouterB为master,并将RouterB的邻居状态机改为Exchange,RouteA 为slave,使用RouterB 的序列号传送新的DD报文,传送LSA的摘要,在报文中RouterA将MS=0,说明自己是Slave,当前M=0,RouterA 发送的最后一个报文;
- RouterB收到报文后,将RouterA的邻居状态机改为Exchange,并发送新的DD报文来描述自己的LSA摘要,此时RouterB将报文的序列号改为Seq=X+1,当前报文中M=0,说明已经是RouteB 发送的最后一个报文了;
LSDB同步(LSA请求、LSA传输、LSA应答)
-
RouterB收到最后一个DD报文后,发现RouterA的数据库中有许多LSA是自己没有的,将邻居状态机改为Loading状态。此时RouterA也收到了RouterB的最后一个DD报文,RouterA的数据库也有一些LSA 是自己没有的,将邻居状态机改为Loading状态;
-
RouterB发送LSR报文向RouterA请求更新LSA。RouterA用LSU报文来回应RouterB的请求。RouterB收到后,发送LSAck报文确认;
- 上述过程持续到RouterA中的LSA与RouterB的LSA完全同步为止,此时RouterA将RouterB的邻居状态机改为Full状态。当路由器交换完DD报文并更新所有的LSA后,此时邻接关系建立完成;ospf 路由依据LSDB 按照SPF算法计算形成;
邻居状态机
- 失效状态(Down):邻居会话的初始状态,用来指明在最近一个RouteDeadInterval 时间内没有收到来自邻居路由器的Hello 数据包;
- 尝试状态(Attempt):仅适用于NBMA网络上的邻居。当 NBMA网
络上具有 DR选 取资格的路由器和其邻居路由器相连的接口开始变为有效 (Active)时转换为Attempt状态;
-初始状态(Init):RouteDeadInterval 时间内收到来自邻居路由器的Hello 数据包;
-双向通信状态(Two-Way):本地路由器在来自邻居由器的Hello数据包中看到了自己的router-id,双向通信建立; - 信息交换初始状态(ExStart): 本地路由器和邻居建立主从关系,确定数据库描述包的序列号,为交换数据库描述包信息左准备,具有最高router-id的路由器选举成为主;
- 信息交换状态(Exchange): 发送完整的DD报文;
-信息加载状态(Loading):本地路由器向邻居发送LSR,请求最新的LSA通告; - 完全邻接状态(Full):每个路由器的LSDB 已经达到一致状态,
ospf 实验
30.jpg说明: AR1-AR3 :area1; AR4-AR5: area2; AR3-AR4:area0;
实验配置
AR1:
[Huawei]router id 5.5.5.5
[Huawei]ospf
[Huawei-ospf-1]area 1
[Huawei-ospf-1-area-0.0.0.1]network 172.16.1.0 0.0.0.255
AR2:
[Huawei]router id 3.3.3.3
[Huawei]ospf
[Huawei-ospf-1]area 1
[Huawei-ospf-1-area-0.0.0.1]network 172.16.1.0 0.0.0.255
[Huawei-ospf-1-area-0.0.0.1]network 192.168.1.0 0.0.0.255
AR3:
[Huawei]router id 1.1.1.1
[Huawei]ospf
[Huawei-ospf-1]area 1
[Huawei-ospf-1-area-0.0.0.1]network 192.168.1.0 0.0.0.255
[Huawei-ospf-1]area 0
[Huawei-ospf-1-area-0.0.0.0]network 192.168.0.0 0.0.0.255
AR4:
[Huawei]router id 2.2.2.2
[Huawei]ospf
[Huawei-ospf-1]area 0
[Huawei-ospf-1-area-0.0.0.0]network 192.168.0.0 0.0.0.255
[Huawei-ospf-1]area 2
[Huawei-ospf-1-area-0.0.0.2]network 192.168.2.0 0.0.0.255
AR5:
[Huawei]router id 4.4.4.4
[Huawei]ospf
[Huawei-ospf-1]area 2
[Huawei-ospf-1-area-0.0.0.2]network 192.168.2.0 0.0.0.255
[Huawei-ospf-1-area-0.0.0.2]network 172.17.1.0 0.0.0.255
AR6:
[Huawei]router id 6.6.6.6
[Huawei]ospf
[Huawei-ospf-1]area 2
[Huawei-ospf-1-area-0.0.0.2]network 172.17.1.0 0.0.0.255
- AR1的LSDB库信息:
- AR1 的路由信息: