OSPF发送不同类型的消息以相互通信以交换LSDB。开放式最短路径优先(OSPF)仅需要几个相对简单的命令即可在中小型网络中发送OSPF LSA。但是,在这些命令后面有一个相当复杂的路由协议,其内部结构可能会对OSPF新手产生威慑作用。
本文讨论了建立邻居列表所需的不同OSPF消息。我们还将讨论DR和BDR的用法以及默认路由在OSPF中的工作方式。
OSPF概述
如果回想一下先前文章中对OSPFv2(OSPF的介绍)所学到的内容,您可能还记得那些大想法遵循逻辑顺序。下图左侧的虚线显示了查看Cisco设备当前配置所需的命令的逐步应用(右侧)。
花一点时间完全理解上图中的步骤。从配置开始,该配置通过使用网络命令在某些接口上启用OSPFv2 。结果,路由器在这些接口上发送和接收OSPF Hello,以希望发现OSPF邻居。
一旦发现潜在的邻居,邻居就会检查彼此的参数,如果邻居参数通过,邻居将彼此的已知LSA相互淹没,从而完成其链接状态数据库(LSDB)。最后,路由器的最短路径优先(SPF)算法计算出到达每个子网的最佳路由,并将这些路由放入IPv4路由表中。
OSPF如何发现邻居并交换LSDB
当点对点链路断开时,OSPF在该链路上不能有任何邻居。当链路出现时,链路末端的路由器会经历几个临时邻居状态,同时执行重要步骤,例如发现邻居的存在,检查参数以查看是否允许它们成为邻居,以及在称为数据库交换的过程中交换其LSA 。
按照图中的步骤,该场景从链路断开开始,因此路由器之间彼此之间并不像OSPF邻居那样了解。结果,它们之间没有邻居的状态(状态)信息。在步骤2,R1发送第一个Hello,因此R2了解R1作为OSPF路由器的存在。此时,R2将R1列为邻居,其过渡状态为Init。
当R2发回Hello时,该过程继续执行步骤3。此消息告诉R1 R2存在,并且它允许R1移至2向状态。在步骤4,R2接收到来自R1的下一个Hello,并且R2也可以进入2路状态。
当路由器从潜在邻居接收到Hello,并且该潜在邻居的参数与本地路由器的参数匹配时,本地路由器会认为它在链路上看到了一个新的合法邻居。通过这些早期步骤,每个路由器都会与其邻居达到2路状态。现在,以下两件事已经发生:
- 路由器从邻居那里收到一个Hello,其中列出了该路由器自己的RID,邻居发现了该ID。
- 路由器已经检查了邻居发出的Hello消息中的所有参数,没有任何问题。路由器现在已准备好成为邻居。
与邻居完全交换OSPF LSA
OSPF邻居状态2路表示路由器可以与邻居交换LSDB。因此,一旦点对点链路上的两个路由器达到2路状态,它们便可以立即进入数据库交换过程。
数据库交换过程可能涉及多个OSPF消息和多个临时邻居状态。本节更关注一些消息以及数据库交换完成后的最终状态。
在两个路由器决定交换数据库之后,它们不只是发送整个数据库的内容。首先,他们在各自的数据库中相互告知链接状态广告(LSA)列表;并非LSA的所有详细信息,仅是一个列表。然后,每个路由器都可以检查它已经拥有的LSA,然后仅向另一个路由器询问尚不知道的LSA。
例如,R1可能向R2发送一个清单,该清单列出了10个LSA(使用OSPF数据库描述或DD数据包)。然后,R2检查其LSDB,并在这10个LSA中找到6个。因此,R2使用链接状态请求数据包(LSR)要求R1发送四个附加LSA。特别是,实际上在邻居之间发送LSA的OSPF消息称为链路状态更新(LSU)数据包。
下图通过示例显示了其中一些术语和过程。
中心显示协议消息,外部项目显示过程中不同点的邻居状态。重点关注两个项目:
- 路由器在LSU数据包内交换LSA。
- 完成后,路由器将达到完整状态,这意味着它们已完全交换了LSDB的内容。
维护邻居和LSDB
一旦邻居达到完整状态,他们就完成了所有初始工作,以在两个邻居之间交换OSPF信息。但是,邻居仍然必须执行一些小任务,以维持邻居关系。
首先,路由器使用Hello消息和两个相关的计时器来监视每个邻居关系。Hello间隔和Dead间隔。路由器将每个Hello间隔向每个邻居发送Hello。每个路由器都希望根据Hello间隔从每个邻居接收到Hello,因此,如果邻居在Dead Interval的长度内保持沉默(默认是Hello间隔的4倍),则丢失Hello意味着邻居失败了。
接下来,当拓扑结构发生变化时,路由器也必须做出反应,并且邻居在该过程中起关键作用。当某些更改时,一个或多个LSA将更改。然后,路由器必须将更改的LSA泛洪到每个邻居,以便邻居可以更改其LSDB。
邻居完成的第三项维护任务是,即使网络完全稳定,也要偶尔重新注入每个LSA。默认情况下,即使没有发生任何变化,每个创建LSA的路由器也有责任每30分钟重新注入LSA 。请注意,每个LSA都基于创建LSA的时间而有一个单独的计时器,因此实际上不可能网络中的所有路由器都可以通过同时淹没LSA来使链路过载。
以下列表总结了这三个维护任务,以方便查看:
- 通过根据Hello Interval发送Hello消息并在Dead Interval到期之前侦听Hello,以维护邻居状态。
- 将所有更改的LSA泛洪到每个邻居。
- 当生存期到期时(默认为30分钟),重新注入未更改的LSA。
在以太网链路上使用指定路由器
OSPF在某些接口上的行为有所不同,特别是比较点对点和以太网链路。特别是,在以太网链路上,OSPF选择同一子网中的路由器之一作为指定路由器(DR)。在数据库交换如何发生方面,DR扮演着关键角色,这与点对点链接的规则不同。
同一子网中具有最高优先级 (介于1到255之间的数字)的路由器将被选为DR。默认情况下,所有路由器上的优先级号均设置为1,但可以配置。如果优先级相同的路由器之间有平局,则将选择具有最高RID的路由器作为DR,而将第二高RID的路由器作为BDR。
以太网链路上的数据库交换过程不会在同一VLAN /子网上的每对路由器之间发生。
而是在DR与其他路由器之间发生,因此DR确保所有其他路由器都获得同一LSA的副本。换句话说,数据库交换根据左图进行。
OSPF使用BDR概念,因为DR对于数据库交换非常重要。BDR监视DR的状态并接管DR的工作失败。在这种情况下,将选择一个新的BDR。
由于DR和BDR都与LAN中的所有其他OSPF路由器进行完整的数据库交换,因此它们与所有邻居都达到完整状态。但是,既不是DR也不是BDR的路由器通过OSPF称为DROthers。这些路由器永远不会达到完整状态,因为它们彼此之间不会交换数据库。DROther路由器以两向状态永久列出一些邻居。他们永远不会进入完整状态。
OSPF默认路由
本文的最后一部分介绍了使用默认IP路由的另一种策略。此处,OSPF路由器会创建一条默认路由并发布它,以便其他路由器动态学习默认路由。
当企业网络已连接到Internet时,使用路由协议通告默认路由的主要目的。作为一种策略,企业公司中的网络工程师使用以下设计目标:
- 所有路由器都了解公司内部子网的特定路由;将数据包转发到这些目标时,不需要默认路由。
- 一台路由器连接到Internet,并且具有指向Internet的默认路由。
- 所有路由器都应动态学习默认路由,该默认路由用作将流量发送到Internet的网关。现在,所有Internet流量都必须转发到该路由。
下图显示了OSPF如何发布默认路由的图示。在这种情况下,公司使用路由器R1连接到ISP。该路由器使用OSPF default-information origin 命令生成默认路由。
在最左侧,三个分支路由器都具有OSPF学习的默认路由,指向R1。R1本身还需要指向ISP路由器的默认路由,以便R1可以将所有Internet绑定流量转发到ISP。