OSPF(Open Shortest Path First开放式最短路径优先)是一个内部网关协议(Interior Gateway Protocol,简称IGP),用于在单一自治系统(autonomous system,AS)内决策路由。
一、OSPF报文格式
OSPF报文主要有5种:
- Hello报文;
- DD (Database Description,数据库描述)报文;
- LSR (LinkState Request,链路状态请求)报文;
- LSU(LinkState Update,链路状态更新)报文;
- LSAck(LinkState Acknowledgment,链路状态应答)报文。
OSPF报文直接封装为IP协议报文,因为OSPF是专为TCP/IP网络而设计的路由协议。
1.1 Hello:邻居的发现、建立、保活
OSPF协议使用一种称之为Hello的报文来建立和维护相邻邻居路由器之间的链接关系。OSPF的这种Hello报文更简单,容量很小,可大大减小网络中的报文传输流量。
Hello报文被周期性(默认为10秒)地发向邻居路由器接口发送,如果在设定时间(默认为40秒,通常至少是Hello包发送时间间接4倍)内没有收到对方OSPF路由器发送来的Hello报文,则本地路由器会认为该对方路由器无效。
1.2 DBD包:数据库描述包 – 数据库目录信息
DD报文是用来描述本地路由器的链路状态数据库(LSDB),在两个OSPF路由器初始化连接时要交换DD报文,进行数据库同步。
在DD报文交换中,一台为Master(主)角色,另一台为Slave(从)角色。Master路由器向从路由器发送它的路由表内容,并规定起始序列号,每发送一个DD报文,序列号加1,Slave则使用Master的序列号进行确定应答。但是显然,主从之间的关系会因每个DD交换的不同而不同。网络中的所有路由器会在不同时刻作用,在这个过程中既可能是主路由器又可能是从路由器。
1.3 LSR:链路状态请求
LSR报文用于请求相邻路由器链路状态数据库中的一部分数据。当两台路由器互相交换完DD报文后,知道对端路由器有哪些LSA是本LSDB所没有的,以及哪些LSA是已经失效的,则需要发送一个LSR报文,向对方请求所需的LSA。
1.4 LSU:链路状态更新—携带各种LSA
LSU报文是应LSR报文的请求,用来向对端路由器发送所需的LSA,内容是多条LSA完整内容的集合,LSU报文内容部分包括此次共发送的LSA数量和每条LSA的完整内容
1.5 LSACK:链路状态确认
LSAck报文是路由器在收到对端发来的LSU报文后所发出的确认应答报文
二、OSPF的三张表
- 邻居列表:列出每台路由器全部已经建立邻接关系的邻居路由器
- 链路状态数据库:列出网络中其他路由器的信息,由此显示了全网的网络拓扑
- 路由表:列出通过SPF算法计算出到达每个相连网络的最佳路
2.1 邻居表
在ospf交互链路状态通告之前,两台直连路由器需建立OSPF邻居关系,当一个接口激活ospf后,该接口周期性的发送hello报文,同时开始侦探hello报文从而发现直连链路上的邻居,当在接口发现邻居,邻居信息会被写入ospf邻居表,接着建立邻接关系。
2.2 LSDB链路状态数据库
运行ospf的路由器在网络中泛洪LSA链路状态通告,将LSA加载进LSDB,LSA有多种类型及用途,但最终都是为了让路由器知晓网络的拓扑结构及网段信息,并计算最短路径树,从而发现各个网段路由。
2.3 路由表
ospf根据lsdb中的数据,运行spf算法将得到一颗以自己为根的、无环的最短路径树,基于这棵树,ospf能够发现到达网络中各个网段的最佳路径,从而得到路由信息将其加载到全局路由表,还要经过比较路由优先级过程。
路由器把收集到的 LSA 存储在链路状态数据库中,然后运行 SPF 算法计算出路由表。链路状态数据库和路由表的本质不同在于:数据库中包含的是完整的链路状态原始数据,而路由表中列出的是到达所有已知目标网络的最短路径的列表。
三、OSPF链路状态公告类型
3.1 OSPF的路由器类型
- 区域边界路由器(ABR):用来连接Area0和其他区域的路由器
- 内部路由器:保存自己区域的链路状态信息
- 自治边界路由器(ASBR):用来连接ospf的AS与外部其他的路由器,也就是说连接不是ospf协议的路由器
路由器收到LSA后的处理过程:
- 如果有该LSA信息,查看序列号;如果序列号相同,忽略这条LSA;如果序列号大于本地的序列号,将其加到数 据库,并进行SPF,更新路由表;如果序列号小于本地的序列号,将一个包含自己的LSA新信息发送给发送方。
- 如果数据库没有该LSA信息,将其加到数据库表,并发送一个ACK返回,并运行SPF,更新路由表。
3.2 LSA 类型
3.2.1 LSA TYPE 1
router LSA由每台路由器为所属的区域产生的LSA,描述本区域路由器链路到该区域的状态和代价。一个边界路由器可能产生多个LSA TYPE1。
3.2.2 LSA TYPE 2
network LSA由DR产生,含有连接某个区域路由器的所有链路状态和代价信息。只有DR可以监测该信息。
3.2.3 LSA TYPE 3
summary LSA由ABR产生,含有ABR与本地内部路由器连接信息,可以描述本区域到主干区域的链路信息。它通常汇总缺省路由而不是传送汇总的OSPF信息给其他网络。
网络摘要LSA,宣告域间路由,能泛洪到整个AS(OSPF域),由ABR产生并发出,每穿越一个ABR其Advertising Router就会变成此ABR的RID。包含本区域中的所有路由信息,包括网络号和掩码。在路由表中用O IA(区域间路由)表示。
3.2.4 LSA TYPE 4
Summary LSA由ABR产生,由主干区域发送到其他ABR, 含有ASBR的链路信息,与LSA TYPE 3的区别在于TYPE 4描述到OSPF网络的外部路由,而TYPE 3则描述区域内路由。
ASBR摘要LSA,配合5类ASBR LSA使用,因为5类LSA宣告的是外部ASBR的RID,而其他区域是无法通过RID到达ASBR所在的区域的。1、2类无法域间传递,3类没有RID,所以只能靠4类LSA服务。
3.2.5 LSA TYPE 5
AS External LSA由ASBR产生,含有关于自治域外的链路信息。除了存根区域和完全存根区域,LSA TYPE 5在整个网络中发送。
3.2.6 LSA TYPE 7
Not-So-Stubby LSA由ASBR产生的关于NSSA的信息。LSA TYPE 7可以转换为LSA TYPE 5。
四、OSPF五大区域
标准区域:标准区域可以接受任何链路更新信息和路由汇总信息。
主干区域:主干区域是连接各个区域的传输网络,其他区域都通过主干区域交换路由信息。主干区域拥有标准区域的所有性质。
存根区域:不接受本地自治系统以外的路由信息,对自治系统以外的目标采用默认路由0.0.0.0。
完全存根区域:不接受自治系统以外的路由信息,也不接受自制系统内其他区域的路由汇总信息,发送到本地区域外的报文使用默认路由0.0.0.0。完全存根区域是Cisco定义的,是非标准的。
不完全存根区域(NSAA):类似于存根区域,但是允许接收以类型7的链路状态公告发送的外部路由信息。
五、OSPF五种网络类型
OSPF链路类型有3种:点到点,广播型,NBMA。在3种链路类型上扩展出5种网络类型:点到点,广播,NBMA,点到多点,虚链路。
5.1 五种类型
点到多:将非广播网络视为一系列点到点链路。路由器自动识别邻接路由器,但不选举dr和bdr,通常用于部分互联网络中。
NBMA(非广播多路访问):网络中允许存在多台Router,物理上链路共享,通过二层虚(VC)建立逻辑上的连接。
点到点:一个网络里仅有2个接口,使用HDLC或PPP封装,不需寻址 (cisco私有)。
广播型:广播型多路访问,目前而言指的就是以太网链路,涉及IP 和Mac,用ARP实现二层和三层映射。 (cisco私有)。
点到多NBMA:开发RFC点到多点模式旨在支持底层的点到多点虚电路,这种VC支持组播和广播。如果没有在VC上启用组播和广播功能,则不能遵循RFC的点到多点模式,因为路由器无法使用组播hello分组动态地发现邻接路由器,在这种情况下,应使用cisco点到多点非广播模式 (cisco私有)
5.2 类型差异
点到多: 是将NBMA视为一系列点到点的集合,通常用于Hub-and-Spoke或者ial-Mesh,接口处于同一IP子网,使用OSPF组播自动发现邻居,不选举DR/BDR,hello时间30S, dead时间120S。
NBMA型: 默认情况下,OSPF不能通过NBMA接口自动与邻居建立邻接关系,是模仿OSPF在广播型链路中运行,通常在Full-Mesh或者Partial-Mesh中使用,如果不是Full-Mesh必须手动选举DR/BDR。路由器接口处于一个IP子网,手动指定邻居,选举DR/BDR,且DR/BDR必须与DRother在VC上直连, hello时间30S,dead时间120S。
点到点:使用OSPF组播手动发现邻居,不知道DR是什么东西,就知道对端是谁,OSPF hello时间30S,dead时间120S。
广播型:选举DR,BDR,自动发现邻居,Hello间隔为10s,失效为40s (对应的,NBMA接口的OSPF Hello和dead间隔分别为30s 和 120s)。
点到多NBMA:不需要选举DR和BDR,单播更新,必须手动指定邻居,hello时间30S,dead时间120S。
六、DR/DBR选举
DR:指的是指定路由器,为了避免路由器之间建立的完全的邻接关系而引起大量的开销,OSPF要求在多路访问的网络中要选举一个DR,每个路由器都要与这个DR路由器建立邻接关系,在这个网络中,每个路由器都要与这个路由器交换路由信息,由这个路由器负责通知其他的路由器,告知整个网络的拓扑。
BDR:作为DR的备份之用,备份指定路由器,在指定路由器失效的情况下,备份路由器代替指定路由器的工作。
OSPF的DR(指定路由器)指的是路由器的一个活动接口,并非整台路由器,为了更好地管理OSPF拓扑的flooding,在多路访问的网络中(如广播网络,像普通的以太网)需要选举出一台DR和一台BDR
1、每个多路访问接口都有一个优先级(0-255) ,优先级为0的路由器不具有选举权利,这个优先级默认为1,优先级越大越优先。通过命令ip ospf priority来修改。
2、hello包里包含优先级字段,还包含了可能成为DR/BDR相关接口的IP地址。
3、当接口在多路访问网络上初次启动时候,它吧DR/BDR设置为0.0.0.0,同时设置等待计时器(wait timer) ,等待计时器等于dead- interval (更改he 10间隔死亡和等待计时器都会相应改变,更改死亡间隔等待计时器改变,但hel lo间隔不变)
4、DR和BDR的选举:
- 邻居表中的邻居2way以后,检查邻居hello中的priority, DR/BDR字段,列出所有可以参加DR/BDR选举的邻居,所有的邻居都宣称自己是DR/BDR (DR/BDR都是自已接口地址)
- 在这个列表中创建一个 没有宣称自己是DR的子集,因为宣称为DR的不能被选举为BDR。
- 在这子集中,先比优先级然后比RID,高的成为BDR。
- 在所有宜称自己的为DR的hello中选举DR,先比优先级再比RID,高的为DR。
- 如果没有人宣称自己为DR那么在步骤3中选举的BDR成为DR。 (稳定后DR/BDR不能抢占)
5、DR和BDR选举需注意的事项:
- 多路访问网络中每个路由器都会与DR和BDR同时形成邻接关系,其他路由器之间只是2WAY关系。DR和BDR之间也形成邻接关系。
- DR和BDR是路由器接口的特性,并不是整个路由器的特性。
- DR和BDR信息被存放在接口数据结构表中。
- DR/BDR不能抢占,也就是在一个多路访问网络中先初始化启动的路由器可能成为DR/BDR
- 邻居表2way后,并不是马上选举DR/BDR而是等待一个定时器(wait time) ,超时后才进行选举。在wait时间内等待其他邻居给我通告DR/BDR信息。Wait时间内就收发he1lo。
七、邻居状态机和几口状态
7.1 邻居状态
当OSPF邻居建立的过程之中,路由器在和邻居达到完全邻接关系之前,要经过几个状态。这些状态在OSPF RFC2328有相关的定义,这些状态分别是Down, Attempt, Init, 2-Way, Exstart, Exchange, Loading和Full。
Down:
- 这是第一个OSPF邻居状态,在这个状态下路由器没有从邻居那收到任何信息(包括hello包),不过在这个状态下,路由器可以主动发出hello包给自己的邻居。
- 当路由器之间是Full状态的时候,如果在RouterDeadInterval时间段内(4倍的默认HelloInterval)没有从邻居收到任何hello包,或者手工配置的邻居信息被移除,那么邻居状态会从Full变为Down.
Attempt:Attempt状态仅仅存在与NBMA网络中手工配置邻居的情况下。在这个状态下,路由器发送单播的hello包给邻居而且在dead interval超时之前没有收到邻居发过来的hello包。
Init:Init状态说明了路由器已经收到了来自邻居发送的hello包,但是hello包中没有包含发送者的RID。当路由器从邻居接受hello包时,封包里面应该包含发送的RID信息,以确保这是一个可认知的hello包。
2-Way:
- 2-Way状态说明了两台路由器之间已经建立了双向的链接,每一个路由器都已经收到了对方的hello包。这个状态发生在路由器收到了一个包含自己Router ID的hello包。在这个状态下,路由器决定是否要去跟邻居建立临接关系。在广播和NBMA网络类型中,一个路由器仅与designated router (DR) 和 backup designated router (BDR)建立Full状态关系,而和其他路由器最终停留在2-way状态。在点对点和电对多点网络类型中,路由器和所有相连接的路由器最终都达到Full状态。
- 在2-Way状态的结束之前,广播网络和NBMA网络类型中的DR和BDR选举出来。
- 注意:在init状态下接受到邻居发来的Database Descriptor (DBD)包也会导致路由器转变成2-way状态。
Exstart:
- 一旦DR和BDR选举出来,真正的链路状态信息交换才会发生在路由器和DR,BDR之间。
- 在Exstart状态下,路由器和它的DR, BDR建立了一种master-slave的关系并且选择一个初始的sequence number来形成临接。拥有更高的Router ID的路由器将会成为master并且开始交换信息,同时master也是唯一一个可以增加sequence number的路由器。需要注意的是,逻辑上可以认为DR/BDR中拥有更高的Router ID的一个可以成为master。但是请记住,DR/BDR的选举可能会因为手工配置了priority而不一样,不仅仅依赖与Router ID。因此有可能DR会在这个状态下充当slave状态。
Exchange:在Exchange状态下,OSPF路由器交换database descriptor (DBD)包。DBD包含了链路状态通告(LSA)头部文件,并且描述了整个链路状态数据库的内容。每一个DBD报文都含有一个sequence number,并且这个号码会每一次被master增加。在Exchange状态下,路由器同时会发送链路状态请求报文(LSR)和链路状态更新报文(LSU)。接收到的DBD报文会和路由器链路状态数据库进行比较以确保是否有任何新的或者更多的链路状态信息是可用的。
Loading:在Loading状态下,发生的是真正的链路状态信息交换。基于DBD报文所提供的信息,路由器会发送链路状态请求报文。邻居会在链路状态更新报文中提供相应的链路状态信息。在临接关系下,如果一个路由器收到了一个过期或者丢失了LSA,它会发送一个LSR请求相应的LSA。所有链路状态更新数据包都会在这个状态下达到同步。
Full:
- 在Full状态下,路由器和其邻居会达到完全临接状态。所有路由器和网络LSA都会交换并且路由器数据库达到同步。
- Full状态是OSPF路由器的一个最常见的状态。如果一个路由器停留在另外一个状态,那么就说明了在路由器建立临接关系的过程中是存在问题的。唯一的例外是2-way状态,是在广播网络中常见的。在广播网络中,邻居之间(除了和DR,BDR之外)会最终处于2-way状态。
7.2 OSPF接口状态机
7.3 OSPF邻居、临接
八、OSPF泛洪
1、 每个LSU和LSAck都可以包含多个LSA, LSA的发送是可靠的,所以必须对每个LSA进行确认,显式确认和隐式确认。
2、 router发送一- 个LSA时,会把这个LSA拷贝放进链路状态重传列表。每隔rxmt interval时间重传一次,直到收到ACK3、
3、延时确认,多个LSA通告可以用一一个LSAck确认。广播链路上来自多个Router的LSA可以通过一. 个组播LSAck确认。
4、 直接确认,立即发送并且单播确认。两种情况产生: 1收到重复的LSA, 2LSA老化时间达到最大生存时间。
5、 序列号,当maxsequencenumber时候, 源路由器扩散这个提前老化LSA, 重新在泛洪一一个initial sequencenumber包
6、 校验和,校验除Age字段的整个包。LSDB中 的LSA每5分钟校验一-次。
7、 老化时间(0-3600S) 当-台路由器想把LSA删除,就会设置LSA最大生存时间。只有源路由器才能将LSA老化。
8、 收到相同的LSA如何判断哪个是最新的?1先比序列号,序列号大的为新。
- 先比序列号,序列号大的为新。
- 序列号相同,比校验和,有最大的无符号校验和的为新
- 校验和相同,比老化时间,LSA有最大生存时间的老化时间它就是最新的LSA
- 如果LSA老化时间的差别多于15m (MaxAgeDiff),那拥有较小老化时间的LSA是最新。
- 如果还无法区分,那么LSA就是相同的。